我正在构建一个客户端Ruby库,它连接到服务器并等待数据,但也允许用户通过调用方法来发送数据.
我使用的机制是有一个初始化套接字对的类,如下所示:
def initialize
@pipe_r, @pipe_w = Socket.pair(:UNIX, :STREAM, 0)
end
Run Code Online (Sandbox Code Playgroud)
我允许开发人员调用以向服务器发送数据的方法如下所示:
def send(data)
@pipe_w.write(data)
@pipe_w.flush
end
Run Code Online (Sandbox Code Playgroud)
然后我在一个单独的线程中有一个循环,我从socket连接到服务器和从@pipe_r:
def socket_loop
Thread.new do
socket = TCPSocket.new(host, port)
loop do
ready = IO.select([socket, @pipe_r])
if ready[0].include?(@pipe_r)
data_to_send = @pipe_r.read_nonblock(1024)
socket.write(data_to_send)
end
if ready[0].include?(socket)
data_received = socket.read_nonblock(1024)
h2 << data_received
break if socket.nil? || socket.closed? || socket.eof?
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
这样可以很好地工作,但只能TCPSocket按照例子的正常情况进行.我需要使用一个OpenSSL::SSL::SSLSocket,但是根据IO.select文档:
使用IO.select的最佳方法是在非阻塞方法(如read_nonblock,write_nonblock等)之后调用它.
[...]
特别是,非阻塞方法和IO.select的组合对于像OpenSSL :: SSL :: SSLSocket这样的IO对象是首选的.
根据这个,我需要IO.select …
我有一个基本上看起来像nginx.conf(省略了不必要的部分):
upstream app {
server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}
server {
listen 80;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}
Run Code Online (Sandbox Code Playgroud)
我想配置nginx,以便使用特定标头的值来重写传递给上游的url.
举例来说,假设我有一个请求/test与头Accept: application/vnd.demo.v1+json.我希望它被重定向到上游URL /v1/test,即基本上上游应用程序将收到/v1/test没有标题的请求.
同样,应将请求/test和标头Accept: application/vnd.demo.v2+json重定向到上游URL /v2/test.
这可行吗?我查看了IfIsEvil nginx模块,但那里的许多警告让我对使用它犹豫不决.
谢谢,
河
编辑
如果没有匹配,我想412 Precondition Failed立即从nginx 返回.