使用 Python 完全控制 HTTP 请求标头

在这篇博文中,我将展示如何删除任何标头、设置它们的顺序、定义它们的大写以及如何发送重复的标头。

来源:bin.re _恶意软件

恶意服务器,甚至一些 CDN,正在使用 HTTP 标头来识别客户端,并会根据标头的存在、其顺序甚至标头名称的大小写来拒绝查询。根据 RFC 2616,其中许多功能并不重要,这可能就是为什么使用 Python 的请求和 httpx 库无法完全控制 HTTP 标头的原因。

请求 httpx

在这篇博文中,我将展示如何在 HTTP 标头方面实现以下 4 个方面:

    删除任何标头,包括那些通常应该发送的标头,如 User-Agent、按特定顺序排序标头、定义 http 标头的大小写(例如,USER-AGENT 而不是 User-Agent),并允许重复的标头(例如两个 Set-Cache 标头)。
  • 删除任何标头,包括那些通常应该发送的标头,如 User-Agent,
  • 删除 User-Agent
  • 按特定顺序排序标头,
  • 排序
  • 定义 http 标头的大小写(例如,USER-AGENT 而不是 User-Agent),以及
  • 大小写 USER-AGENT User-Agent
  • 允许重复标头(例如两个 Set-Cache 标头)。
  • 重复 Set-Cache

    使用更现代的 httpx 可以实现所有四点,除了更改 Host 标头的顺序或将其完全删除。为了做到这一点,您需要对一些函数进行 monkey patch。

    httpx Host

    非常流行的请求库由于底层的 OrderedDict 数据结构而无法执行重复标头,但您可以控制其余 3 个方面。

    请求 OrderedDict libraryremoveordercaseduplicaterequests✔✔✔❌httpx✔*✔*✔✔
    libraryremoveordercaseduplicate libraryremoveordercaseduplicate 库 删除 订单 案例 重复 请求✔✔✔❌httpx✔*✔*✔✔ 请求✔✔✔❌ 请求 ✔ ✔ ❌ httpx✔*✔*✔✔ httpx httpx ✔* ✔* ✔ ✔ * 除了 Host 之外均可用,因为 Host 需要 monkey patching。

    主机

    请求

    某些标头不遵循指定顺序

    导入请求 导入请求 导入 请求 从 urllib3.util 导入 SKIP_HEADER 从 urllib3.util 导入 SKIP_HEADER 来自 urllib3.util 导入 SKIP_HEADER 来自 集合 = :