自编码代理无法从维基百科中检索图像

时间:2013-07-01 22:17:24

标签: c#-4.0 proxy

我正在尝试用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 个答案:

答案 0 :(得分:1)

我刚刚发现了原因。

根据第5.2.1节中的HTTP / 1.1规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5):

"为了允许在未来版本的HTTP中转换为所有请求中的absoluteURI,所有HTTP / 1.1服务器必须接受请求中的absoluteURI表单,即使HTTP / 1.1客户端只会在对代理的请求中生成它们。 "

我用一个小工具试了一下。如果我提出这样的请求:

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

有效。所以原因是维基百科不符合标准。它应该接受绝对的网址。但是如果我在没有代理的情况下访问该站点,它就有效,因为浏览器仅使用代理的绝对URI。如果没有配置代理,则使用相对代理。