如何在发出原始 HTTP 请求时轻松解码 HTTP-chunked 编码字符串?

2023-12-03

我想发出 HTTP 请求而不依赖于 cURL 和allow_url_fopen = 1通过打开套接字连接并发送原始 HTTP 请求:

/**
 * Make HTTP GET request
 *
 * @param   string   the URL
 * @param   int      will be filled with HTTP response status code
 * @param   string   will be filled with HTTP response header
 * @return  string   HTTP response body
 */
function http_get_request($url, &$http_code = '', &$res_head = '') 
{
  $scheme = $host = $user = $pass = $query = $fragment = '';
  $path = '/';
  $port = substr($url, 0, 5) == 'https' ? 443 : 80;

  extract(parse_url($url)); 

  $path .= ($query ? "?$query" : '').($fragment ? "#$fragment" : '');

  $head = "GET $path HTTP/1.1\r\n"
        . "Host: $host\r\n"
        . "Authorization: Basic ".base64_encode("$user:$pass")."\r\n"
        . "Connection: close\r\n\r\n";

  $fp = fsockopen($scheme == 'https' ? "ssl://$host" : $host, $port) or 
    die('Cannot connect!');

  fputs($fp, $head);
  while(!feof($fp)) {
    $res .= fgets($fp, 4096);
  }
  fclose($fp);

  list($res_head, $res_body) = explode("\r\n\r\n", $res, 2);
  list(, $http_code, ) = explode(' ', $res_head, 3);

  return $res_body;
}

该函数工作正常,但由于我使用的是 HTTP/1.1,响应正文通常返回分块编码细绳。例如(来自维基百科):

25
This is the data in the first chunk

1C
and this is the second one

3
con
8
sequence
0

我不想使用http_chunked_decode()因为它具有 PE​​CL 依赖性,并且我想要一个高度可移植的代码。

如何轻松解码 HTTP 分块编码字符串,以便我的函数可以返回原始 HTML?我还必须确保解码字符串的长度与Content-Length:标头。

任何帮助,将不胜感激。谢谢。


由于该函数返回 HTTP 响应标头,因此您应该检查是否'Transfer-Encoding' is 'chunked'然后解码分块编码的字符串。 在伪代码中:

CALL parse_http_header
IF 'Transfer-Encoding' IS 'chunked'
  CALL decode_chunked

解析HTTP响应头:

下面是将 HTTP 响应头解析为关联数组的函数。

function parse_http_header($str) 
{
  $lines = explode("\r\n", $str);
  $head  = array(array_shift($lines));
  foreach ($lines as $line) {
    list($key, $val) = explode(':', $line, 2);
    if ($key == 'Set-Cookie') {
      $head['Set-Cookie'][] = trim($val);
    } else {
      $head[$key] = trim($val);
    }
  }
  return $head;
}

该函数将返回一个像这样的数组:

Array
(
    [0] => HTTP/1.1 200 OK
    [Expires] => Tue, 31 Mar 1981 05:00:00 GMT
    [Content-Type] => text/html; charset=utf-8
    [Transfer-Encoding] => chunked
    [Set-Cookie] => Array
        (
            [0] => k=10.34; path=/; expires=Sat, 09-Jun-12 01:58:23 GMT; domain=.example.com
            [1] => guest_id=v1%3A13; domain=.example.com; path=/; expires=Mon, 02-Jun-2014 13:58:23 GMT
        )
    [Content-Length] => 43560
)

请注意如何Set-Cookie标头解析为数组。您稍后需要解析 cookie,将 URL 与需要发送的 cookie 相关联。


解码分块编码的字符串

下面的函数将分块编码的字符串作为参数,并返回 解码后的字符串。

function decode_chunked($str) {
  for ($res = ''; !empty($str); $str = trim($str)) {
    $pos = strpos($str, "\r\n");
    $len = hexdec(substr($str, 0, $pos));
    $res.= substr($str, $pos + 2, $len);
    $str = substr($str, $pos + 2 + $len);
  }
  return $res;
}

// Given the string in the question, the function above will returns:
//
// This is the data in the first chunk
// and this is the second one
// consequence
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在发出原始 HTTP 请求时轻松解码 HTTP-chunked 编码字符串? 的相关文章

  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • 用户可以更改 PHP 中 $_SESSION 的值吗?

    这是我的想法 我想知道是否可能 将信息存储在 PHP 的 SESSION 变量中有多安全 在 SESSION 变量中存储变量有两个潜在的 不安全 风险 另一个答案所描述的第一个称为 会话固定 这里的想法是 由于会话 ID 存储在 cooki
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 获取 YouTube 最高缩略图分辨率

    我想获得 youtube 最高缩略图 maxresdefault jpg 像这个 http i ytimg com vi Cj6ho1 G6tw maxresdefault jpg http i ytimg com vi Cj6ho1 G6
  • jQuery ajax 调用包含重音字符的 url 将错误的 Uri 从 IE 发送到服务器

    我在使用 IE 发送包含重音字符的 url 时遇到问题 这是一个简单的函数 function runjQueryTest var url test Beyonc get url function 在服务器 PHP 上我记录了请求uri的值
  • Xdebug V3 不会停止 VSCode 中的断点

    我正在尝试使用 VSCode 在 XAMPP 上进行调试 但没有成功 我知道有很多关于这个的问题 我已经尽了一切努力 但仍然行不通 我的 xdebug 扩展确实有一件奇怪的事情 我目前使用 PHP v7 4 12 和 Xdebug 版本 3
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • 覆盖 FOS 用户包中的“更改密码”模板

    我做了一些研究 遗憾的是找不到任何帮助 因此 我将 FOSUserBundle ChangePasswordAction 渲染到我的模板中 但它显示供应商提供的默认模板 我的渲染控制器的模板 block body h2 Einstellun
  • 是否可以用 PHP 编写电子邮件解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • 如何在codeigniter中将上传图片比例限制为16:9?

    这是我用来上传图像的代码 this gt load gt library upload ext pathinfo file name PATHINFO EXTENSION img name now ext imgConfig upload
  • PHP 编码风格回归;在开关/外壳中

    我们正在尝试为我们的团队实施新的编码风格指南 当未找到 break 时 php codeniffer 会在 switch case 语句上打印警告 如下所示 switch foo case 1 return 1 case 2 return
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 雄辩的第一个 where 子句

    我想知道 Laravel 如何实现雄辩的语法 以便可以静态调用第一个 where 子句User where User where id 23 gt where email email gt first 他们有吗public static f
  • Jquery一键提交多个同名表单

    我有动态创建的循环表单 我需要一键提交所有表单 我正在遵循下面的代码 你能建议我怎么做吗 谢谢
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 矩形超出边界是什么意思

    PPB Graphics2D PaintImageData 矩形超出界限是什么意思 我几乎在我检查的每一段代码中都看到了它 最新的代码是 define my consumer key define my consumer secret oa
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht

随机推荐

  • 是 printf("%d %d", c++, c); 的输出结果也未定义?

    最近看到一个帖子cout 并想知道是否输出 int c 0 printf d d c c 也是未定义的 我在讲座中研究过后缀和前缀运算符仅在获得分号后才增加值 所以根据我的说法 输出0 0是正确的 我在讲座中研究过后缀和前缀运算符仅在获得分
  • codeigniter 中的浏览器缓存问题

    我是代码点火器的新手 我创建了一个登录表单和一个注销部分 当我按下注销部分时 页面将重定向到登录部分 当我单击浏览器中的后退按钮时 它将显示以前的页面 当我单击清除最近历史记录和选择缓存 然后按后退按钮时 它不会显示最近的页面 它只显示登录
  • Glassfish 上的 Spring Boot

    我在 Spring Boot 部署到 GF3 4 期间得到了这个 虽然这是知道问题看到 弹簧启动问题 another 除了 GF 源代码中的 try catch 破解之外 没有其他解决方案 整个问题是关于 Conditional Sprin
  • Java拖放自定义光标

    我使用 JPanel 定义了一个自定义画布样式组件 它将支持将对象拖动到画布上 我似乎无法弄清楚如何使用 TransferHandler 将拖放 DnD 光标更改为自定义光标 例如 我想用我自己的代替 DnD 期间的默认链接光标 有没有办法
  • XCode 4.2.1 上的临时分发 - 权利

    我正在尝试构建我的应用程序以进行临时分发 在 TestFlight 上 我已阅读所有说明并进行了大量网络搜索 我的问题是如何在 Xcode 4 2 1 上创建 entitlements plist 所有说明均表示转到 新建文件 然后在代码签
  • 使用动作监听器获取 JButton 的文本

    有没有理由getText导致error cannot find symbol在代码中显示的动作侦听器内 另外 如果有 我该如何修复这个错误 class openNewPaneActionListener implements ActionL
  • jquery中仅选择第一级元素

    如何仅选择父级的链接元素 ul 从这样的列表中 ul li a href Link a li li a href Link a ul li a href Link a li li a href Link a li li a href Lin
  • 重写实例上的特殊方法

    考虑以下代码 gt gt gt class A object pass gt gt gt def repr self return A gt gt gt from types import MethodType gt gt gt a A g
  • wp_get_attachment_url() 中不带域名的文件路径

    wp get attachment url 处理完整文件路径 例如 http example com wp content uploads 2014 12 aura mp3 我想要没有的网址http example com 所以 我想要上面
  • 在外部库协议中添加和使用新方法时发出警告

    我正在使用外部库 并且我的视图控制器之一正在注册为该框架中的类的委托 现在 在一个地方我想在这个委托类上执行一些代码 我正在为此编写一个方法并在我的委托上调用它 现在 一切正常 但我收到一条警告 称这个新添加的方法不是协议的一部分 这是我的
  • 正则表达式仅允许 1 个字符

    rex lt gt i 我在使用这个正则表达式时遇到了问题 这个想法是检查输入字段中是否存在某些字符 如果存在 则抛出错误 对于每个长度超过 1 个字符的字符串 此正则表达式会引发错误 谁能告诉我我做错了什么 编辑 人们说他们不明白我想用这
  • ruby:批量初始化实例变量

    有没有一种简单的方法来批量分配实例变量 def initialize title nil label left nil label right nil color set nil title title label left label l
  • 为什么在初始化 Spring 时会出现 NullPointerException

    我在服务器上运行批处理作业时遇到问题 而它在我的开发工作站上的 Eclipse 中运行良好 我已经使用 Roo 设置了 Spring 环境 创建了一个实体 并制作了一个可以完成一些工作的批处理 并在我的开发盒上对其进行了良好的测试 我初始化
  • 如何在 Firemonkey 中使用动画 gif?

    如何在 Firemonky 中使用动画 GIF 我可以使用 Timage 加载 gif 但它不是动画 我正在使用 Delphi 10 2 东京 也许有点晚了 但在此页面上找到了一个简单的解决方案 http www raysoftware c
  • Python 将空格分隔的文件行读取为单独的行

    这是在 Windows Server 2008 R2 上 我有一个输入文件 每行一个输入 一些输入中包含空格 我尝试使用下面的简单代码 但它分离出每个单词而不是每行 我最终应该有 208 个新文件夹 删除所有空格 但因此我最终得到 230
  • 为 .NET 5 Core 控制器单元测试模拟或创建实用的 ODataQueryOptions

    我正在将现有的 API 迁移到 net 5 并且面临单元测试迁移的问题 我想保留测试和测试控制器 但我找不到处理 ODataQueryOptions 的方法 因为此类已更改 我无法再找到创建 ODataQueryOptions 的方法 与我
  • JOptionPane - 检查用户输入并防止关闭,直到满足条件

    请有人告诉我是否有一种方便的方法可以防止JOptionPane除非满足用户输入字段的条件 否则单击 确定 后关闭 或者我别无选择只能使用JFrame 到目前为止我的验证逻辑 似乎不起作用 因为由于某种原因这些按钮是一次性可点击的 final
  • Typhoon 与 Storyboard,实例化 ViewController

    在台风中使用故事板时 如果我在程序集中执行类似的操作 id myController return TyphoonDefinition withClass BigController class configuration TyphoonD
  • 如何为 https Web 服务器创建 .pem 文件

    我使用 Node js 中的 Express 框架来创建 Web 服务器 我想使用 ssl 进行 Web 服务器的连接 创建 https Web 服务器的代码如下 var app express createServer key fs re
  • 如何在发出原始 HTTP 请求时轻松解码 HTTP-chunked 编码字符串?

    我想发出 HTTP 请求而不依赖于 cURL 和allow url fopen 1通过打开套接字连接并发送原始 HTTP 请求 Make HTTP GET request param string the URL param int wil