php - 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);
}
这些值来自哪里的任何想法?
解决方案
虽然您没有显示您发送的请求以及您得到的响应标头,但我的猜测是您发送了一个HTTP/1.1
请求并且响应标头包含Transfer-Encoding: chunked
. 在这种情况下,请求正文不是具有由Content-length
标头定义的长度的单个部分,而是请求正文以多个块的形式发送,每个块都以其十六进制长度为前缀。有关详细信息,请参阅标准的相关部分。
推荐阅读
- python - 使用 ForeignKey 在 Django 中查询集过滤器()
- html - CYPRESS:检查列表中的每个项目
- docker - 尝试启动 Docker 容器时出现用户错误
- swift - 无法转换 Observable 类型的类型值
到预期的参数类型 Observable - mysql - 有没有办法通过 mysqlworkbench 更改存储过程所需的权限?
- php - 按顺序对这些变量进行排序(将单词转换为等于其长度的数字)。(使用条件)
- python - 为什么 Python 不能为我识别“kivy”模块?
- swift - 在 Combine 中链接 n 个请求
- rust - 如何通过回调管理生命周期
- python - VScode 在 scipy stats 中找不到模块规范