HTTP 标头值中允许使用哪些字符?

2023-12-24

学习后HTTP/1.1标准 https://www.ietf.org/rfc/rfc2616.txt,特别是第 31 页和相关内容,我得出的结论是任何 8 位八位字节都可以出现在 HTTP 标头值中。 IE。代码在 [0,255] 范围内的任何字符。

然而,我尝试拒绝接受任何代码> 127(或大多数 US-ASCII 不可打印字符)的 HTTP 服务器。

以下是标准中使用的语法的干涸摘录:

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )
field-content  = <the OCTETs making up the field-value and consisting of
                  either *TEXT or combinations of token, separators, and
                  quoted-string>

CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>
CRLF           = CR LF
LWS            = [CRLF] 1*( SP | HT )
OCTET          = <any 8-bit sequence of data>
CHAR           = <any US-ASCII character (octets 0 - 127)>
CTL            = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
TEXT           = <any OCTET except CTLs, but including LWS>

token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\"
               | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT

quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext         = <any TEXT except <">>
quoted-pair    = "\" CHAR

如你看到的field-content可以是一个quoted-string,这是一个引用序列TEXT(即任何 8 位八位字节,除了"和值来自[0-8, 11-12, 14-31, 127]范围)或quoted-pair (\后跟任何值[0, 127]范围)。 IE。任何 8 位字符序列都可以通过引用它并在特殊符号前加上前缀来传递\).

(请注意,标准不处理NUL(0x00)以任何特殊方式字符)

但是,显然,要么我尝试过的所有服务器都不符合要求,要么标准自 1999 年以来已发生变化,要么我无法正确读取它。

那么...HTTP 标头值中允许使用哪些字符以及为什么?

附:这一切背后的原因:我正在寻找一种在 HTTP 标头值中传递 utf-8 编码序列的方法(如果可能,无需额外编码)。


RFC 2616 https://www.rfc-editor.org/rfc/rfc2616已过时,相关部分已被替换RFC 7230 https://www.rfc-editor.org/rfc/rfc7230#page-9.

注释和带引号的字符串文本中不再允许使用 NUL 八位字节, 并澄清了其中反斜杠转义的处理。这 引用对规则不再允许转义其他控制字符 比HTAB。标头字段中的非 US-ASCII 内容和原因短语 已被废弃且变得不透明(TEXT 规则已被删除)。(第 3.2.6 节)

本质上,RFC 2616 默认为ISO-8859-1 https://web.archive.org/web/20201231211215/http://www.open-std.org/JTC1/SC2/WG3/docs/n411.pdf,而且这既不够,而且无论如何也不能互操作。因此,RFC 7230 已弃用字段值中的非 ASCII 八位字节。建议在此基础上使用转义机制(例如在RFC 8187 https://www.rfc-editor.org/rfc/rfc8187,或普通 URI 百分比编码)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP 标头值中允许使用哪些字符? 的相关文章

随机推荐

  • 如何让 Owin/Katana 将标头写入输出流?

    当我写入响应时 Katana 会跳过发送 Elapsed Time 响应标头 在我第一次写入流之前 如何让它为我设置标头 中间件 1 public override async Task Invoke IOwinContext contex
  • 混合模式程序集是针对运行时版本“v2.0.50727”构建的,无法在 4.0 运行时中加载

    在命令行执行中运行可执行文件后出现此异常 混合模式程序集是针对运行时版本 v2 0 50727 构建的 如果没有附加配置信息 则无法在 4 0 运行时中加载 在网上搜索这个问题后 我发现解决方法之一是配置App Config文件 这在 VS
  • 如何从 .t​​xt 文件读取表格到 C++

    我想从文件中读取矩阵并在我的程序中使用它 但是当我输出结果时 它表明它读取不正确 这是代码 define I 5 define J 5 define P 2 int i j k for loops int main ifstream inF
  • 如何在 Celery 中使用气流

    我是airflow和celery的新手 现在我已经完成了dag的绘制 但是我想在同一子网中的两台计算机上运行任务 我想知道如何修改airflow cfg 一些例子可能会更好 谢谢各位的解答orz The 气流文档 https airflow
  • 多个并发程序在同一哈希键上执行读/删除操作的 Redis 行为

    我有一个程序 program 1 基于 Jedis 写入 Redis HASH KEY 1 定期进行 我还有另一个程序 program 2 单独的 JVM 进程 定期执行 并在 Redis 事务中执行以下操作 Transaction tra
  • 指令执行过程中中断

    假设 CPU 正在运行一条汇编指令 例如 FOO将在几个时钟内执行 例如 10 个 执行过程中突然出现中断请求FOO并且处理器需要中断 它是否等到命令正确执行 或者FOO已中止并将重新启动 考虑到不同类型的中断优先级 它的行为是否有所不同
  • 如何在 IE9 删除样式属性值之前获取样式属性值

    我试图在 IE9 10 删除无效值之前获取 style 属性的值 到目前为止 我已经尝试了以下所有变体 0 attributes style 0 style 0 getAttribute style 但似乎如果我尝试设置一个无效值 我将无法
  • spring hibernate乐观锁问题

    这是我的存储库层 class RepositoryImpl implements Repository Override public Serializable saveOrUpdate Object obj return getSessi
  • Node.js 加密密钥和 iv 匹配 java SecretKeySpec / IvParameterSpec

    我正在尝试将 Java 简单 加密算法移植到 Node JS 我需要能够解密 加密从 Java 端加密 解密的内容 我被困在一开始 密码的初始化 在Java中 我得到了密钥SecretKeySpec 以及初始化向量IvParameterSp
  • 当 RabbitMQ 消费者崩溃时,获取的消息会发生什么情况?

    如果我有一个 RabbitMQ 消费者批量检索 100 条消息 但在将这些消息标记为已处理之前它就崩溃了 那么这些消息是否丢失了 我希望队列中的每条消息至少被处理一次 处理在确认消息之前崩溃的消费者的推荐方法是什么 RabbitMQ 是否以
  • 如何动态更改 clr-icon 自定义元素的形状?

    In the 清晰度图标文档 https vmware github io clarity icons how to use它们表明您可以使用 shape 属性来设置图标形状 如下所示
  • 自动添加和删除成员的聊天 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在和一个使用 telegram 应用程序发送足球比赛投注提示的人合作 他希望该群组是私有的 现在他
  • Docker如何共享资源

    我一直在研究 Docker 我从中了解到这个帖子 https stackoverflow com questions 16047306 how is docker io different from a normal virtual mac
  • Python 请求响应解码

    我使用 python requests 发送请求 然后打印响应 令我困惑的是响应中的中文字符类似于 u6570 u636e u8fd4 u56de u6210 u529f这是代码 coding utf 8 import requests u
  • 如何更改flutter包的java版本?

    我正在我的 flutter 项目的包中编辑 java 文件 但它是使用源 1 7 构建的 我该如何更改它 Flutter Channel dev 1 27 0 8 0 pre on Microsoft Windows Version 10
  • 使用 React 中的函数打开外部链接

    我正在尝试在 React 中创建一个按钮 该按钮打开指向谷歌地图网址的外部链接 我有一个函数询问用户的地理位置 一旦提供 就会将位置输入到 url 链接中 该链接获取从其地理位置到设定目的地的方向 但是 我正在努力让按钮首先运行该函数并在n
  • 测试协议与相关类型的一致性

    我有一个使用关联类型的协议 如下所示 protocol Populatable typealias T func populateWith object T 以及实现该协议的类 class DateRowType Populatable f
  • 如果我使用提供程序,如何在应用程序启动时调用方法?

    我想完成get请求服务器在启动时获取我的应用程序的数据 我阅读了几个描述如何在构建小部件后运行方法的主题 但所有这些都描述了当provider没有使用 我不确定在小部件内执行此请求是否是个好主意 我尝试了几种方法但没有成功 这是我的代码 v
  • vim中的相对数

    我注意到 vim 中关于相对数字的奇怪行为 set nu 1 2 3 4 5 6 设置相对编号 2 1 3 1 2 3 设置诺努 2 1 0 1 2 3 我问自己为什么有时我看到绝对当前行号 有时我看到 0 这是非常无用的 这种行为正常吗
  • HTTP 标头值中允许使用哪些字符?

    学习后HTTP 1 1标准 https www ietf org rfc rfc2616 txt 特别是第 31 页和相关内容 我得出的结论是任何 8 位八位字节都可以出现在 HTTP 标头值中 IE 代码在 0 255 范围内的任何字符