使用Faraday通过Unix套接字发出HTTP请求

时间:2016-08-31 19:13:21

标签: ruby faraday unix-socket

我尝试将自定义法拉第适配器放在一起,使用NetX :: HTTPUnix使用Unix套接字发出HTTP请求。代码如下所示:

module Faraday
  class Adapter
    class NetHttpUnix < Faraday::Adapter::NetHttp
      def perform_request(http, env)
        if :get == env[:method] and !env[:body]
          # prefer `get` to `request` because the former handles gzip (ruby 1.9)
          http.get env[:url], env[:request_headers]
        else
          http.request create_request(env)
        end
      end

      def create_request(env)
        request = Net::HTTPGenericRequest.new \
          env[:method].to_s.upcase,    # request method
          !!env[:body],                # is there request body
          :head != env[:method],       # is there response body
          "/",                   # request uri path (i'm just hard coding / because URI::Generic doesn't have a uri_path method
          env[:request_headers]        # request headers

        if env[:body].respond_to?(:read)
          request.body_stream = env[:body]
        else
          request.body = env[:body]
        end
        request
      end


      def net_http_connection(env)
        socket = env[:url].to_s
        NetX::HTTPUnix.new(socket)
      end
    end
  end
end

Faraday::Adapter.register_middleware net_http_unix: Faraday::Adapter::NetHttpUnix

但是,当我尝试使用此适配器发出请求时,我得到一个Faraday :: ConnectionError。当我查看异常回溯时,我看到代码试图在http.rb中打开TCP套接字。

是否存在适用于Unix套接字的法拉第适配器?我不想在这里重新发明轮子。

1 个答案:

答案 0 :(得分:0)

经过多次回顾,上面的代码实际上非常好!

由于Ruby URI.parse的工作原理,我遇到了问题。我的URI采用unix:///path/to/socket的形式,URI.parse解析为unix:/path/to/socket,而Net :: Http :: Unix又不作为Unix套接字URL进行解析,因为它期望Unix套接字URI以unix://开头。

解决方案最终在我的路径中使用了五个斜杠,如下所示:unix://///path/to/socket。执行此操作时,URI.parse会将其解析为unix:///path/to/socketnet_http_unix会看到它以unix://开头,并删除该部分,留下我们可以连接的/path/to/socket至。

在我的情况下,我指的是绝对路径;如果我一直使用相对路径,我可能对unix://relative/path/to/socket没问题。

关于我的上述代码的一个警告:Net::HttpGenericRequest.new的第四个参数只是&#34; /&#34;。这对我来说很合适,因为我使用RPC over HTTP,它从不具有相对URI;如果您的应用或服务中有这些,您将需要一种方法来获取URI并将套接字路径与相对路径分开。