我有一些通过HTTP2运行的远程REST API。它使用证书通过SSL运行。我们的目标是通过HTTP2和SSL证书(通过代理)发送和接收数据。

http-2和net-http2 gem允许使用HTTP2发送请求。但是代理呢?在标准的Net :: HTTP库中,有一个子类Net :: HTTP :: Proxy,它复制父代Net :: HTTP类的行为,但事实是它通过代理服务器发送请求。但是HTTP2 gem不支持它。

我提出的关闭想法是使类似于http1.1的代理实现-将“ Host:”和“ Proxy-Authorization:”字段写入套接字,Net-Http2 gem使用该套接字:

  @socket.writeline sprintf('CONNECT %s:%s HTTP/%s',
                            @address, @port, HTTPVersion)
  @socket.writeline "Host: #{@address}:#{@port}"
  if proxy_user
    credential = ["#{proxy_user}:#{proxy_pass}"].pack('m')
    credential.delete!("\r\n")
    @socket.writeline "Proxy-Authorization: Basic #{credential}"
  end
  @socket.writeline ''


但最终结果是:

SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A


我可能会错过一些技术知识来实现​​这一目标,因此,对与研究方向有关的任何帮助均表示赞赏。

最佳答案

毕竟,我以net / http标准库中的示例结束了我的想法,并为Net-http2 gem创建了一个拉取请求:https://github.com/ostinelli/net-http2/pull/11

这个想法是正确的,我们所要做的就是使用任何tcp套接字发送代理“ CONNECT”消息,并使用一个我们要连接的地址,因此它创建了一个TCP隧道,该隧道绕过了所有数据的进出,没有是HTTP1.1还是HTTP2,还是其他任何问题。

这是代码的一部分:

def self.proxy_tcp_socket(uri, options)
  proxy_addr = options[:proxy_addr]
  proxy_port = options[:proxy_port]
  proxy_user = options[:proxy_user]
  proxy_pass = options[:proxy_pass]

  proxy_uri = URI.parse("#{proxy_addr}:#{proxy_port}")
  # create a regular TCP socket (with or w/o SSL, if needed)
  proxy_socket = tcp_socket(proxy_uri, options)

  # The majority of proxies do not explicitly support HTTP/2 protocol,
  # while they successfully create a TCP tunnel
  # which can pass through binary data of HTTP/2 connection.
  # So we’ll keep HTTP/1.1
  http_version = '1.1'

  buf = "CONNECT #{uri.host}:#{uri.port} HTTP/#{http_version}\r\n"
  buf << "Host: #{uri.host}:#{uri.port}\r\n"
  if proxy_user
    credential = ["#{proxy_user}:#{proxy_pass}"].pack('m')
    credential.delete!("\r\n")
    buf << "Proxy-Authorization: Basic #{credential}\r\n"
  end
  buf << "\r\n"
  proxy_socket.write(buf)
  validate_proxy_response!(proxy_socket)

  proxy_socket
end

关于ruby-on-rails - 通过PROXY,Ruby的HTTP2请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40675517/

10-10 18:20