summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.rst4
-rw-r--r--src/werkzeug/test.py8
-rw-r--r--tests/test_test.py10
3 files changed, 21 insertions, 1 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 3f363c02..3880345b 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -7,6 +7,10 @@ Unreleased
- Add a ``url_scheme`` argument to :meth:`~routing.MapAdapter.build`
to override the bound scheme. :pr:`1721`
+- When passing a ``Headers`` object to a test client method or
+ ``EnvironBuilder``, multiple values for a key are joined into one
+ comma separated value. This matches the HTTP spec on multi-value
+ headers. :issue:`1655`
Version 1.0.1
diff --git a/src/werkzeug/test.py b/src/werkzeug/test.py
index c5ce50a0..dc222075 100644
--- a/src/werkzeug/test.py
+++ b/src/werkzeug/test.py
@@ -10,6 +10,7 @@
"""
import mimetypes
import sys
+from collections import defaultdict
from io import BytesIO
from itertools import chain
from random import random
@@ -740,8 +741,13 @@ class EnvironBuilder(object):
result["CONTENT_LENGTH"] = str(content_length)
headers.set("Content-Length", content_length)
+ combined_headers = defaultdict(list)
+
for key, value in headers.to_wsgi_list():
- result["HTTP_%s" % key.upper().replace("-", "_")] = value
+ combined_headers["HTTP_%s" % key.upper().replace("-", "_")].append(value)
+
+ for key, values in combined_headers.items():
+ result[key] = ", ".join(values)
if self.environ_overrides:
result.update(self.environ_overrides)
diff --git a/tests/test_test.py b/tests/test_test.py
index 26a9b47d..445a0bbc 100644
--- a/tests/test_test.py
+++ b/tests/test_test.py
@@ -20,6 +20,7 @@ from werkzeug._compat import implements_iterator
from werkzeug._compat import iteritems
from werkzeug._compat import to_bytes
from werkzeug.datastructures import FileStorage
+from werkzeug.datastructures import Headers
from werkzeug.datastructures import MultiDict
from werkzeug.formparser import parse_form_data
from werkzeug.test import Client
@@ -224,6 +225,15 @@ def test_environ_builder_headers_content_type():
assert "CONTENT_TYPE" not in env
+def test_envrion_builder_multiple_headers():
+ h = Headers()
+ h.add("FOO", "bar")
+ h.add("FOO", "baz")
+ b = EnvironBuilder(headers=h)
+ env = b.get_environ()
+ assert env["HTTP_FOO"] == "bar, baz"
+
+
def test_environ_builder_paths():
b = EnvironBuilder(path="/foo", base_url="http://example.com/")
strict_eq(b.base_url, "http://example.com/")