2013-07-01 49 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。如果没有配置代理,它使用相对的代理。