summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZhidao HONG <z.hong@f5.com>2022-09-19 02:45:44 +0800
committerZhidao HONG <z.hong@f5.com>2022-09-19 02:45:44 +0800
commit76df62a6236eba2ae1ea7ffe7b9599418b044a01 (patch)
tree4bf29cbfbdb838a74cb798cc9daecc7f36ac2b5f
parent5354e05b2f09cbcc6dfeb0242f047ce169b0634b (diff)
downloadunit-76df62a6236eba2ae1ea7ffe7b9599418b044a01.tar.gz
unit-76df62a6236eba2ae1ea7ffe7b9599418b044a01.tar.bz2
HTTP: fixed cookie parsing.
The fixing supports the cookie value with the '=' character. This is related to #756 PR on Github. Thanks to changxiaocui.
-rw-r--r--docs/changes.xml6
-rw-r--r--src/nxt_http_request.c7
-rw-r--r--test/test_routing.py14
3 files changed, 22 insertions, 5 deletions
diff --git a/docs/changes.xml b/docs/changes.xml
index 1534a6dc..7c0712f3 100644
--- a/docs/changes.xml
+++ b/docs/changes.xml
@@ -31,6 +31,12 @@ NGINX Unit updated to 1.29.0.
date="" time=""
packager="Nginx Packaging &lt;nginx-packaging@f5.com&gt;">
+<change type="bugfix">
+<para>
+fix HTTP cookie parsing when the value contains an equals sign.
+</para>
+</change>
+
</changes>
diff --git a/src/nxt_http_request.c b/src/nxt_http_request.c
index 943ad82d..7a790f73 100644
--- a/src/nxt_http_request.c
+++ b/src/nxt_http_request.c
@@ -1035,14 +1035,11 @@ nxt_http_cookie_parse(nxt_array_t *cookies, u_char *start, const u_char *end)
for (p = start; p < end; p++) {
c = *p;
- if (c == '=') {
+ if (c == '=' && name == NULL) {
while (start[0] == ' ') { start++; }
name_length = p - start;
-
- if (name_length != 0) {
- name = start;
- }
+ name = start;
start = p + 1;
diff --git a/test/test_routing.py b/test/test_routing.py
index 3649b37c..0d7b908c 100644
--- a/test/test_routing.py
+++ b/test/test_routing.py
@@ -1401,6 +1401,20 @@ class TestRouting(TestApplicationPython):
self.route_match_invalid({"cookies": ["var"]})
self.route_match_invalid({"cookies": [{"foo": {}}]})
+ def test_routes_match_cookies_complex(self):
+ self.route_match({"cookies": {"foo": "bar=baz"}})
+ self.cookie('foo=bar=baz', 200)
+ self.cookie(' foo=bar=baz ', 200)
+ self.cookie('=foo=bar=baz', 404)
+
+ self.route_match({"cookies": {"foo": ""}})
+ self.cookie('foo=', 200)
+ self.cookie('foo=;', 200)
+ self.cookie(' foo=;', 200)
+ self.cookie('foo', 404)
+ self.cookie('', 404)
+ self.cookie('=', 404)
+
def test_routes_match_cookies_multiple(self):
self.route_match({"cookies": {"foo": "bar", "blah": "blah"}})