2016-08-31 3 views
2

NetX :: HTTPUnix를 사용하는 유닉스 소켓을 사용하여 HTTP 요청을하기 위해 사용자 정의 패러데이 어댑터를 조합 해 보았습니다. 코드는 다음과 같습니다.패러데이를 사용하여 유닉스 소켓을 통한 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 소켓을 열려고 시도하고 있음을 알 수 있습니다.

이미 유닉스 소켓에서 작동하는 패러데이 어댑터가 있습니까? 나는 바퀴를 여기에서 재발 명하고 싶지 않다.

+0

인수를 여러 줄로 나눌 경우 '(...)'를 사용하여 줄 바꿈을 캡슐화하십시오. 여기서 백 슬래시는 매우 불규칙합니다. – tadman

답변

0

주위를 둘러 본 후 위의 코드는 실제로 완벽하게 훌륭합니다!

Ruby의 URI.parse 작동 방식으로 인해 문제가 발생했습니다. 내 URI는 unix:///path/to/socket인데, URI.parseunix:/path/to/socket으로 구문 분석합니다. Net :: Http :: Unix는 Unix 소켓 URI가 unix://으로 시작하기를 기대하기 때문에 차례로 유닉스 소켓 URL로 구문 분석하지 않았습니다.

해결책은 내 경로에 슬래시 5 개를 사용하는 것으로 끝났습니다. 예 : unix://///path/to/socket. 이렇게하면 URI.parseunix:///path/to/socket으로 구문 분석합니다. net_http_unixunix://으로 시작하고 그 부분을 제거하여 연결할 수있는 /path/to/socket으로 남습니다.

제 경우에는 절대 경로를 지정했습니다. 상대 경로를 사용했다면 나는 unix://relative/path/to/socket으로 괜찮을 수도 있습니다.

위의 코드에 대한주의 사항 : Net::HttpGenericRequest.new의 네 번째 인수는 "/"입니다. 그것은 상대 URI가 결코없는 HTTP를 통한 RPC를 사용하기 때문에 저에게 적합합니다. 앱이나 서비스에 URI가있는 경우 URI를 가져 와서 소켓 경로를 상대 경로와 분리해야합니다.

관련 문제