python-hyper / hyper

HTTP/2 for Python.
http://hyper.rtfd.org/en/latest/
MIT License
1.05k stars 191 forks source link

Using hyper.contrib.HTTP20Adapter with requests.session ignores set-cookie header and does not set cookies. #392

Open Margesh92 opened 5 years ago

Margesh92 commented 5 years ago

I am using hyper.contrib.HTTP20Adapter with requests in python. When session is started with requests (with HTTP20Adapter) and url is fetched, it does not set cookies as per 'set-cookie' header. So, session.cookies.get_dict() returns an empty dict {}.

BarryThrill commented 5 years ago

I have the same issue, did you solve it?

zjcnew commented 5 years ago

I urgently hope to support the automatic management of request and response cookies as soon as possible.

user223989 commented 5 years ago

Is there any workaround for this? I have just come across the issue and it is a game breaking problem!

xCuri0 commented 5 years ago

Same issue. I've confirmed I'm actually receiving the cookies since I can see set-cookie in Wireshark

crablab commented 5 years ago

This is in #393 but hasn't been merged :thinking:

I have this same problem so it would be nice if it could be fixed!

@Lukasa? :pray:

xCuri0 commented 5 years ago

@crablab that fix does not work correctly. it doesn't add all the cookies i see in wireshark

crablab commented 5 years ago

It is a bit of a dumster fire to be honest :fire:

I might have a look at fixing this myself but I've never looked at the Hyper source before so :man_shrugging:

divinehawk commented 4 years ago

https://github.com/python-hyper/hyper/pull/405 appears to fix this issue in both Python2 and Python3.

paulzaf1992 commented 4 years ago

@divinehawk I have applied the #405 fix but still no luck...

Specifically, what I 'm doing is that I mount hyper.contrib.HTTP20Adapter to a requests.Session in python3 and I am trying to get a specific cookie from the RequestsCookieJar of the response.

However, despite the fact that the response headers contain several 'Set-Cookie' headers, the CookieJar remains empty.

I also added debug messages inside the FakeOriginalResponse.get_all() method in order to see the contents of the "values" variable that this method returns. I see that "values" contains all of the "Set-Cookie" cookies' values.

Am I missing something else?

paulzaf1992 commented 4 years ago

Just came up with a solution.

In the #405 fix I simply replaced the line if n.decode('utf-8') == name.lower(): with: if n.decode('utf-8').lower() == name.lower(): because I noticed that wihout it, the if was never true.

And finally I placed the call to extract_cookies_to_jar() right before the return statement because its final argument needs the information we fake. So instead of calling it like extract_cookies_to_jar(response.cookies, request, response) I called it like: extract_cookies_to_jar(response.cookies, request, response.raw)

Hope this saves someone the 4 weeks I lost over this...

xingzhisg commented 4 years ago

If I get it right, the HTTP/2 specification (RFC7540 8.1.2 HTTP Header Fields) requires all field names to be in lowercase, so n.decode('utf-8').lower() is not necessary here.

paulzaf1992 commented 4 years ago

@xingzhisg that's what I thought as well and actually this is why it took me 4 weeks to solve this. I just happened to check this out of dispair, in order to be sure that it wasn't creating any problems. And after I checked that it works with it, I then reverted back and cross-checked that it failed without lower() in order to be 100% sure. I may have been missing something all along and I 'd appreciate any thoughts on it