diff options
-rw-r--r-- | paste/fixture.py | 3 | ||||
-rw-r--r-- | paste/httpexceptions.py | 6 | ||||
-rw-r--r-- | paste/request.py | 10 | ||||
-rw-r--r-- | paste/url.py | 4 | ||||
-rw-r--r-- | paste/urlmap.py | 6 | ||||
-rw-r--r-- | paste/wsgiwrappers.py | 1 | ||||
-rw-r--r-- | tests/test_wsgiwrappers.py | 5 |
7 files changed, 20 insertions, 15 deletions
diff --git a/paste/fixture.py b/paste/fixture.py index f851eee..df1c75d 100644 --- a/paste/fixture.py +++ b/paste/fixture.py @@ -15,7 +15,6 @@ import sys import random import mimetypes import time -import cgi import os import shutil import smtplib @@ -230,7 +229,7 @@ class TestApp(object): if six.PY3: params = params.encode('utf8') if upload_files: - params = cgi.parse_qsl(params, keep_blank_values=True) + params = urlparse.parse_qsl(params, keep_blank_values=True) content_type, params = self.encode_multipart( params, upload_files) environ['CONTENT_TYPE'] = content_type diff --git a/paste/httpexceptions.py b/paste/httpexceptions.py index 6b8d5c5..0b68c2d 100644 --- a/paste/httpexceptions.py +++ b/paste/httpexceptions.py @@ -58,6 +58,7 @@ Exception * 415 - HTTPUnsupportedMediaType * 416 - HTTPRequestRangeNotSatisfiable * 417 - HTTPExpectationFailed + * 429 - HTTPTooManyRequests HTTPServerError * 500 - HTTPInternalServerError * 501 - HTTPNotImplemented @@ -526,6 +527,11 @@ class HTTPExpectationFailed(HTTPClientError): title = 'Expectation Failed' explanation = ('Expectation failed.') +class HTTPTooManyRequests(HTTPClientError): + code = 429 + title = 'Too Many Requests' + explanation = ('The client has sent too many requests to the server.') + # # 5xx Server Error # diff --git a/paste/request.py b/paste/request.py index 2e7280b..f0d91c1 100644 --- a/paste/request.py +++ b/paste/request.py @@ -19,7 +19,7 @@ environment to solve common requirements. """ import cgi from six.moves.urllib import parse as urlparse -from six.moves.urllib.parse import quote +from six.moves.urllib.parse import quote, parse_qsl try: # Python 3 from http.cookies import SimpleCookie, CookieError @@ -103,8 +103,8 @@ def parse_querystring(environ): parsed, check_source = environ['paste.parsed_querystring'] if check_source == source: return parsed - parsed = cgi.parse_qsl(source, keep_blank_values=True, - strict_parsing=False) + parsed = parse_qsl(source, keep_blank_values=True, + strict_parsing=False) environ['paste.parsed_querystring'] = (parsed, source) return parsed @@ -134,8 +134,8 @@ def parse_dict_querystring(environ): parsed, check_source = environ['paste.parsed_dict_querystring'] if check_source == source: return parsed - parsed = cgi.parse_qsl(source, keep_blank_values=True, - strict_parsing=False) + parsed = parse_qsl(source, keep_blank_values=True, + strict_parsing=False) multi = MultiDict(parsed) environ['paste.parsed_dict_querystring'] = (multi, source) return multi diff --git a/paste/url.py b/paste/url.py index 7273d51..fb08d6d 100644 --- a/paste/url.py +++ b/paste/url.py @@ -4,7 +4,7 @@ """ This module implements a class for handling URLs. """ -from six.moves.urllib.parse import quote, unquote, urlencode +from six.moves.urllib.parse import parse_qsl, quote, unquote, urlencode import cgi from paste import request import six @@ -83,7 +83,7 @@ class URLResource(object): if querystring is None: vars = request.parse_querystring(environ) else: - vars = cgi.parse_qsl( + vars = parse_qsl( querystring, keep_blank_values=True, strict_parsing=False) diff --git a/paste/urlmap.py b/paste/urlmap.py index 59b0336..f721f2d 100644 --- a/paste/urlmap.py +++ b/paste/urlmap.py @@ -114,9 +114,9 @@ class URLMap(DictMixin): ',\n '.join(map(repr, matches))) else: extra = '' - extra += '\nSCRIPT_NAME: %r' % environ.get('SCRIPT_NAME') - extra += '\nPATH_INFO: %r' % environ.get('PATH_INFO') - extra += '\nHTTP_HOST: %r' % environ.get('HTTP_HOST') + extra += '\nSCRIPT_NAME: %r' % cgi.escape(environ.get('SCRIPT_NAME')) + extra += '\nPATH_INFO: %r' % cgi.escape(environ.get('PATH_INFO')) + extra += '\nHTTP_HOST: %r' % cgi.escape(environ.get('HTTP_HOST')) app = httpexceptions.HTTPNotFound( environ['PATH_INFO'], comment=cgi.escape(extra)).wsgi_application diff --git a/paste/wsgiwrappers.py b/paste/wsgiwrappers.py index 1cbae4f..7b8f6de 100644 --- a/paste/wsgiwrappers.py +++ b/paste/wsgiwrappers.py @@ -579,6 +579,7 @@ STATUS_CODE_TEXT = { 415: 'UNSUPPORTED MEDIA TYPE', 416: 'REQUESTED RANGE NOT SATISFIABLE', 417: 'EXPECTATION FAILED', + 429: 'TOO MANY REQUESTS', 500: 'INTERNAL SERVER ERROR', 501: 'NOT IMPLEMENTED', 502: 'BAD GATEWAY', diff --git a/tests/test_wsgiwrappers.py b/tests/test_wsgiwrappers.py index 833b4f2..8719693 100644 --- a/tests/test_wsgiwrappers.py +++ b/tests/test_wsgiwrappers.py @@ -36,9 +36,8 @@ def valid_name(name, encoding=no_encoding, post=False): def test_wsgirequest_charset(): # Jose, 'José' - app = TestApp(AssertApp(assertfunc=valid_name(u'José', - encoding='iso-8859-1'))) - res = app.get('/?name=Jos%E9') + app = TestApp(AssertApp(assertfunc=valid_name(u'José', encoding='UTF-8'))) + res = app.get('/?name=Jos%C3%A9') # Tanaka, '田中' app = TestApp(AssertApp(assertfunc=valid_name(u'田中', encoding='UTF-8'))) |