2016-08-31 15 views
2

NetX :: HTTPUnixを使ってUnixソケットを使ってHTTP要求を行うために、カスタムのファラデーアダプタをまとめてみました。コードは次のようになります。ファラデーを使って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ソケットで動作するファラデーアダプタがありますか?私はここで車輪を再発明したくない。

+0

引数を複数の行に分割する場合は、それらをカプセル化するために、通常の角括弧 '(...) 'を使用します。ここのバックスラッシュは非常に不規則です。 – tadman

答えて

0

多くのことを見回した後、上記のコードは実際には完璧です!

私はRubyのURI.parseがどのように動作するのかに問題がありました。私のURIはunix:///path/to/socketの形をしていました。URI.parseunix:/path/to/socketに、Net :: Http :: UnixはUnixソケットのURIとして解釈されませんでした。これは、UnixソケットのURIがunix://で始まることを期待しています。

解決策は、私のパスに5つのスラッシュを使用するようになりました。つまり、unix://///path/to/socketです。これを行うと、URI.parseはそれをunix:///path/to/socketに解析し、net_http_unixは、unix://で始まり、その部分を取り除き、接続できる/path/to/socketを残しているとみなします。

私の場合、私は絶対パスを指定していました。私が相対パスを使用していたなら、私はunix://relative/path/to/socketと大丈夫かもしれません。

私の上記のコードに関する注意点:Net::HttpGenericRequest.newの4番目の引数はちょうど "/"です。これは、相対URIを決して持たないHTTP経由のRPCを使用しているため、私には適しています。あなたのアプリやサービスにそれらを持っている場合は、URIを取得し、ソケットパスを相対パスから分離する方法が必要です。

関連する問題