-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
Description
There is no way to put cookies into a standard cookiejar.
Expected Result
Cookies can be stored in LWP format
Actual Result
Cookies are provided in multiple unusable formats, no way to store to a standard jar.
Reproduction Steps
Make a request that returns multiple cookies. (This is not verified, I do not know how to access actual headers from a Response object.)
r = requests.request(method, self.url + path, *args, **kwargs)
if hasattr(self, 'cookiejar'):
if 'Set-Cookie' in r.headers or 'Set-Cookie2' in r.headers:
def get_all(self, name, default=[]):
return [self.get(name, default)] # it's a dictionary, can only have one match anyway
if not hasattr(r.headers, 'get_all'):
r.headers.get_all = types.MethodType(get_all, r.headers)
self.cookiejar.extract_cookies(requests.cookies.MockResponse(r.headers),
requests.cookies.MockRequest(r.request))
Response has a cookies property but this returns a custom cookie jar which cannot be saved in LWP format.
The standard LWPCookieJar provides interface for iterating cookies but not storing cookies, only for extracting cookies from headers.
The Response object has a headers property but this is a dictionary, and cannot store multiple headers of the same name correctly. There is nothing stopping the server from sending multiple Set-Cookie headers, the standard only requests that no two cookies with the same name be sent. When it does the Response headers property has a mangled Set-Cookie header, and it cannot be parsed by LWPCookieJar. Response does not provide access to unmangled headers in any way I can find in the documentation.
System Information
Linux, python 3.6~3.11
{
"chardet": {
"version": null
},
"charset_normalizer": {
"version": "3.1.0"
},
"cryptography": {
"version": "41.0.3"
},
"idna": {
"version": "3.4"
},
"implementation": {
"name": "CPython",
"version": "3.11.13"
},
"platform": {
"release": "6.4.0-150600.23.47-default",
"system": "Linux"
},
"pyOpenSSL": {
"openssl_version": "30100040",
"version": "23.2.0"
},
"requests": {
"version": "2.31.0"
},
"system_ssl": {
"version": "30100040"
},
"urllib3": {
"version": "2.0.7"
},
"using_charset_normalizer": true,
"using_pyopenssl": true
}