1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2016年2月8日 |
---|
#16 in #cgi
14KB
261 行
cgid
cgid
是一个UCSPI兼容的CGI服务器。它目前支持恰好一个脚本,尽管有计划支持目录。
用法
以下是使用cgid
与UCSPI
的一些示例
nosh
#!/bin/nosh
tcp-socket-listen 127.0.0.1 6000
tcp-socket-accept --no-delay
cgid
www/cgi-bin/my-cgi-script
s6
#!/bin/execlineb
s6-tcpserver 127.0.0.1 6000
cgid
www/cgi-bin/my-cgi-script
(其他示例也非常欢迎)
描述
cgid
实现了CGI
协议的一个(希望是合理的)子集。它很可能有明显的缺失功能,因为我只在其下面运行了一个程序。欢迎提交错误报告和补丁。
已知错误和限制
第一个响应头必须是Status
据我所知,CGI规范允许响应头以任何顺序出现。由于我的所有应用程序都首先设置了状态,因此我没有编写在设置状态之前缓冲其他头的代码。按照现状,设置在状态之前的所有头都将被丢弃。我预计有机会时会解决这个问题。
SCRIPT_NAME
被硬编码为空字符串
如果我对RFC3875
的阅读正确,则SCRIPT_NAME
应该是正在运行的脚本。鉴于这个服务器只运行一个脚本,我认为设置这个环境变量并不重要。如果将来我支持目录而不是单个脚本,我会解决这个问题。
仅支持HTTP/1.*
技术上HTTP/1.0
支持HTTP/0.9
,它支持没有响应代码或头的响应。出于简单起见,这不被支持。
不支持响应Content-Length
出于性能和简单性的考虑,响应体从应用程序流式传输到客户端,因此Content-Length
是未知的,除非应用程序自己设置了响应头,否则无法发送到客户端。
怪异错误
有一种可能的错误,无法正确报告给客户端。具体来说,如果在从应用程序将响应体流式传输到客户端时发生错误,返回500 Internal Server Error
可能是不可能的,因为应用程序的状态已经设置。