2010-04-20 85 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协商,访问解密的请求,并通过充当普通客户端将这些请求的副本(可选地更改版本)发送到真实目标服务器。它将获得来自目标服务器的响应,(可选)更改响应,并将它们发送回客户端。