From 4c04469cfb22c31871b33c0344c73f636109fda9 Mon Sep 17 00:00:00 2001 From: Piotr Jurkiewicz Date: Thu, 14 Apr 2016 18:10:50 +0200 Subject: [PATCH 1/4] Change _store of CaseInsensitiveDict to OrderedDict --- requests/structures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requests/structures.py b/requests/structures.py index 3e5f2faa..edbe3f5f 100644 --- a/requests/structures.py +++ b/requests/structures.py @@ -40,7 +40,7 @@ class CaseInsensitiveDict(collections.MutableMapping): """ def __init__(self, data=None, **kwargs): - self._store = dict() + self._store = collections.OrderedDict() if data is None: data = {} self.update(data, **kwargs) From 4f5741e1ffd8bef185582bcba6145493d4abab15 Mon Sep 17 00:00:00 2001 From: Piotr Jurkiewicz Date: Fri, 15 Apr 2016 00:35:57 +0200 Subject: [PATCH 2/4] Add test of headers order preservation --- tests/test_requests.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test_requests.py b/tests/test_requests.py index 04a27a44..c112077f 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -315,6 +315,26 @@ class TestRequests: prep = ses.prepare_request(req) assert 'Accept-Encoding' not in prep.headers + def test_headers_preserve_order(self, httpbin): + """Preserve order when headers provided as OrderedDict.""" + ses = requests.Session() + ses.headers = collections.OrderedDict() + ses.headers['Accept-Encoding'] = 'identity' + ses.headers['First'] = '1' + ses.headers['Second'] = '2' + headers = collections.OrderedDict([('Third', '3'), ('Fourth', '4')]) + headers['Fifth'] = '5' + headers['Second'] = '222' + req = requests.Request('GET', httpbin('get'), headers = headers) + prep = ses.prepare_request(req) + items = prep.headers.items() + assert items[0] == ('Accept-Encoding', 'identity') + assert items[1] == ('First', '1') + assert items[2] == ('Second', '222') + assert items[3] == ('Third', '3') + assert items[4] == ('Fourth', '4') + assert items[5] == ('Fifth', '5') + @pytest.mark.parametrize('key', ('User-agent', 'user-agent')) def test_user_agent_transfers(self, httpbin, key): From c8a0fc6aa2131c9bfa7ac3903c01d522fca3d346 Mon Sep 17 00:00:00 2001 From: Piotr Jurkiewicz Date: Fri, 15 Apr 2016 04:43:53 +0200 Subject: [PATCH 3/4] Use OrderedDict from .compat module --- requests/structures.py | 4 +++- tests/test_requests.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/requests/structures.py b/requests/structures.py index edbe3f5f..991056e4 100644 --- a/requests/structures.py +++ b/requests/structures.py @@ -10,6 +10,8 @@ Data structures that power Requests. import collections +from .compat import OrderedDict + class CaseInsensitiveDict(collections.MutableMapping): """ @@ -40,7 +42,7 @@ class CaseInsensitiveDict(collections.MutableMapping): """ def __init__(self, data=None, **kwargs): - self._store = collections.OrderedDict() + self._store = OrderedDict() if data is None: data = {} self.update(data, **kwargs) diff --git a/tests/test_requests.py b/tests/test_requests.py index c112077f..6937e049 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -318,11 +318,11 @@ class TestRequests: def test_headers_preserve_order(self, httpbin): """Preserve order when headers provided as OrderedDict.""" ses = requests.Session() - ses.headers = collections.OrderedDict() + ses.headers = OrderedDict() ses.headers['Accept-Encoding'] = 'identity' ses.headers['First'] = '1' ses.headers['Second'] = '2' - headers = collections.OrderedDict([('Third', '3'), ('Fourth', '4')]) + headers = OrderedDict([('Third', '3'), ('Fourth', '4')]) headers['Fifth'] = '5' headers['Second'] = '222' req = requests.Request('GET', httpbin('get'), headers = headers) From b1a7dcd79915ec7a58043031da432b5841d4d8ec Mon Sep 17 00:00:00 2001 From: Piotr Jurkiewicz Date: Sat, 16 Apr 2016 22:21:10 +0200 Subject: [PATCH 4/4] Fix test_headers_preserve_order --- tests/test_requests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index 6937e049..6ed43249 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -325,9 +325,9 @@ class TestRequests: headers = OrderedDict([('Third', '3'), ('Fourth', '4')]) headers['Fifth'] = '5' headers['Second'] = '222' - req = requests.Request('GET', httpbin('get'), headers = headers) + req = requests.Request('GET', httpbin('get'), headers=headers) prep = ses.prepare_request(req) - items = prep.headers.items() + items = list(prep.headers.items()) assert items[0] == ('Accept-Encoding', 'identity') assert items[1] == ('First', '1') assert items[2] == ('Second', '222')