以前关注过在socket使用http代理访问网页的问题,原理很简单,就是非代理情况下connect的是目标网页的IP和端口,而使用代理则connect代理IP和端口,连接成功后就直接send数据了。
原理清楚,但一直没应用过,今天正好需要就测试了一下,结果在http代理可用,connect正常的情况下,send数据后总是返回http/1.1 400。最后在一个帖子中找到了原因所在,其实使用http代理来发送GET或POST,其包的格式与非代理的GET或POST有一些区别,区别共有两处:
1.发送的包中可以不加Host ( Host: www.baidu.com )
2.在GET的路径中设置访问页面的完整地址,即 GET http://www.baidu.com/ HTTP/1.1
附上帮我解决这个问题的帖子:
|
问题解决了,呵呵 还是得感谢mark大大的提醒,我的请求确实有问题。主要问题是Request-URI域,在RFC261中指出,当请求由代理发出时,absoluteURI形式是【要求的】,而我之前用的是abs_path的形式;另外cmwap网关对head貌似也有所检查。 GET http://www.baidu.com/ HTTP/1.1/r/n Host:www.baidu.com /r/n (注:此行可以无,代理模式下host头无效) Accept:*/*/r/n User-Agent:Nokia7610/2.0 (4.0424.4ch) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0/r/n Accept-Language:zh-cn/r/n Accept-Charset:x-gbk,utf-8;q=0.7,*;q=0.7/r/n X-Online-Host:www.baidu.com:80 /r/n Connection:close/r/n/r/n |
|