我尝试将自定义法拉第适配器放在一起,使用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套接字的法拉第适配器?我不想在这里重新发明轮子。
答案 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/socket
,net_http_unix
会看到它以unix://
开头,并删除该部分,留下我们可以连接的/path/to/socket
至。
在我的情况下,我指的是绝对路径;如果我一直使用相对路径,我可能对unix://relative/path/to/socket
没问题。
关于我的上述代码的一个警告:Net::HttpGenericRequest.new
的第四个参数只是&#34; /&#34;。这对我来说很合适,因为我使用RPC over HTTP,它从不具有相对URI;如果您的应用或服务中有这些,您将需要一种方法来获取URI并将套接字路径与相对路径分开。