2010-04-20 66 views
2

我有一個HTTP攔截代理Ruby編寫的開始:在Ruby中幫助HTTP攔截代理?

require 'socket'    # Get sockets from stdlib 

server = TCPServer.open(8080) # Socket to listen on port 8080 
loop {       # Servers run forever 
    Thread.start(server.accept) do |client| 
    puts "** Got connection!" 
    @output = "" 
    @host = "" 
    @port = 80 
    while line = client.gets 
     line.chomp! 
     if (line =~ /^(GET|CONNECT) .*(\.com|\.net):(.*) (HTTP\/1.1|HTTP\/1.0)$/) 
      @port = $3 
     elsif (line =~ /^Host: (.*)$/ && @host == "") 
      @host = $1 
     end 
     print line + "\n" 
     @output += line + "\n" 
     # This *may* cause problems with not getting full requests, 
     # but without this, the loop never returns. 
     break if line == "" 
    end 
    if (@host != "") 
     puts "** Got host! (#{@host}:#{@port})" 
     out = TCPSocket.open(@host, @port) 
     puts "** Got destination!" 
     out.print(@output) 
     while line = out.gets 
      line.chomp! 
      if (line =~ /^<proxyinfo>.*<\/proxyinfo>$/) 
       # Logic is done here. 
      end 
      print line + "\n" 
      client.print(line + "\n") 
     end 
     out.close 
    end 
    client.close 
    end 
} 

這個簡單的代理,我提出解析目的地出HTTP請求,然後讀取HTTP響應和基於特殊的HTML標記進行邏輯。代理大部分工作正常,但似乎無法處理二進制數據和HTTPS連接。

我該如何解決這些問題?

回答

2

首先,您可能會更好地構建現有的Ruby HTTP代理實現。 Ruby標準庫中已經有一個這樣的產品,即WEBrick::HTTPProxyServer。例如,請參閱相關問題以獲取基於同一個類的實現:Webrick transparent proxy

關於代理HTTPS,除傳遞原始字節之外,您不能做更多的事情。由於HTTPS受加密保護,因此無法在HTTP協議級別檢查內容。它只是一個不透明的字節流。

1

WEBrick阻塞I/O ...這意味着它無法傳輸響應。例如,如果您在YouTube視頻頁面上觀看視頻,則該視頻流將不會被轉發至您的瀏覽器,除非代理已經下載了所有視頻。 如果您希望視頻在下載過程中在您的瀏覽器中播放,您必須尋找像EventMachine這樣的非阻塞I/O解決方案。 對於HTTPS來說,解決方案有點複雜,因爲你必須在中間代理中開發一個人。

0

這是一個古老的問題,但爲了完整起見,這裏有另一個答案。

我在Ruby中實現了一個HTTP/HTTPS攔截代理,該項目是hosted in github

HTTP情況很明顯,通過作爲反向代理(並處理TLS握手)的HTTPS服務器完成HTTPS攔截。即

Client(e.g. Browser) <--> Proxy1 <--> HTTPS Reverse Proxy <--> Target Server 

正如Valko提到的,當客戶端通過代理連接到HTTPS服務器時,你會看到加密的字節流(因爲SSL提供終端到終端加密)。但並非所有內容都是加密的,代理服務器需要知道應將字節流轉發給誰,因此客戶端發出CONNECT host:port請求(作爲SSL流請求的主體)。

這裏的訣竅是第一個代理將把這個請求轉發給HTTPS Reverse Proxy而不是真正的目標服務器。該反向代理將處理與客戶端的SSL協商,訪問解密的請求,並通過充當普通客戶端將這些請求的副本(可選地更改版本)發送到真實目標服務器。它將獲得來自目標服務器的響應,(可選)更改響應,並將它們發送回客戶端。