2013-07-01 47 views
0

我正嘗試在c#中編寫一個小型代理服務器。它對我測試過的許多網頁(包括google.com和microsoft.com)都很好。爲了測試,我啓動了我的代理服務器並在Windows 8上配置了IE 10以使用它。自編碼代理無法從維基百科檢索圖像

但是,當我嘗試wikipedia.org它只會加載主頁面,但沒有圖片。我試圖加載一張圖片(http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png)。當我使用沒有代理的IE瀏覽器時,它可以工作,但是通過代理,我得到了404響應。

這是IE(我的代理只是其轉發)GET請求事項:

GET http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png HTTP/1.1 
Accept: text/html, application/xhtml+xml, */*\ 
Accept-Language: de-CH\ 
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0) 
Accept-Encoding: gzip, deflate 
Host: upload.wikimedia.org 
DNT: 1 
Proxy-Connection: Keep-Alive 

恕我直言,這看起來是正確的。這是我得到的迴應(被遺漏的某些HTML標記):

HTTP/1.1 404 Not Found 
Content-Type: text/html; charset=UTF-8 
X-Varnish: 1427845074 1427806476, 274786836, 3671934588 
Via: 1.1 varnish, 1.1 varnish, 1.1 varnish 
Content-Length: 262 
Accept-Ranges: bytes 
Date: Mon, 01 Jul 2013 21:30:54 GMT 
Age: 28 
Connection: keep-alive 
X-Cache: cp1063 hit (1), cp3004 miss (0), cp3003 frontend miss (0) 
Access-Control-Allow-Origin: * 

...404 Not Found\n The resource could not be found.\nRegexp failed to match URI: "http:/upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png" 

奇怪的部份是在這裏:

Regexp failed to match URI: "http:/upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png" 

- > URL以http開頭:/

在代碼我連接到uploads.wikimedia.org這樣的:

   // connect to uploads.wikimedia.org 
       ServerSocket.Connect(RemoteHost, 80); 
       byte[] SendBuffer = Request.ToArray(); 

       // send the clients request to the server 
       ServerSocket.Send(SendBuffer); 

我不知道爲什麼它不工作。任何幫助表示讚賞。我的完整代碼位於Github上:Proxy_C_Sharp

回答

1

我剛剛發現了原因。

根據章5.2.1 HTTP/1.1規範(http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5):

「爲了能夠在HTTP的未來版本中的所有請求過渡到absoluteURIs,所有的HTTP/1.1服務器必須接受絕對URI形式在請求中,即使HTTP/1.1客戶端只會在代理請求中生成它們。「

我嘗試了一個小工具。如果我提出這樣的要求:

GET /wikipedia/commons/6/63/Wikipedia-logo.png HTTP/1.1 
Host: upload.wikimedia.org 

它的工作原理。所以原因是維基百科不符合標準。它應該接受絕對的網址。但是,如果我沒有代理訪問網站,它會起作用,因爲瀏覽器僅使用代理服務器使用絕對URI。如果沒有配置代理,它使用相對的代理。