diff --git a/httpbin/core.py b/httpbin/core.py index 2e8774b..79719dd 100644 --- a/httpbin/core.py +++ b/httpbin/core.py @@ -16,7 +16,7 @@ import random import base64 from flask import Flask, Response, request, render_template, redirect, jsonify, make_response -from werkzeug.datastructures import WWWAuthenticate +from werkzeug.datastructures import WWWAuthenticate, MultiDict from werkzeug.http import http_date from werkzeug.wrappers import BaseResponse from six.moves import range as xrange @@ -267,14 +267,20 @@ def view_status_code(codes): @app.route('/response-headers') def response_headers(): """Returns a set of response headers from the query string """ - headers = CaseInsensitiveDict(request.args.items()) - response = jsonify(headers.items()) + headers = MultiDict(request.args.items(multi=True)) + response = jsonify(headers.lists()) while True: content_len_shown = response.headers['Content-Length'] - response = jsonify(response.headers.items()) - for key, value in headers.items(): - response.headers[key] = value + d = {} + for key in response.headers.keys(): + value = response.headers.get_all(key) + if len(value) == 1: + value = value[0] + d[key] = value + response = jsonify(d) + for key, value in headers.items(multi=True): + response.headers.add(key, value) if response.headers['Content-Length'] == content_len_shown: break return response diff --git a/test_httpbin.py b/test_httpbin.py index 8af40d8..9adc7dd 100755 --- a/test_httpbin.py +++ b/test_httpbin.py @@ -24,6 +24,18 @@ class HttpbinTestCase(unittest.TestCase): httpbin.app.debug = True self.app = httpbin.app.test_client() + def test_response_headers_simple(self): + response = self.app.get('/response-headers?animal=dog') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.headers.get_all('animal'), ['dog']) + assert json.loads(response.data.decode('utf-8'))['animal'] == 'dog' + + def test_response_headers_multi(self): + response = self.app.get('/response-headers?animal=dog&animal=cat') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.headers.get_all('animal'), ['dog', 'cat']) + assert json.loads(response.data.decode('utf-8'))['animal'] == ['dog', 'cat'] + def test_base64(self): greeting = u'Здравствуй, мир!' b64_encoded = _string_to_base64(greeting)