From e223e302af299181c5cf91480c8cc3a5efcf3469 Mon Sep 17 00:00:00 2001 From: Benoit Chesneau Date: Sun, 19 Apr 2026 14:02:58 +0200 Subject: [PATCH] test: codify field-syntax cases (RFC 9110 section 5.5 and 5.6.2) --- .../rfc9110_field_name_special_chars_01.http | 4 ++++ .../rfc9110_field_name_special_chars_01.py | 16 ++++++++++++++++ .../valid/rfc9110_field_value_htab_trim_01.http | 4 ++++ .../valid/rfc9110_field_value_htab_trim_01.py | 16 ++++++++++++++++ .../valid/rfc9110_field_value_obs_text_01.http | 4 ++++ .../valid/rfc9110_field_value_obs_text_01.py | 17 +++++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 tests/requests/valid/rfc9110_field_name_special_chars_01.http create mode 100644 tests/requests/valid/rfc9110_field_name_special_chars_01.py create mode 100644 tests/requests/valid/rfc9110_field_value_htab_trim_01.http create mode 100644 tests/requests/valid/rfc9110_field_value_htab_trim_01.py create mode 100644 tests/requests/valid/rfc9110_field_value_obs_text_01.http create mode 100644 tests/requests/valid/rfc9110_field_value_obs_text_01.py diff --git a/tests/requests/valid/rfc9110_field_name_special_chars_01.http b/tests/requests/valid/rfc9110_field_name_special_chars_01.http new file mode 100644 index 00000000..ece0bb97 --- /dev/null +++ b/tests/requests/valid/rfc9110_field_name_special_chars_01.http @@ -0,0 +1,4 @@ +GET /foo HTTP/1.1\r\n +Host: example.com\r\n +X.Custom|Pipe: ok\r\n +\r\n diff --git a/tests/requests/valid/rfc9110_field_name_special_chars_01.py b/tests/requests/valid/rfc9110_field_name_special_chars_01.py new file mode 100644 index 00000000..16fb0e01 --- /dev/null +++ b/tests/requests/valid/rfc9110_field_name_special_chars_01.py @@ -0,0 +1,16 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# RFC 9110 section 5.6.2: token = 1*tchar; tchar includes !#$%&'*+-.^_`|~ +# and alphanumerics. Dot, pipe, and other specials are legal in field-names. +request = { + "method": "GET", + "uri": uri("/foo"), + "version": (1, 1), + "headers": [ + ("HOST", "example.com"), + ("X.CUSTOM|PIPE", "ok"), + ], + "body": b"", +} diff --git a/tests/requests/valid/rfc9110_field_value_htab_trim_01.http b/tests/requests/valid/rfc9110_field_value_htab_trim_01.http new file mode 100644 index 00000000..ce4c30c3 --- /dev/null +++ b/tests/requests/valid/rfc9110_field_value_htab_trim_01.http @@ -0,0 +1,4 @@ +GET /foo HTTP/1.1\r\n +Host: example.com\r\n +X-Value:\tabc\t\r\n +\r\n diff --git a/tests/requests/valid/rfc9110_field_value_htab_trim_01.py b/tests/requests/valid/rfc9110_field_value_htab_trim_01.py new file mode 100644 index 00000000..cf4102e5 --- /dev/null +++ b/tests/requests/valid/rfc9110_field_value_htab_trim_01.py @@ -0,0 +1,16 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# RFC 9110 section 5.5: OWS around field-value is optional and not part +# of the value; leading and trailing HTAB must be stripped. +request = { + "method": "GET", + "uri": uri("/foo"), + "version": (1, 1), + "headers": [ + ("HOST", "example.com"), + ("X-VALUE", "abc"), + ], + "body": b"", +} diff --git a/tests/requests/valid/rfc9110_field_value_obs_text_01.http b/tests/requests/valid/rfc9110_field_value_obs_text_01.http new file mode 100644 index 00000000..1da8678c --- /dev/null +++ b/tests/requests/valid/rfc9110_field_value_obs_text_01.http @@ -0,0 +1,4 @@ +GET /foo HTTP/1.1\r\n +Host: example.com\r\n +X-Value: caf\xc3\xa9\r\n +\r\n diff --git a/tests/requests/valid/rfc9110_field_value_obs_text_01.py b/tests/requests/valid/rfc9110_field_value_obs_text_01.py new file mode 100644 index 00000000..70f23eec --- /dev/null +++ b/tests/requests/valid/rfc9110_field_value_obs_text_01.py @@ -0,0 +1,17 @@ +# +# This file is part of gunicorn released under the MIT license. +# See the NOTICE for more information. + +# RFC 9110 section 5.5: field-vchar = VCHAR / obs-text (0x80-0xFF). +# Value carries two obs-text bytes 0xC3 0xA9 (UTF-8 "e"-acute), stored +# as latin-1 per the WSGI environ convention. +request = { + "method": "GET", + "uri": uri("/foo"), + "version": (1, 1), + "headers": [ + ("HOST", "example.com"), + ("X-VALUE", "caf\u00c3\u00a9"), + ], + "body": b"", +}