Html Ruby中HTTP拦截代理的帮助?

Html Ruby中HTTP拦截代理的帮助?,html,ruby,http,proxy,https,Html,Ruby,Http,Proxy,Https,我有一个用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| pu

我有一个用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
}
require'socket'#从stdlib获取套接字
server=TCPServer.open(8080)#Socket监听端口8080
循环{#服务器永远运行
Thread.start(server.accept)do | client|
放入“**已连接!”
@output=“”
@host=“”
@端口=80
而line=client.get
line.chomp!
if(line=~/^(GET | CONNECT)。*(\.com |\.net):(.*)(HTTP\/1.1 | HTTP\/1.0)$/)
@端口=$3
elsif(行=~/^Host:(.*)$/&&&@Host==“”)
@主机=$1
结束
打印行+“\n”
@输出+=行+“\n”
#这*可能*导致无法获取完整请求的问题,
#但如果没有这个,循环就永远不会返回。
如果行==“”,则中断
结束
如果(@host!=“”)
放置“**获得主机!(#{@host}:#{@port})”
out=TCPSocket.open(@host,@port)
放置“**到达目的地!”
out.print(@output)
而line=out.get
line.chomp!
如果(行=~/^.*$/)
#逻辑在这里完成。
结束
打印行+“\n”
client.print(第+“\n”行)
结束
近距离
结束
client.close
结束
}
我制作的这个简单代理解析HTTP请求的目的地,然后读取HTTP响应并基于特殊HTML标记执行逻辑。代理在大部分情况下都可以工作,但在处理二进制数据和HTTPS连接时似乎有问题


如何解决这些问题?

首先,您最好在现有的Ruby HTTP代理实现上进行构建。Ruby标准库中已经提供了一个这样的库,即。例如,有关基于同一类的实现,请参见此相关问题:


关于代理HTTPS,除了传递原始字节外,您不能做更多的事情。由于HTTPS受加密保护,因此无法在HTTP协议级别检查内容。它只是一个不透明的字节流。

WEBrick正在阻止I/O。。。这意味着它无法流式传输响应。例如,如果您在youtube页面上观看视频,则在代理下载所有视频内容之前,流不会转发到您的浏览器。 如果您希望视频在下载期间在浏览器中播放,则必须寻找像EventMachine这样的非阻塞I/O解决方案。
对于HTTPS来说,解决方案有点复杂,因为你必须开发中间人的代理。

< P>这是一个老问题,但是为了完整性,这里还有另一个答案。

我在Ruby中实现了一个HTTP/HTTPS拦截代理,该项目是

HTTP的情况很明显,HTTPS拦截是通过充当反向代理(并处理TLS握手)的HTTPS服务器完成的。即

客户端(例如浏览器)Proxy1 HTTPS反向代理目标服务器
正如Valko提到的,当客户端通过代理连接到HTTPS服务器时,您将看到一个加密字节流(因为SSL提供端到端加密)。但并非所有内容都是加密的,代理需要知道字节流应该转发给谁,因此客户端发出
connecthost:port
请求(作为请求的主体,SSL流)

这里的技巧是第一个代理将此请求转发到
HTTPS反向代理
,而不是真正的目标服务器。此反向代理将处理与客户端的SSL协商,可以访问解密的请求,并通过充当普通客户端将这些请求的副本(可选更改版本)发送到真正的目标服务器。它将从目标服务器获取响应,(可选)更改响应,并将它们发送回客户端

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