Handle Faraday::Error::ConnectionFailed with middleware


Faraday is a really nice, middleware-based HTTP client for Ruby. For simple libraries, I recommend HTTParty, but Faraday is a really awesome solution when you need full control over the complete stack.

However, Faraday has one feature/flaw that I have found. If Faraday is unable to connect to a server, it throws a really nasty error. I whipped up a tiny middleware to handle this error:

class Middleware::Exceptions < Faraday::Middleware
  def call(env)
    rescue Faraday::Error::ConnectionFailed => e
      # Do whatever to handle your error here, maybe raise a more semantic error

And then tell Faraday to use this middleware:

Faraday.new(endpoint) do |connection|
  connection.use Middleware::Exceptions

In my projects, I typically do something like:

rescue Faraday::Error::ConnectionFailed => e
  url = env[:url].to_s.gsub(env[:url].path, '')
  $stderr.puts "The server at #{url} is either unavailable or is not currently accepting requests. Please try again in a few minutes."

Happy error handling!

Seth Vargo is a Developer Advocate at Google. Previously he worked at HashiCorp, Chef Software, CustomInk, and a few Pittsburgh-based startups. He is the author of Learning Chef and is passionate about reducing inequality in technology. When he is not writing, working on open source, teaching, or speaking at conferences, Seth enjoys spending time with his friends and advising non-profits.