Java代理如何处理CONNECT请求

时间:2015-12-21 21:23:50

标签: java sockets http proxy 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段来立即终止连接。

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

1 个答案:

答案 0 :(得分:2)

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

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