我有一些通过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/