衆所周知,在國內的GPRS網絡環境下,用戶以cmwap接入點上網的狀況居多。cmwap是中國移動的GPRS代理上網,所以在建立鏈接的時候,必須採用代理的方式進行鏈接。
假設我鏈接的URL爲:http://wap.uc.cn/;
在標準代理中,是這樣子的:
Conection to 10.0.0.172:80
GET http://wap.uc.cn/ HTTP/1.1
Host: wap.uc.cn
可是在J2ME中,程序並不能控制到TCP層,所以中國移動定義了一個私有協議字段:X-Online-Host。從移動要求的規範來看,咱們只須要這樣便可正常進行聯網:
Conection to 10.0.0.172:80
GET / HTTP/1.1
Host: 10.0.0.172
X-Online-Host: wap.uc.cn
實際上對於程序來講,咱們只須要將原來鏈接的url及http header中的host替換成10.0.0.172,並添加一個http header字段:X-Online-Host,值爲原來的host。而後繼續採用直連的方式便可正常進行聯網。
這樣問題就來了,很明顯這是一個不標準的代理協議,不標準的地方在於:
GET / HTTP/1.1
由於在標準的代理協議規範中,定義了請求的必須是完整的URI。
這個問題在日常並不會出現,可是當請求的URL比較特殊時,問題就很明顯了。
假設我鏈接的URL爲:http://wap.baidu.com/logo.gif?img=http://wap.uc.cn/uc.png
使用X-Online-Host協議的聯網:
Conection to 10.0.0.172:80
GET /logo.gif?img=http://wap.uc.cn/uc.png HTTP/1.1
Host: 10.0.0.172
X-Online-Host: wap.baidu.com
這樣的請求到達移動網關以後,會被誤發至http://wap.baidu.com/uc.png。可是實際上咱們想要請求的是http://wap.baidu.com/logo.gif (?以後的表示變量)。
由於,移動網關實際上就是一個HTTP的代理服務器,它對於X-Online-Host協議是這樣處理的:
截取請求頭中的URL字段:
若是沒有http://字段的話,則將該字段做爲相對URI,同X-Online-Host字段進行補全;
若是有http://字段的話,則將該字段做爲絕對URI,將host替換爲X-Online-Host的值。html
本文轉載地址:http://www.cnblogs.com/xitang/archive/2011/11/07/2239454.html服務器