php 上 http 响应的神秘数据

mysterious data on http response on php

我为 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);
    }

知道这些值的来源吗?

虽然您没有显示发送的请求和响应 header,但我猜您发送了 HTTP/1.1 请求并且响应 header 包含 Transfer-Encoding: chunked。在这种情况下,请求 body 不是长度由 Content-length header 定义的单个片段,而是请求 body 以多个块发送,每个块都以其前缀十六进制长度。有关详细信息,请参阅 the relevant part of the standard