【问题标题】:nginx returning netstring with wrong length?nginx返回长度错误的网络字符串?
【发布时间】:2015-03-05 16:43:10
【问题描述】:

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

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

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/opt/local/htmlSCGI1SERVER_PROTOCOLHTTP/1.1REMOTE_ADDR127.0.0.1REMOTE_PORT62088SERVER_PORT80SERVER_NAMElocalhostHTTP_HOST127.0.0.1HTTP_CONNECTIONkeep-aliveHTTP_CACHE_CONTROLmax-age=0HTTP_ACCEPTtext/html,application/xhtml+xml,application/xml;q=0.9,图片/webp,/;q=0.8HTTP_USER_AGENTMozilla/5.0 (Macintosh;英特尔 Mac OS X 10_10_2)AppleWebKit/537.36(KHTML,如 壁虎)铬/40.0.2214.115 Safari/537.36HTTP_DNT1HTTP_ACCEPT_ENCODINGgzip,放气, sdchHTTP_ACCEPT_LANGUAGEen-US,en;q=0.8,文件结束

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

任何 8 位字节的字符串都可以编码为 [len]":"[string]","。这里 [string] 是字符串, [len] 是 ASCII 数字的非空序列,以十进制表示 [string] 的长度。 ASCII 数字是 表示 0, 表示 1,以此类推直到 表示 9。禁止 [len] 前面的额外零:[len] 以 开头,恰好在 [ string] 为空。

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

所以,我弄错了长度。这怎么解释?

【问题讨论】:

  • 您应该考虑尝试将 SCGI 服务器移动到虚拟机并使用 tcpdump 来查看 nginx 从服务器请求的确切内容。

标签: nginx scgi


【解决方案1】:

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

根据此处的示例: http://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface

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

REQUEST_METHOD <00>GET<00>

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

我想在将响应传递给我们的过程中的某个地方,一些软件剥离了 的,这是完全正常的行为?

无论如何,答案似乎是——你的 nginx 要么返回正确的长度,要么你的响应在某处剥离 。

【讨论】:

    【解决方案2】:

    嗯,

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

    示例中的&lt;31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c&gt; 是错误的(至少它不符合 nginx 规范。)(因为内部长度为 13,十六进制指定的长度为 12):

    ASCII "12:hello world!," 应该是 "13:hello world!," 和十六进制 &lt;31 33 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c&gt;

    这一行是一团糟:

    例如,字符串“hello world!”编码为 ,即“12:你好世界!”。

    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>
    

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

    那么你对这个的概念好吧,这个例子很糟糕。

    【讨论】:

    • 但是 nginx 返回一个非常不同的数字。
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多