關於移動網關的私有代理協議:X-Online-Host

衆所周知,在國內的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的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章