URL decodes given value >>> urldecode('AND%201%3E%282%2B3%29%23', convall=True) == 'AND 1>(2+3)#' True >>> urldecode('AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#' True >>> urldecode(b'AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#' True
(value, encoding=None, unsafe="%%?&=;+%s" % CUSTOM_INJECTION_MARK_CHAR, convall=False, spaceplus=True)
| 2943 | return retVal |
| 2944 | |
| 2945 | def urldecode(value, encoding=None, unsafe="%%?&=;+%s" % CUSTOM_INJECTION_MARK_CHAR, convall=False, spaceplus=True): |
| 2946 | """ |
| 2947 | URL decodes given value |
| 2948 | |
| 2949 | >>> urldecode('AND%201%3E%282%2B3%29%23', convall=True) == 'AND 1>(2+3)#' |
| 2950 | True |
| 2951 | >>> urldecode('AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#' |
| 2952 | True |
| 2953 | >>> urldecode(b'AND%201%3E%282%2B3%29%23', convall=False) == 'AND 1>(2%2B3)#' |
| 2954 | True |
| 2955 | """ |
| 2956 | |
| 2957 | result = value |
| 2958 | |
| 2959 | if value: |
| 2960 | value = getUnicode(value) |
| 2961 | |
| 2962 | if convall: |
| 2963 | result = _urllib.parse.unquote_plus(value) if spaceplus else _urllib.parse.unquote(value) |
| 2964 | else: |
| 2965 | result = value |
| 2966 | charset = set(string.printable) - set(unsafe) |
| 2967 | |
| 2968 | def _(match): |
| 2969 | char = decodeHex(match.group(1), binary=False) |
| 2970 | return char if char in charset else match.group(0) |
| 2971 | |
| 2972 | if spaceplus: |
| 2973 | result = result.replace('+', ' ') # plus sign has a special meaning in URL encoded data (hence the usage of _urllib.parse.unquote_plus in convall case) |
| 2974 | |
| 2975 | result = re.sub(r"%([0-9a-fA-F]{2})", _, result or "") |
| 2976 | |
| 2977 | result = getUnicode(result, encoding or UNICODE_ENCODING) |
| 2978 | |
| 2979 | return result |
| 2980 | |
| 2981 | def urlencode(value, safe="%&=-_", convall=False, limit=False, spaceplus=False): |
| 2982 | """ |
no test coverage detected
searching dependent graphs…