загадочные данные об ответе http на php - PullRequest
0 голосов
/ 03 августа 2020

Я написал легкую http lib для php, все работает нормально, за исключением того, что ответ превышает определенный размер. Запрос выполняется с помощью stream_socket_client.

Все работает до тех пор, пока тело ответа не будет содержать большие данные, а затем в данные будет вставлен какой-то заполнитель, например:

f7c [{key: value}, {ключ: значение}, {ключ: значение}, {ключ: значение} ... 1000 {ключ: значение}, {ключ: значение}, {ключ: значение}, ...] 1000

в этом примере «f7 c» и «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);
    }

Любые идеи, где эти значения пришли из?

1 Ответ

1 голос
/ 03 августа 2020

Хотя вы не показываете, какой запрос вы отправляете и какой заголовок ответа вы получаете, я предполагаю, что вы отправляете запрос HTTP/1.1 и что заголовок ответа содержит Transfer-Encoding: chunked. В этом случае тело запроса не представляет собой цельный кусок с длиной, определенной заголовком Content-length, а вместо этого тело запроса отправляется несколькими фрагментами, каждый с префиксом его длины в шестнадцатеричном формате. См. в соответствующей части стандарта для получения дополнительной информации.

...