Paraxial.io Blog

Setting User-Agent in Elixir with Finch, HTTPoison, Req, or Tesla

by Michael Lubas

Paraxial.io Printing User Agents

In 1996 Google co-founder Larry Page posted in comp.lang.java, Q: Setting User-Agent Field?. 26 years later, you may still need to set the User-Agent in your project. Here are four examples from the Elixir HTTP clients Finch, HTTPoison, Req, and Tesla.

The above screenshot is from Paraxial.io, which shows the User-Agent of incoming HTTP requests to a Phoenix application. If you don’t have an account, you should sign up for a free trial, in the meantime use ngrok to verify what User-Agent you’re sending.

mix.exs

  defp deps do
    [
      {:finch, "~> 0.13.0"},
      {:httpoison, "~> 1.8"},
      {:req, "~> 0.3.0"},
      {:tesla, "~> 1.4"},
      {:hackney, "~> 1.18"}
    ]
  end
defmodule Multitude do
  def get_finch do
    # Typically you just add Finch to your app's supervision tree
    # If you don't know what that means, read
    # https://elixir-lang.org/getting-started/mix-otp/supervisor-and-application.html
    Finch.start_link(name: MyFinch)
    a = Finch.build(:get, "https://paraxial.io", [{"User-Agent", "UA-test-finch"}])
    {:ok, %Finch.Response{body: body}} = Finch.request(a, MyFinch)
    body
  end

  def get_httpoison do
    {:ok, %HTTPoison.Response{body: body}} =
      HTTPoison.get("https://paraxial.io", [{"User-Agent", "UA-test-httpoison"}])
    body
  end

  def get_req do
    # If you do Req.get!("https://paraxial.io", headers: [{"User-Agent", "UA-test-req"}])
    # The user agent gets set to "UA-test-req, req/0.3.0"
    # So make sure you use the user_agent: option below
    %Req.Response{body: body} =
      Req.get!("https://paraxial.io", user_agent: "UA-test-req")
    body
  end

  def get_tesla do
    # With Hackney adapter for correct SSL/TLS settings
    middleware = []
    adapter = {Tesla.Adapter.Hackney, [recv_timeout: 30_000]}
    client = Tesla.client(middleware, adapter)
    {:ok, %Tesla.Env{body: body}} =
      Tesla.get(client, "https://paraxial.io",
        headers: [{"User-Agent", "UA-test-tesla-w-hackney"}]
      )
    body
  end

Author contact: michael@paraxial.io

Paraxial.io makes blocking bots in Elixir and Phoenix applications easy.

Enter your email to stay up to date.