summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert JW Regeer <bertjw@regeer.org>2020-01-02 12:36:06 -0800
committerBert JW Regeer <bertjw@regeer.org>2020-01-02 14:49:36 -0800
commit0bf98dadd8cae23830cb365cc6cb9cedd7f98db0 (patch)
tree8b4359e07675e31b745d63a50154c473cd009820
parentddb65b489d01d696afa1695b75fdd5df3e4ffdf8 (diff)
downloadwaitress-0bf98dadd8cae23830cb365cc6cb9cedd7f98db0.tar.gz
Update RFC7230 regex with errata for header field-content
-rw-r--r--waitress/rfc7230.py10
-rw-r--r--waitress/tests/test_parser.py9
2 files changed, 18 insertions, 1 deletions
diff --git a/waitress/rfc7230.py b/waitress/rfc7230.py
index a9f047c..97a90a4 100644
--- a/waitress/rfc7230.py
+++ b/waitress/rfc7230.py
@@ -33,8 +33,14 @@ VCHAR = r"\x21-\x7e"
# field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
# field-vchar = VCHAR / obs-text
+# Errata from: https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4189
+# changes field-content to:
+#
+# field-content = field-vchar [ 1*( SP / HTAB / field-vchar )
+# field-vchar ]
+
FIELD_VCHAR = "[" + VCHAR + OBS_TEXT + "]"
-FIELD_CONTENT = FIELD_VCHAR + "(" + RWS + FIELD_VCHAR + "){0,}"
+FIELD_CONTENT = FIELD_VCHAR + "([ \t" + VCHAR + OBS_TEXT + "]+" + FIELD_VCHAR + "){,1}"
FIELD_VALUE = "(" + FIELD_CONTENT + "){0,}"
HEADER_FIELD = re.compile(
@@ -42,3 +48,5 @@ HEADER_FIELD = re.compile(
"^(?P<name>" + TOKEN + "):" + OWS + "(?P<value>" + FIELD_VALUE + ")" + OWS + "$"
)
)
+
+OWS_STRIP = re.compile(OWS + "(?P<value>.*?)" + OWS)
diff --git a/waitress/tests/test_parser.py b/waitress/tests/test_parser.py
index 5373fd5..71703e2 100644
--- a/waitress/tests/test_parser.py
+++ b/waitress/tests/test_parser.py
@@ -423,6 +423,15 @@ class TestHTTPRequestParser(unittest.TestCase):
self.assertIn("FOO", self.parser.headers)
self.assertEqual(self.parser.headers["FOO"], "bar, whatever, more, please, yes")
+ def test_parse_header_multiple_values_extra_space(self):
+ # Tests errata from: https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4189
+ from waitress.parser import ParsingError
+
+ data = b"GET /foobar HTTP/1.1\r\nfoo: abrowser/0.001 (C O M M E N T)\r\n"
+ self.parser.parse_header(data)
+
+ self.assertIn("FOO", self.parser.headers)
+ self.assertEqual(self.parser.headers["FOO"], "abrowser/0.001 (C O M M E N T)")
class Test_split_uri(unittest.TestCase):