有一个答案通过 HTTP 提供文件服务nc
{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -l -p 8080
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080
一条评论说:
除非您使用第二个 nc 命令,否则 Chrome 不会停止跳动。
此外,并非两个 nc 命令 show 都会在响应后退出。您可以使用以下命令继续重新启动它:
while :; do { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080; done
。使用 ctrl+z 使其进入睡眠状态。
跳动是否意味着网络浏览器会自动重新加载 URL?
添加到第一个 nc 命令的第二个 nc 命令的目的是Content-Length: $(wc -c <some.file)
阻止 Chrome 跳动吗?
URLhttp://IP:8080/
后面不加任何内容或任何内容都可以在 Web 浏览器中获取文件。这种灵活性是由 HTTP 协议nc
还是 Web 浏览器提供的?
谢谢。
答案1
Chrome 继续使用该命令的第一个版本,因为它不知道发送的文件有多大,所以它不知道何时收到全部文件,这种跳动意味着它仍在等待查看是否还有更多文件。
第二个版本在文件内容之前添加了带有有效负载大小的 HTTP 标头,因此 chrome 现在知道它还需要多少数据,并在到达文件末尾时将事务标记为完成。
nc
结合HTTP/1.0 200 OK\r\n
实现 HTTP 协议发送内容所需的绝对最低限度(实际上不是,但它接受的内容非常慷慨),添加了Content-Length
更接近规范的动作。 HTTP协议有详细的文档,我建议你阅读射频卡
编辑:
- 跳动意味着浏览器认为页面尚未加载完毕。因此,在 chrome 确定它拥有所有文件之前,它会一直跳动。
- 您需要去了解 URL 的组成部分,但端口号后面的部分指向您希望服务器提供的资源。在这种情况下,服务器并不关心你要求什么,它总是会返回
some.file
- 我真的无法回答这个问题,我希望这是一个错字,应该
note
是not
答案2
在 HTTP/1.0 中,如果响应中缺少 Content-Length 标头,则通过关闭套接字来指示响应的结束。nc
默认情况下不会执行此操作,因此 chrome(或任何其他浏览器)会“永远”等待(“颤动”)这种情况发生。
在第一个命令中添加-N
参数,它应该可以正常工作:nc
{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -N -l -p 8080
请注意,HTTP/1.0 中不需要 Content-Length 标头(rfc1945 第 7.2.2 节) 除非需要一个主体并且它是空的 (第 7.2 节)。
URLhttp://IP:8080/
使浏览器将 IP 和端口之后的任何内容发送到服务器,在本例中,仅发送最后一个/
作为它希望从服务器获得什么的指示。在示例 nc 命令中,/
浏览器发送的(或其他任何实际内容)将被完全忽略,并且响应始终相同。所以你可以使用http://IP:8080/hello/world.png
相同的结果。