sahilpaudel
Unable to send headers in HTTPoison.get
My code snippet.
def make_request(path, params) do
url = construct_url(path, params)
headers = []
case HTTPoison.get(url, headers) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
case Poison.decode(body) do
{:ok, decoded} -> {:ok, decoded}
{:error, error} ->{:error, error}
end
{:ok, %HTTPoison.Response{status_code: status_code }} ->
{:error, status_code}
{:error, error} -> {:error, error}
end
end
defp construct_url(path, params) do
path <> params
end
the above code is working fine as expected however if I add
headers = [{“Accept-Encoding”,“gzip, deflate”}, {“Content-Type”, “application/json”}]
It gives error
{:error, {:invalid, <<31>>, 0}}
Anything I am doing it wrong here
Marked As Solved
Jacek
Then you can’t use simple Poison.decode(body) since Poison expects string whereas what you pass in is its compressed version. Try to decompress it first, sth like :zlib.gunzip(body), however first you should probably check if the response includes the following header: Content-Encoding: gzip
Also Liked
speeddragon
I think that issue could be about Poison.decode/1? Not sure if HTTPoison uncompresses the body. If not, you need to decompress it before you parse it, because ASCII 31 isn’t a valid string character. Not sure if this is the case.
The first 32 characters in the ASCII-table are unprintable control codes and are used to control peripherals such as printers.
https://www.ascii-code.com/
Last Post!
sahilpaudel
Thanks @Jacek,
It worked, just pasting the code below for future reference if someone get stuck here.
def make_request(path, params) do
url = construct_url(path, params)
headers = [
{"Accept-Encoding","gzip, deflate"},{"Content-Type", "application/json"}
]
case HTTPoison.get(url, headers) do
{:ok, %HTTPoison.Response{status_code: 200, headers: resp_headers, body: body}} ->
resp_headers
|> check_if_gzipped
|> unzip_body(body)
|> decode_body
{:ok, %HTTPoison.Response{status_code: status_code }} ->
{:error, status_code}
{:error, error} -> {:error, error}
end
end
def check_if_gzipped(headers) do
Enum.any?(headers, fn (kv) ->
case kv do
{"Content-Encoding", "gzip"} -> true
{"content-encoding", "gzip"} -> true
{"Content-Encoding", "x-gzip"} -> true
_ -> false
end
end)
end
def decode_body(body) do
case Poison.decode(body) do
{:ok, decoded} -> {:ok, decoded}
{:error, error} ->{:error, error}
end
end
def unzip_body(true, body), do: :zlib.gunzip(body)
def unzip_body(false, body), do: body
defp construct_url(path, params) do
path <> params
end
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









