使用 tcpserver 处理 http 请求

使用 tcpserver 处理 http 请求

我正在尝试使用 ucspi-tcp 中的 tcpserver 启动一个返回简单网页的脚本。我的脚本(hello.lua)如下:

#!/usr/bin/env lua
print([[HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head>
<title>My title</title>
</head>
<body>
<h1>Hello in big font</h1>
</body>
</html>]])

我启动它tcpserver -v -rh 0 9000 /path/to/hello.lua

当我使用时tcpcat myserver 9000,我得到了预期的回报:
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head>
<title>My title</title>
</head>
<body>
<h1> Hello in big font</h1>
</body>
</html>

但是,当我尝试使用网络浏览器并指向时http:\\myserver:9000,出现浏览器错误(在 Chrome 中)Error 101 (net::ERR_CONNECTION_RESET): Unknown error,尽管 tcpserver 日志显示了一个事务:
tcpserver: status 1/40
tcpserver: pid 21672 from <ip address of browser>
tcpserver: ok 21672 <server hostname>::::ffff:<server ip>:9000 <client hostname>::::ffff:<client ip>::3133
tcpserver: end 21672 status 0

我知道我这里遗漏了一些基本知识,但我无法把这些碎片拼凑起来。任何见解都值得感激!谢谢!

答案1

标题和内容之间需要一个空行:

HTTP/1.1 200 OK
Content-Type: text/html

<html>
<head>
<title>My title</title>
</head>
<body>
<h1>Hello in big font</h1>
</body>
</html>

答案2

RFC2616指定 HTTP 响应的状态行和标头行必须以 CRLF 结尾。如果您在非 Windows 计算机上编写了 lua 脚本,则可能没有正确的 CRLF 行终止符。此外,您需要用空行(单独的 CRLF)将消息标头与正文分开。

相关内容