我是网络编程的新手,我正在尝试在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段来立即终止连接。
我应该如何正确处理这些请求并检索网页内容?
答案 0 :(得分:2)
请求应该是客户端在CONNECT之后发送的任何内容。
您必须使用HTTP状态行响应CONNECT请求,然后您真正需要做的就是开始双向复制字节。您不需要再关心请求和响应。