我们学校的网络环境是,所有的出校访问均须通过代理服务器(我们叫作sproxy),并且不能连接国外网站。为此,我想要做一个自动抓取和验证出国代理列表的WebService。我们所有的验证代理的请求,都需要通过两层代理,最终通到用来测试的网站(我使用了www.redhat.com)
技术上的思路是,通过连接第一层代理sproxy(支持http tunnel),给第二层代理发送GET指令,从而完成对目标网页的访问。
首先,通过普通的匿名透明代理的方法,是直接使用Socket发送GET命令,只不过与GET普通网站稍有不同罢了
直接访问:
GET / HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */* Accept-Language: zh-cn UA-CPU: x86 Accept-Encoding: gzip, deflate If-Modified-Since: Thu, 06 Jul 2006 15:39:53 GMT If-None-Match: "1172d9-381c-44ad2ec9" User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Host: www.redhat.com Connection: Keep-Alive Cookie: s_vi=[CS]v1|44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747
通过本机CCproxy:
GET / HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */* Accept-Language: zh-cn UA-CPU: x86 Proxy-Connection: Keep-Alive User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Host: www.redhat.com Cookie: s_vi=[CS]v1|44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747
可以看出来,只要给代理服务器发送正确的请求地址即可,不需要程序上特殊的变化。
事实上,对于不使用代理服务器的场合,你可以直接向某HTTP服务器发送GET /,而这在使用代理时不行,需要说明详细地址或者标明Host: www.redhat.com
对于两层代理,就有所不同了
Read the rest of this entry »
Recent Comments