valpackett / httpotion

[Deprecated because ibrowse is not maintained] HTTP client for Elixir (use Tesla please)
https://hexdocs.pm/httpotion/readme.html
The Unlicense
725 stars 100 forks source link

Crash on 304 #126

Open Hugo-Hache opened 5 years ago

Hugo-Hache commented 5 years ago

When receiving a 304, the library tries to request the URL of the Location header

https://github.com/myfreeweb/httpotion/blob/9172d089cd1d47cdd772d97db750882cc741055f/lib/httpotion.ex#L200-L202 https://github.com/myfreeweb/httpotion/blob/9172d089cd1d47cdd772d97db750882cc741055f/lib/httpotion.ex#L243-L247

As the Location header is not set on a HTTP 304, normalize_location crashes with the following stacktrace:

FunctionClauseError: no function clause matching in URI.parse/1
URI.parse/1 (elixir) arguments
--
0 | "nil"

File lib/uri.ex line 539 in URI.merge/2 (elixir)
File lib/httpotion.ex line 453 in HTTPotion.normalize_location/2 (httpotion)
File lib/httpotion.ex line 453 in HTTPotion.request/3 (httpotion)

To get some context, if needed, I'm using HTTPotion in a proxy, https://github.com/applidium/pericles/blob/master/proxy/lib/pericles_proxy/runner.ex

As a quick fix I created this fork https://github.com/Hugo-Hache/httpotion/commit/8cf2becddd5815ebc60380187c634f38a4a30f3e I'll be happy to create a pull request from it if it looks ok for you.

valpackett commented 5 years ago

Good catch. I'm not sure how 304 got there. I think we should not crash even on a 302 with no Location, I'll add handling for that