如何处理来自代理的额外 HTTP 标头?

2024-03-29

我们的环境需要使用出站代理来提供异地服务。通常这不是问题。在 Twilio 的这种情况下,返回的额外标头会破坏客户端。

传出标头:

POST /2010-04-01/Accounts/FOO/SMS/Messages.json HTTP/1.1
Authorization: Basic FOO==
User-Agent: twilio-php/3.10.0
Host: api.twilio.com
Accept: */*
Accept-Charset: utf-8
Content-Type: application/x-www-form-urlencoded
Content-Length: 108

响应标头:

HTTP/1.0 200 Connection established

HTTP/1.1 201 Created
Server: nginx
Date: Thu, 06 Jun 2013 14:39:24 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 551
Connection: close
X-Powered-By: PHP/5.3.11

我只能假设代理正在添加额外的 HTTP 标头。

Twilio 客户端会检查:

list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue') 

据我了解,有些时候或版本的curl会自动在请求中添加Expect标头,并且响应中会返回HTTP 100,但在这种情况下不是,响应是200 连接已建立。值得添加一个空的 Expect: 或 Expect:bacon 并没有改变结果。

我真的不想在这里过多地修改 Twilio 客户端,而且我特别想避免仅仅添加 || $parts[0] == 'HTTP/1.0 200 连接已建立',因为看起来很混乱。

是否可以在 中发送请求标头来抑制/隐藏额外的标头?或者,我没有看到忽略它的卷曲选项?

出站代理是Linux/Squid


代理问题是很多脚本都面临的问题。我在互联网上找到的首选解决方案是简单地添加以下代码行。

<?php
// cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string
if (false !== stripos($response, "HTTP/1.0 200 Connection established\r\n\r\n")) {
  $response = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $response);
}
?>

现在将其添加到 twilio 客户端确实会有点混乱。幸运的是,您可以使用命名空间来重新创建本机函数。请参阅以下示例。

<?php
namespace FakeCurl;

//create curl_exec function with same name, but its created in the FakeCurl namespace now.
function curl_exec($ch) {
  //execute the actual curl_exec function in the main namespace
  $response =  \curl_exec($ch);

  // cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string
  if (false !== stripos($response, "HTTP/1.0 200 Connection established\r\n\r\n")) {
    $response = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $response);
  } 

  return "ADDED TO RESPONSE\r\n\r\n".$response;
}

//make a regular curl request, no alterations.

$curl = curl_init();
curl_setopt_array( $curl, array(
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => 'http://stackoverflow.com' ) );
$response = curl_exec( $curl );
curl_close( $curl );

echo '<pre>'.$response.'</pre>';

?>

Output

ADDED TO RESPONSE

HTTP/1.1 200 OK
Cache-Control: public, max-age=11
Content-Length: 191951
Content-Type: text/html; charset=utf-8
Expires: Wed, 12 Jun 2013 07:09:02 GMT
Last-Modified: Wed, 12 Jun 2013 07:08:02 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Wed, 12 Jun 2013 07:08:49 GMT

因此,要与 twilio 客户端一起使用,您需要将以下内容放在脚本的最顶部:

<?php
namespace FakeCurl;
function curl_exec($ch) {
  $response =  \curl_exec($ch);

  // cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string
  if (false !== stripos($response, "HTTP/1.0 200 Connection established\r\n\r\n")) {
    $response = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $response);
  } 

  return $response;
}

include("twilio.php");
?>

如果命名空间选项由于某种原因失败,我会在 twilio 客户端之外添加一个简单的函数,例如。

<?php
function fixProxyResponse($response) {
  // cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string
  if (false !== stripos($response, "HTTP/1.0 200 Connection established\r\n\r\n")) {
    $response = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $response);
  } 

  return $response;
}

然后修改 twilio 脚本TinyHttp.php并仅更改以下行 (~linenr 63)

if ($response = curl_exec($curl)) {
  $parts = explode("\r\n\r\n", $response, 3);
  list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue')

to

if ($response = curl_exec($curl)) {
  $parts = explode("\r\n\r\n", fixProxyResponse($response), 3);
  list($head, $body) = ($parts[0] == 'HTTP/1.1 100 Continue')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理来自代理的额外 HTTP 标头? 的相关文章

随机推荐

  • 如何从作业中设置环境变量并在詹金斯的下一个作业中使用它?

    我想要一份设置环境变量的工作 并在接下来的所有工作中使用这些环境变量 如何通过 Jenkins 设置环境变量 从技术上讲 您无法将环境变量从一个作业传递到下一个作业 而且我不知道有一个插件可以开箱即用地执行此操作 不过有一个技巧 这个想法是
  • 如何使用多个类的序列化来实现备份和恢复?

    我正在尝试序列化存储在 JTable 中的对象 名称和注释 我希望能够将此信息保存到文件中 并且当我加载程序时 该信息应加载到 JTable 中 当我单击备份按钮时 正在创建一个文件 但没有存储任何数据 有人可以指导我正确的方向并告诉我我做
  • 将 Python Opencv 图像(numpy 数组)转换为 PyQt QPixmap 图像

    我正在尝试将 python opencv 图像转换为 QPixmap 我按照说明进行操作页面链接 http russellj tumblr com post 44845729156 convert python opencv image n
  • 编辑中的字段唯一(已采用)?

    当我编辑用户时 我遇到验证问题 因此 当我编辑时 我收到消息称该名称已被占用 我怎样才能解决这个问题 因为该名称属于该用户 所以我需要再次更改名称 以便我可以编辑我的用户 if user gt business user this gt v
  • 如何编辑 Visual Studio Code 的默认深色主题?

    我使用的是 Windows 7 64 位 有没有办法在 Visual Studio Code 中编辑默认的深色主题 在 USERPROFILE vscode文件夹中只有扩展中的主题 而在安装路径中 我使用默认值 C Program File
  • Windows Azure /Windows Server 2008 R2 中的 NAudio

    我在用NAudio http naudio codeplex com 将几个 mp3 文件合并在一起以形成 Windows Azure 产品 它在开发环境中工作正常 但一旦我将其上传到 Azure 我就会收到 无驱动器调用 acmForma
  • Java 中的 \x 转义?

    我想知道 Java 中是否有类似 C 中的十六进制 x 转义 例如 char helloworld x48 x45 x4C x4C x4F x20 x57 x47 x52 x4C x44 printf s helloworld 从目前看来
  • Vaadin:如何将 META-INF/服务添加到战争中?

    我有一个 Vaadin 7 maven Web 项目 其中有一些注释可以在其上创建服务定义META INF services 我将其添加到 pom 中 以便处理注释
  • GCP Pub/Sub,如果已经有活动订阅,您可以在新订阅上重播旧消息吗

    在 GCP Pub Sub 中 我有一个主题和一个Subscription1并已开始发布消息 我可以添加另一个订阅吗Subscription2并重播之前发布的旧消息Subscription2被创造了 它会允许吗 卡夫卡允许 在什么时候我会失
  • C++ 模板正式排序规则

    我很难理解 D Vandevoorde 和 N M Josuttis 所著的 C 模板完整指南 一书第 12 章中描述的正式排序规则的工作原理 在本书第 188 页 作者给出了以下场景 用于确定两个可行的函数模板中哪一个更专业 从这两个模板
  • Flutter - 获取 SHA-1 证书 - Android Studio 3.2.1

    我正在尝试检索我的 Flutter 项目的 SHA 1 指纹证书 这通常可以通过进入 Android Studio 右侧的 Gradle 面板并单击signingReport 然而问题是 在 Flutter 中 它根本不显示 Gradle
  • Laravel 可以处理高流量应用程序吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个 PHP MySQL 社交网络项目 该项目将包含许多模块 部分 包括 用户系统 权限 配置文件 设置等 stackoverflow
  • Tomcat 9 的 Maven 插件

    除了 tomcat7 maven plugin 之外 我没有找到任何 tomcat maven plugin 我可以将其与 apache tomcat 9 0 0 M15 一起使用吗 您可以使用该插件部署到单独运行的 tomcat 9 Th
  • 自定义样式的 AlertDialog 的样式属性

    我正在尝试设计我的 AlertDialog 的样式 并且我已经能够通过样式和 xml 声明更改其中的大部分内容 但仍然存在一些问题 如何将标题栏周围的区域从黑色更改为我的自定义颜色 如何将外部背景更改为透明 阴影落在蓝色的外部部分 如何更改
  • “yes”这个程序有什么重要用途吗?

    当我第一次遇到yes nix 中的程序我想不出它有什么重要用途 这个程序是如何使用的 yes旨在自动化需要在采取行动之前确认的交互式程序 yes rm ri foo 大致相当于 rm rf foo 不同之处在于 f失败时也会继续
  • Rails 4 jQuery 与 javascript 冲突

    我正在尝试在 Rails 4 中制作一个应用程序 我正在挣扎 我正在尝试合并引导主题 但我遇到了供应商 JavaScript 和其余代码的问题 我认为问题可能与我的 application js 中的 jQuery 以及以 符号开头的供应商
  • 按名称实例化 Java lambda 函数

    我想在 Java 8 中创建一个 lambda 函数 获取它的类名 然后从它的类名再次实例化该函数 这就是我尝试的 import java util function Consumer public class SimpleLambda p
  • ajax 与常规表单数据的安全性

    只是想知道安全性的差异
  • Websphere Application Server 6.1(本地化):覆盖控制台消息的区域设置

    我已经安装了西班牙语版本的 RAD 7 5 基于 Eclipse Ganymede 3 4 0 我正在与Websphere 应用程序服务器 6 1 也是西班牙语 我遇到的问题是所有控制台消息都以西班牙语显示 但在我个人看来 翻译相当差 特别
  • 如何处理来自代理的额外 HTTP 标头?

    我们的环境需要使用出站代理来提供异地服务 通常这不是问题 在 Twilio 的这种情况下 返回的额外标头会破坏客户端 传出标头 POST 2010 04 01 Accounts FOO SMS Messages json HTTP 1 1