无知的 tonyseek

Yet Another Seeker

[翻译] SCGI 协议规格说明书

知识共享署名-非商业性使用-相同方式共享 3.0 许可协议

  • 原文:Neil Schemenauer <nas at python dot ca> 2008-06-23
  • 翻译:Jiangge Zhang <tonyseek at gmail dot com> 2013-03-17

原文地址: http://python.ca/scgi/protocol.txt

简介

SCGI 协议是通用网关协议(CGI)的替代协议,它描述了一套应用程序和 HTTP 服务器之间的接口标准。它和 FastCGI 协议非常类似,但设计得更加简单和易于实现。

在本文档中,一个 8 位字节串可能被写成两种形式:

  • 以一系列十六进制数字的形式,写在尖括号中;
  • 以一系列 ASCII 字符的形式,写在双引号中。

例如,<68 65 6c 6c 6f 20 77 6f 72 6c 64 21> 是一个长度为 12 的字符串,它和字符串 "hello world!" 是等价的。注意,这仅仅是本文档的一种约定,并不是协议规格的一部分。

协议

客户端通过一个可靠的流协议连接到 SCGI 服务器,这个流协议允许传输 8 位字节串。客户端的工作由发送一个请求开始。请参考第三部分对请求格式的描述。

当 SCGI 服务器读取到请求结束,它会向回发送一个响应并关闭本次连接。本规格说明不约定响应的格式。

请求的格式

一个请求由一系列的请求头和一个请求体构成。请求头的格式如下:

headers ::= header*
header ::= name NUL value NUL
name ::= notnull+
value ::= notnull*
notnull ::= <01> | <02> | <03> | ... | <ff>
NUL = <00>

请求头中不允许出现同样的项名。第一个请求头的项名必须为 CONENTE_LENGTH ,值为一个非空的 ASCII 字符串,包含了请求体长度的字符串形式数字。

请求头项 CONTENT_LENGTH 必须始终被提供,即使它的值是 "0"

除此之外,另一个必须始终被提供的请求头项名是 "SCGI" ,值是 "1"

为了促进从 CGI 到 SCGI 的过渡,应该将标准 CGI 环境变量作为 SCGI 的请求头项提供。

请求头在被发送时,会被编码成 netstring。Netstring 编码方式在本文第四部分解释。请求体在被发送时则尾随在请求头后面,请求体的长度由请求头中的 "CONTENT_LENGTH" 规定。

Netstring 编码

任何 8 位字节串都可以被编码成 [长度]":"[内容]"," 的格式。其中 [内容] 是字节串本身,而 [长度] 是一个非空字节串,以整数的 ASCII 字符串形式记录 [内容] 的长度。这个 ASCII 字符串中,<30> ( "0" )代表整数 0,<31> 代表整数 1,依此类推,直到 <39> 表示整数 9。 [长度] 前面放置多余的 "0" 是不被允许的:如果 [内容] 为空, [长度] 应该以 <30> 打头。

举例说明,字符串 "hello world!" 的编码是 <31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>,即 "12:hello world!," ;空的字符串的编码是 "0:,"[长度]":"[内容]"," 的格式被称为 netstring,而 [内容] 则是该 netstring 的“解释取值结果”。

范例

前端 Web 服务器(即 SCGI 客户端)打开一个连接,并发送以下字符串内容到 SCGI 服务器:

"70:"
    "CONTENT_LENGTH" <00> "27" <00>
    "SCGI" <00> "1" <00>
    "REQUEST_METHOD" <00> "POST" <00>
    "REQUEST_URI" <00> "/deepthought" <00>
","
    "What is the answer to life?"

SCGI 服务器回发了如下响应:

"Status: 200 OK" <0d 0a>
"Content-Type: text/plain" <0d 0a>
"" <0d 0a>
"42"

然后 SCGI 服务器关闭该请求&响应的网络连接。

版权声明

本文档(指原文,译者注)置于公共领域发表。

本文翻译采用 知识共享署名-非商业性使用-相同方式共享 3.0 许可协议 进行许可。

Comments