首页 > 解决方案 > php上http响应的神秘数据

问题描述

我为 php 编写了一个轻量级的 http 库,除了响应超过一定大小外,一切正常。该请求是使用 stream_socket_client 发出的。

一切正常,直到响应正文包含更大的数据,然后在数据中插入某种填充,例如:

f7c [{key: value}, {key: value}, {key: value}, {key: value} ... 1000 {key: value}, {key: value}, {key: value}, ... ] 1000

在此示例中,中间和末尾的“f7c”和“1000”不在原始响应正文中

解析响应的代码:

    private function parseInputStream($stream){
        $header = [];
        $body = "";
        $isHeaderParsed = false;
    
        while (!feof($stream)) {
            $line = fgets($stream, 1024);
            if (!$isHeaderParsed){
                if ($line === "\r\n"){
                    $isHeaderParsed = true;
                    continue;
                } else {
                    array_push($header, str_replace("\r\n", "", $line));
                }
            } else {
                $body .= $line;
            }
        }
        $this->parseHeader($header);
        $this->parseBody($body);
    }

这些值来自哪里的任何想法?

标签: phpsocketshttpresponse

解决方案


虽然您没有显示您发送的请求以及您得到的响应标头,但我的猜测是您发送了一个HTTP/1.1请求并且响应标头包含Transfer-Encoding: chunked. 在这种情况下,请求正文不是具有由Content-length标头定义的长度的单个部分,而是请求正文以多个块的形式发送,每个块都以其十六进制长度为前缀。有关详细信息,请参阅标准的相关部分


推荐阅读