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 请求,然后您真正需要做的就是开始双向复制字节。您无需再关心请求和响应。
我是网络编程的新手,我正在尝试在 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 请求,然后您真正需要做的就是开始双向复制字节。您无需再关心请求和响应。