def process_urlencoded(entity):
    """Read application/x-www-form-urlencoded data into entity.params."""
    qs = entity.fp.read()
    for charset in entity.attempt_charsets:
        try:
            params = {}
            for aparam in qs.split(b'&'):
                for pair in aparam.split(b';'):
                    if not pair:
                        continue

                    atoms = pair.split(b'=', 1)
                    if len(atoms) == 1:
                        atoms.append(b'')

                    key = unquote_plus(atoms[0]).decode(charset)
                    value = unquote_plus(atoms[1]).decode(charset)

                    if key in params:
                        if not isinstance(params[key], list):
                            params[key] = [params[key]]
                        params[key].append(value)
                    else:
                        params[key] = value
        except UnicodeDecodeError:
            pass
        else:
            entity.charset = charset
            break
    else:
        raise cherrypy.HTTPError(
            400,
            'The request entity could not be decoded. The following '
            'charsets were attempted: %s' % repr(entity.attempt_charsets),
        )

    # Now that all values have been successfully parsed and decoded,
    # apply them to the entity.params dict.
    for key, value in params.items():
        if key in entity.params:
            if not isinstance(entity.params[key], list):
                entity.params[key] = [entity.params[key]]
            entity.params[key].append(value)
        else:
            entity.params[key] = value
Read application/x-www-form-urlencoded data into entity.params.
cherrypy/_cpreqbody.py