小编ost*_*lli的帖子

如何在Ruby中创建双向SSL套接字

我正在构建一个客户端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 …

ruby sockets openssl bidirectional two-way

6
推荐指数
1
解决办法
569
查看次数

Nginx基于标头值重写

我有一个基本上看起来像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 返回.

nginx

0
推荐指数
1
解决办法
5176
查看次数

标签 统计

bidirectional ×1

nginx ×1

openssl ×1

ruby ×1

sockets ×1

two-way ×1