HTTP 1.1请求行

时间:2011-05-07 22:46:14

标签: http proxy

我构建代理服务器,它工作得很好,但有一些他无法处理的网站。 我试图将问题简化为核心,这就是我提出的: 我的测试用例是: http://bits.wikimedia.org/en.wikipedia.org/load.php 这是每个维基百科页面中传输的http消息之一。 所以我试着建立一个请求并通过这样的套接字发送它:

String request1 = 
    "GET http://bits.wikimedia.org/en.wikipedia.org/load.php HTTP/1.1" + 
    "\r\n" + 
    "Host: bits.wikimedia.org" + "\r\n" +
    "User-Agent: MyHttpProxy/example.java (http://stackoverflow.com/q/5924490/319266)" +
    "\r\n" + "\r\n";

但是我得到了404返回代码 - 这很奇怪,因为这个页面确实存在! 我做了很多尝试并提出了一个新的请求,只有在请求行中才有所不同:

String request2 = 
     "GET /en.wikipedia.org/load.php HTTP/1.1" + 
     "\r\n" + 
     "Host: bits.wikimedia.org" + 
     "\r\n" +
     "User-Agent: MyHttpProxy/example.java (http://stackoverflow.com/q/5924490/319266)" + 
     "\r\n" + "\r\n";

它有效!一个好的200被带回来了 一些不重要的内容(“/ *没有要求的模块.Max让我把它放在这里* /”)

谁能告诉我这里的问题是什么? 我看着rfc,我无法理解这一点...

Here是运行此测试并打印结果的源代码:

1 个答案:

答案 0 :(得分:4)

只有当您通过代理服务器时才会在请求行中提供完整的URL。对Web服务器的直接请求需要遵循示例中request2中的表单。

查看源代码,您将请求发送到端口80,几乎100%意味着它们不通过代理。我的猜测是你需要将request1发送到端口8080或你的代理正在监听的任何端口。

至于RFC,请查看section 5.1.2。请注意,绝对路径用于代理,以及与原始服务器的相对路径。