我正在用 nc 测试 HTTP 流水线,
因此我创建了一个包含以下行的输入文件,
GET / HTTP/1.1
Host: localhost
GET / HTTP/1.1
Host: localhost
现在我用 nc 提交,
nc localhost 80 < test
但是我只收到了一个 HTTP 响应,这是怎么回事?而且 nc 只是在这里等待某事,它没有返回到控制台。
答案1
如果你希望能够在一个连接中提交多个请求,则需要保持活动状态:
GET / HTTP/1.1
Host: localhost
Connection: keep-alive
不幸的是,服务器并不总是必须遵从您的请求。它可能会回复Connection: close
或Connection: keep-alive
。如果它回复前者,您就无法通过管道传输请求,并且需要使用两个连接。由于通过管道传输某些内容到 netcat 无法做出这样的决定,因此您可能只想保持安全并使用两个连接。
答案2
问题可能出在你的 HTTP 服务器上。不是每个服务器都支持流水线。Libevent才不是例如(libevhtp 是正在修复为了它)。
我使用 nginx HTTP 服务器进行 nc 和流水线操作没有任何问题:
$ echo -en "GET / HTTP/1.1\r\nHost: fropl.com\r\n\r\nGET / HTTP/1.1\r\nHost: fropl.com\r\n\r\n" | nc localhost 80
HTTP/1.1 401 Unauthorized
Server: nginx/1.2.1
Date: Sat, 08 Jun 2013 21:38:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
WWW-Authenticate: Basic realm="frople"
HTTP/1.1 401 Unauthorized
Server: nginx/1.2.1
Date: Sat, 08 Jun 2013 21:38:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
WWW-Authenticate: Basic realm="frople"
附言:可以使用 telnet 或 Perl如果你怀疑nc。