summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--paste/fixture.py3
-rw-r--r--paste/httpexceptions.py6
-rw-r--r--paste/request.py10
-rw-r--r--paste/url.py4
-rw-r--r--paste/urlmap.py6
-rw-r--r--paste/wsgiwrappers.py1
-rw-r--r--tests/test_wsgiwrappers.py5
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')))