Node.js http请求上的ParseError

时间:2012-06-25 17:22:11

标签: http node.js

Hello StackOverflow社区!

我最近开始学习Node.js,并决定将反向HTTP代理实现为一项任务。有几个粗糙的地方,我自己设法通过,但现在我有点卡住,需要你的帮助。我设法处理重定向和相对URL,并且通过实现相对url支持,我遇到了我将要描述的问题。

您可以在http://pastebin.com/vZfEfk8r找到我的代码。它不是很大,但仍然不适合这个页面。

所以问题(其中有2个)。我正在使用http.request将客户端的请求转发到目标服务器,然后等待响应并将此响应发送回客户端。它适用于某些请求,但不适用于其他请求。这是第一个问题:在网站上我用来测试代理(http://ixbt.com,关于技术的酷俄网站)我总是可以得到主页/index.html,但是当浏览器开始获取从该页面引用的其他文件(css,img等),大多数请求以ParseError结尾({“bytesParsed”:0})。

在调试时(使用Wireshark)我注意到,当代理服务器和目标服务器之间发生以下HTTP协商时,某些请求(如果不是全部)都会因此错误而失败:

请求:

GET articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1
Host: www.ixbt.com
Connection: keep-alive

响应:

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

看起来服务器不发送状态代码,也没有标头。所以问题是,这可能是失败的原因(ParseError)吗?

我的另一个问题是,当我试图获得与独立请求相同的文件时,我没有任何问题。看看:

请求:

GET /articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1
Host: www.ixbt.com
Connection: keep-alive

响应:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 25 Jun 2012 17:09:51 GMT
Content-Type: image/jpeg
Content-Length: 3046
Last-Modified: Fri, 22 Jun 2012 00:06:27 GMT
Connection: keep-alive
Expires: Wed, 25 Jul 2012 17:09:51 GMT
Cache-Control: max-age=2592000
Accept-Ranges: bytes

... and here goes the body ...

因此,在一天结束时,我如何处理代理请求可能会有一些错误。也许这是因为我实际上做了很多,当主页加载时 - 它有很多图像等?

我希望我很清楚,但如果我错过了什么,请询问细节。并且完整的源代码是可用的(再次,在http://pastebin.com/vZfEfk8r),所以如果有人会尝试它,那将是非常好的。 :)

提前多多谢谢!

P.S。正如我所说,我只是在学习,所以如果你在我的代码中看到一些不好的做法(甚至与问题无关),那就很了解它们。

更新:正如评论中提到的,我没有代理原始请求的标头,理论上这可能会导致以下请求出现问题。我改变了,但不幸的是,行为保持不变。以下是新请求和响应的示例:

请求

GET css/main_fixed.css HTTP/1.1
Host: www.ixbt.com
connection: keep-alive
cache-control: no-cache
pragma: no-cache
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
accept: text/css,*/*;q=0.1
accept-encoding: gzip,deflate,sdch
accept-language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
accept-charset: windows-1251,utf-8;q=0.7,*;q=0.3
referer: http://www.ixbt.com/

响应

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

我不得不手工制作'referer'标题,因为浏览器正在使用反向代理URL发送它。你可以看到,行为仍然是一样的。还有其他想法吗?

2 个答案:

答案 0 :(得分:5)

感谢有价值的评论,我能够找到这个问题的答案。它与Node或目标Web服务器无关,只是编码错误。 答案是url的path组件对于相对url是错误的。它已经可以从问题正文中的日志中看到。我在此重复一遍,重申:

错误请求:

GET articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1

正确的要求:

GET /articles/pics2/201206/coolermaster-computex2012_70x70.jpg HTTP/1.1

看到区别?领先的斜线。事实证明,由于我自己笨拙的客户端网址处理,我错过了我对相对网址的请求。但是通过快速而肮脏的修复,它现在正在运行,直到我将对客户端进行正确的URL处理。

非常感谢您的评论,他们很有见地!

答案 1 :(得分:1)

如果上述解决方案不起作用,请尝试删除content-length标头。内容长度不匹配会导致正文解析器导致此错误