Java代理如何处理CONNECT请求

Java proxy how to handle CONNECT requests

我是网络编程的新手,我正在尝试在 Java 中实现一个简单的 http 代理,它只是转发客户端的请求并传回响应。

为了处理 GET 请求,我只是读取客户端套接字 InputStream,为所需主机(我从套接字读取)创建一个新套接字,然后将客户端完成的相同 GET 请求写入这个新的 OutputStream插座。检索响应也是一样,我将主机套接字的 InputStream 的响应写回客户端套接字的 OutputStream。

但是当我必须处理 CONNECT 请求时遇到了一些麻烦,例如,当我尝试从浏览器访问 www.google.com 时,这导致从客户端套接字读取:

CONNECT www.google.com:443 HTTP/1.1
Host: www.google.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36

根据我的理解,我应该在端口 443 上连接到主机 www.google.com。所以我创建了一个新套接字:

Socket socket = new Socket(www.google.fr, 443);

但是请求应该是什么?我只是试了一下:

GET / HTTP/1.1

但是使用 Wireshark,主机似乎通过发回 FIN 和 RST TCP 段立即终止连接。

我应该如何正确处理这些请求并检索网页内容?

请求应该是客户端在 CONNECT 之后发送的任何内容。

您必须使用 HTTP 状态行响应 CONNECT 请求,然后您真正需要做的就是开始双向复制字节。您无需再关心请求和响应。