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。
我为 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。