2016-11-18 14 views
0

HTTP2経由でリモートREST APIを実行しています。証明書を使用してSSLを実行します。目標は、Proxy経由でSSL証明書を使用してHTTP2経由でデータを送受信することです。PROXY、rubyを介したHTTP2リクエスト

HTTP2で要求を送信できるようにするhttp-2 &のnet-http2宝石があります。しかしプロキシはどうですか?標準のNet :: HTTPライブラリには、親クラスのNet :: HTTPクラスの動作を複製する子クラスNet :: HTTP :: Proxyがありますが、これはproxy-server経由でリクエストを送信します。しかし、HTTP2の宝石はそれをサポートしていません。

ザ・私が思いついたアイデアはhttp1.1のプロキシの実装に似たものを作ることです閉じて - 「ホスト:」の書き込みをし、「プロキシ認証:」ソケットへのフィールド、そのネットHTTP2宝石を使用しています:

@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 

答えて

0

は、すべての後、私はネット/ HTTP標準ライブラリに存在する例で私の考えを終え、ネットHTTP2は、宝石のためのプルリクエスト作成: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 
関連する問題