diff options
author | David Lord <davidism@gmail.com> | 2023-04-27 15:11:11 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-27 15:11:11 -0700 |
commit | d34dc8557d5b2e7624c625a30dd5a9bbedf93f93 (patch) | |
tree | 50416194a83fef1ab99436f22139cc235fc8ca03 | |
parent | d128daa1874c460b919ebef540365edbdfddc07d (diff) | |
parent | 9c0fef4eae5f646a5598cc616b892611d500e089 (diff) | |
download | werkzeug-d34dc8557d5b2e7624c625a30dd5a9bbedf93f93.tar.gz |
test client parses set-cookie more accurately (#2670)
-rw-r--r-- | CHANGES.rst | 2 | ||||
-rw-r--r-- | src/werkzeug/test.py | 24 |
2 files changed, 16 insertions, 10 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index a0571311..cc01125a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,8 @@ Version 2.3.2 Unreleased +- Parse the cookie ``Expires`` attribute correctly in the test client. :issue:`2669` + Version 2.3.1 ------------- diff --git a/src/werkzeug/test.py b/src/werkzeug/test.py index 23bc6550..0f61d0ca 100644 --- a/src/werkzeug/test.py +++ b/src/werkzeug/test.py @@ -31,7 +31,6 @@ from .http import dump_cookie from .http import dump_options_header from .http import parse_cookie from .http import parse_date -from .http import parse_dict_header from .http import parse_options_header from .sansio.multipart import Data from .sansio.multipart import Epilogue @@ -1509,22 +1508,27 @@ class Cookie: @classmethod def _from_response_header(cls, server_name: str, header: str) -> te.Self: header, _, parameters_str = header.partition(";") - parameters = parse_dict_header(",".join(parameters_str.split(";"))) key, _, value = header.partition("=") decoded_key, decoded_value = next(parse_cookie(header).items()) + params = {} + + for item in parameters_str.split(";"): + k, sep, v = item.partition("=") + params[k.strip()] = v.strip() if sep else None + return cls( key=key.strip(), value=value.strip(), decoded_key=decoded_key, decoded_value=decoded_value, - expires=parse_date(parameters.get("Expires")), - max_age=int(parameters["Max-Age"]) if "Max-Age" in parameters else None, - domain=parameters.get("Domain", server_name), - origin_only="Domain" not in parameters, - path=parameters.get("Path", "/"), - secure="Secure" in parameters, - http_only="HttpOnly" in parameters, - same_site=parameters.get("SameSite"), + expires=parse_date(params.get("Expires")), + max_age=int(params["Max-Age"] or 0) if "Max-Age" in params else None, + domain=params.get("Domain", server_name) or server_name, + origin_only="Domain" not in params, + path=params.get("Path", "/") or "/", + secure="Secure" in params, + http_only="HttpOnly" in params, + same_site=params.get("SameSite"), ) @property |