Merge "bufferedhttp: ensure query params are properly quoted"
This commit is contained in:
commit
2abdd2d70d
|
@ -34,7 +34,7 @@ import socket
|
|||
import eventlet
|
||||
from eventlet.green.httplib import CONTINUE, HTTPConnection, HTTPMessage, \
|
||||
HTTPResponse, HTTPSConnection, _UNKNOWN
|
||||
from six.moves.urllib.parse import quote
|
||||
from six.moves.urllib.parse import quote, parse_qsl, urlencode
|
||||
import six
|
||||
|
||||
if six.PY2:
|
||||
|
@ -292,6 +292,15 @@ def http_connect_raw(ipaddr, port, method, path, headers=None,
|
|||
else:
|
||||
conn = BufferedHTTPConnection('%s:%s' % (ipaddr, port))
|
||||
if query_string:
|
||||
# Round trip to ensure proper quoting
|
||||
if six.PY2:
|
||||
query_string = urlencode(parse_qsl(
|
||||
query_string, keep_blank_values=True))
|
||||
else:
|
||||
query_string = urlencode(
|
||||
parse_qsl(query_string, keep_blank_values=True,
|
||||
encoding='latin1'),
|
||||
encoding='latin1')
|
||||
path += '?' + query_string
|
||||
conn.path = path
|
||||
conn.putrequest(method, path, skip_host=(headers and 'Host' in headers))
|
||||
|
|
|
@ -56,7 +56,8 @@ class TestBufferedHTTP(unittest.TestCase):
|
|||
b'RESPONSE')
|
||||
fp.flush()
|
||||
line = fp.readline()
|
||||
path = b'/dev/' + expected_par + b'/path/..%25/?omg&no=%7f'
|
||||
path = (b'/dev/' + expected_par +
|
||||
b'/path/..%25/?omg=&no=%7F&%FF=%FF&no=%25ff')
|
||||
self.assertEqual(
|
||||
line,
|
||||
b'PUT ' + path + b' HTTP/1.1\r\n')
|
||||
|
@ -83,7 +84,7 @@ class TestBufferedHTTP(unittest.TestCase):
|
|||
'PUT', '/path/..%/', {
|
||||
'content-length': 7,
|
||||
'x-header': 'value'},
|
||||
query_string='omg&no=%7f')
|
||||
query_string='omg&no=%7f&\xff=%ff&no=%25ff')
|
||||
conn.send(b'REQUEST\r\n')
|
||||
self.assertTrue(conn.sock.getsockopt(socket.IPPROTO_TCP,
|
||||
socket.TCP_NODELAY))
|
||||
|
|
Loading…
Reference in New Issue