![使用 tcpserver 处理 http 请求](https://linux22.com/image/1266329/%E4%BD%BF%E7%94%A8%20tcpserver%20%E5%A4%84%E7%90%86%20http%20%E8%AF%B7%E6%B1%82.png)
我正在尝试使用 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)将消息标头与正文分开。