我正在节点服务器上创建资源并将ETag附加到每个资源上。我正在使用此问题What encoding should I use to properly generate an ETag with crypto in nodeJS?中的方法生成ETag。但是,当我使用curl在命令行上执行HEAD
请求时,例如:
$ curl -i -u username:password -X HEAD http://localhost:3000/aResource/0
答案是
HTTP/1.1 200 OK
X-Powered-By: Express
ETag: "1a37c148692f92ad6c97887f77c873e6"
Content-Type: text/plain
Date: Sat, 26 Oct 2013 01:06:28 GMT
Connection: keep-alive
^C
$
我必须专门按Control-C
才能再次看到命令提示符。另一方面,我发现这很奇怪,因为我处理HEAD
请求的方式是通过节点上的app.head,在验证后我调用函数:
function serveResourceEtag(req, res) {
console.log("Following route through HEAD");
var anID = parseInt(req.params[resourceID], "utf8");
if (anID < serverData.resourceEtags.length) {
res.writeHead (200, {"ETag": "\"" + serverData.resourceEtags[anID] + "\"", "Content-Type": "text/plain"});
res.end();
}
else {
res.writeHead (404, {"Content-Type": "text/plain"});
res.end();
}
};
换句话说,即使我有res.end();命令到底,由于某种原因传输还没有停止。据我所知,HEAD
请求应获得与GET
请求相同的标头。与GET
的区别在于HEAD
我们没有GET
请求的正文。你能说出这里似乎有什么问题吗?
答案 0 :(得分:7)
你对HTTP方法的行为是对的,你想要的只是卷曲错了:
curl -I -u username:password http://localhost:3000/aResource/0
不是-X HEAD说的是使用HTTP的HEAD方法而不是仅返回标题的GET
答案 1 :(得分:1)
这不是你服务器的错。当我curl -i -X HEAD http://google.com
时,我必须杀死curl才能返回提示,这很奇怪,因为curl GET请求实际上会让我回到提示符。