chulkilee
HTTP client libraries and wrappers
Here are the list of HTTP client libraries/wrappers, and some thoughts on HTTP client in general. I’d like to hear from others how they work with HTTP..
HTTP client libraries
- httpc — OTP 29.0.2 (inets 9.7.1) - erlang (part of OTP)
- GitHub - benoitc/hackney: simple HTTP client in Erlang · GitHub - erlang, socket pools
- GitHub - cmullaparthi/ibrowse: Erlang HTTP client · GitHub - erlang, pool/pipeline per destination
- GitHub - puzza007/katipo: HTTP2/HTTP3 client for Erlang based on libcurl and libevent · GitHub - erlang, libcurl
- GitHub - ninenines/gun: HTTP/1.1, HTTP/2, Websocket client (and more) for Erlang/OTP. · GitHub - erlang, HTTP/2, Websocket, keeping connection with supervisor
- GitHub - inaka/shotgun: For the times you need more than just a gun. · GitHub - erlang, on the top of gun, out-of-box support of Server-sent Events
HTTP Client Wrappers
- GitHub - elixir-tesla/tesla: The flexible HTTP client library for Elixir, with support for middleware and multiple adapters. · GitHub - elixir, support httpc, hackney, ibrowse
- GitHub - edgurgel/httpoison: Yet Another HTTP client for Elixir powered by hackney · GitHub - elixir, hackney
- GitHub - valpackett/httpotion: [Deprecated because ibrowse is not maintained] HTTP client for Elixir (use Tesla please) · GitHub - elixir, ibrowse
- GitHub - alexandrubagu/simplehttp: HTTP client for Elixir without dependencies · GitHub - elixir, httpc
Related links
- HTTP client libraries - need better one in standard library?
- Erlang httpc or Elixir third-party http libraries (httpoison, httppotion)?
Thoughts & Questions
- Although HTTP spec says headers are case-insensitive, http client libraries should not automatically downcase such values (especially for outgoing request) since there are applications require specific cases

- headers, form data, and query string should be a list not a map to preserve orders (both order of keys and order of values)
- For performance, what about using NIF to parse headers? For example, puma (app server in Ruby) uses C for this: puma/ext/puma_http11 at v3.12.0 · puma/puma · GitHub - such parser may be shared across client/server.
- How should HTTP libraries handle HTTP version upgrade?
- Should HTTP libraries make pure functional (zero side effect) or leverage more global states (connection pools, keeping connection, etc.)?
- For example, Tesla allows creating new client on the fly, so that it “builds” client without any configuration from “global” config; however as it may use HTTP client library (application) which maintains some state in it.
Most Liked
chulkilee
chulkilee
xhttp is renamed to mint
https://github.com/ericmj/mint
Mint is different from most Erlang and Elixir HTTP clients because it provides a process-less architecture. Instead, Mint is based on a functional and immutable data structure that represents an HTTP connection. This data structure wraps a TCP or SSL socket. This allows for more fine-tailored architectures where the developer is responsible for wrapping the connection struct, such as having one process handle multiple connections or having different kinds of processes handle connections.
chulkilee
https://github.com/ericmj/xhttp
From ElixirConf 2018 keynote - see https://youtu.be/suOzNeMJXl0?t=2207
Popular in Discussions
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
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









