nginx返回错误长度的netstring?

时间:2015-03-05 16:43:11

标签: nginx scgi

我在运行最新OSX的mac上通过macports安装了nginx(nginx version: nginx/1.7.9)。

我配置了一个URI来使用SCGI:

location /server {
    include /Users/ruipacheco/Projects/Assorted/nginx/conf/scgi_params;
    scgi_pass unix:/var/tmp/rpc.sock;
    #scgi_pass 127.0.0.1:9000;
}

当我在127.0.0.1/server上发出GET请求时,我在SCGI服务器上看到以下内容:

  

633:CONTENT_LENGTH0REQUEST_METHODGETREQUEST_URI / serverQUERY_STRINGCONTENT_TYPEDOCUMENT_URI / serverDOCUMENT_ROOT /选择/本地/ htmlSCGI1SERVER_PROTOCOLHTTP / 1.1REMOTE_ADDR127.0.0.1REMOTE_PORT62088SERVER_PORT80SERVER_NAMElocalhostHTTP_HOST127.0.0.1HTTP_CONNECTIONkeep-aliveHTTP_CACHE_CONTROLmax年龄= 0HTTP_ACCEPTtext / HTML,应用/ XHTML + xml的,应用/ XML; Q = 0.9,图像/ WEBP, / 的; q = 0.8HTTP_USER_AGENTMozilla / 5.0   (Macintosh; Intel Mac OS X 10_10_2)AppleWebKit / 537.36(KHTML,如   Gecko)Chrome / 40.0.2214.115   Safari / 537.36HTTP_DNT1HTTP_ACCEPT_ENCODINGgzip,收缩,   sdchHTTP_ACCEPT_LANGUAGEen-US,en; q = 0.8,文件结束

问题是netstring的长度633与解释不匹配。如果我正确理解了netstrings spec,则633应该是第一个:和最后一个,之间的字符长度:

  

任何8位字节的字符串都可以编码为[len]“:”[string]“,”。这里[string]是字符串,[len]是一个非空的ASCII数字序列,以十进制表示[string]的长度。 ASCII数字是< 30>对于0,< 31>对于1,依此类推至< 39>对于[len]前面的额外零是被禁止的:[len]以< 30>开头。确切地说[string]为空。

例如,字符串hello world!编码为31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c,即12:hello world!,

所以,我的错误长度。怎么解释这个?

2 个答案:

答案 0 :(得分:1)

据我所知,您的示例响应具有正确的长度。

根据这里的例子: http://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface

字段值之前和之后是< 00>。符号(带十六进制代码00的ASCII符号),例如:

REQUEST_METHOD <00>GET<00>

一旦我在您的回复片段中添加了缺失的空格 - 它会很快恢复到633字节,正如所宣传的那样。

我想在某个地方正在将这个回复传递给我们,有些软件被剥夺了,这是完全正常的行为吗?

无论如何,答案似乎是 - 你的nginx要么返回一个正确的长度,要么你的回复正在剥离&lt; 00&gt;在某处。

答案 1 :(得分:-1)

好吧,

十六进制<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21>ASCII中是"12:hello world!"(没有引号),长度是12(你好世界!)

示例中的这个<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>是错误的(至少它与nginx规范不匹配。)(因为内部长度为13,以十六进制指定的长度为12) :

ASCII "12:hello world!,"应为"13:hello world!,",并且为十六进制<31 33 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>

这一行是混乱:

  

例如,字符串“hello world!”编码为&lt; 31 32 3a 68 65   6c 6c 6f 20 77 6f 72 6c 64 21 2c&gt;,即“12:hello world!”。

OK) 12:hello world!  ---> <31 *32* 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21>

KO) 12:hello world!, ---> <31 *32* 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>

OK) 13:hello world!, ---> <31 *33* 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>

**内的十六进制是长度的第二个数字。

然后你关于这个的概念好了,这个例子很糟糕。