sahilpaudel

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

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

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

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

Where Next?

Popular in Questions Top

vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New

We're in Beta

About us Mission Statement