6

我正在节点服务器上创建资源并将 ETag 附加到每个资源。我正在使用这个问题中找到的方法我应该使用什么编码在nodeJS中正确生成带有加密的ETag?用于生成 ETag。但是,当我HEAD使用 curl 在命令行上发出请求时,例如:

$ 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。与 a 的区别GET在于,在HEAD我们没有GET请求正文的情况下。你能告诉这里似乎是什么问题吗?

4

2 回答 2

8

你对 HTTP 方法的行为是正确的,只是 curl 是错误的,你想要:

curl -I -u username:password http://localhost:3000/aResource/0

not -X HEAD 表示使用 HTTP 的 HEAD 方法而不是仅返回标头的 GET

于 2013-10-26T01:46:13.603 回答
1

这不是你服务器的错。当我这样做时,curl -i -X HEAD http://google.com我必须杀死 curl 才能回到提示符,这很奇怪,因为 curl GET 请求实际上确实让我回到了提示符。

于 2013-10-26T01:45:52.143 回答