9
|
Miguel Lattuada · 技术社区 · 7 年前 |
![]() |
1
9
你不应该试图处理 字符串 在正文的这一部分,您应该发送二进制数据,将其视为从资源中读取字节,然后不加更改地发送这些字节。 因此,尤其是没有应用编码、没有utf-8、没有base64,HTTP不是一个具有ascii7限制的协议,就像smtp一样,在smtp中应用base64编码是为了确保只使用ascii7字符。 根据定义,此数据没有字符串版本,查看原始HTTP传输(例如wireshark),您应该会看到二进制数据、字节等。 这就是为什么大多数HTTP服务器使用C来管理HTTP,它们解析每个字节的HTTP通信字节(因为协议头仅为ascii 7,当然不是多字节字符),并且还可以任意读/写 正文的二进制数据非常容易(甚至可以使用系统调用,如 读取文件 让内核管理二进制部分)。 现在,关于 示例 。 当您使用 内容长度 而且没有多部分内容正文的长度正好是(内容长度)字节,因此解析您发送的数据的客户端只会读取这个字节数,并将整个原始数据视为正文内容(可能有mime类型和和编码信息,但这只是设置在HTTP协议之上的层的信息)。 当您使用 传输编码:分块 ,原始二进制体被分成几部分,然后每个部分都以十六进制数(块的大小)和行尾标记作为前缀。最后有一个空标记。 如果我们采取 wikipedia example :
我们可以用任何字节替换每个ascii7字母,即使是没有ascii7表示的字节,也可以对每个实体字节使用*字符:
所有其他字符都是HTTP协议的一部分(这里是块体传输)。我也可以用
这只是一种表示,我们也可以使用
如果示例的文本不是:
它可能更复杂,包含多字节字符(这里是utf-8中的a):
事实上
但这只有在源数据有效使用utf-8时才有效,可能是另一种编码。默认情况下,除非您的web服务器中有一些特定的配置设置,您可以在其中强制以特定编码转换源文档,否则web服务器的工作并不是转换源文档,您可以获取您所拥有的,还可以添加一个头来告诉客户端源文档上定义了什么编码。 最后我们有了 多部分 传输正文的方式,就像在你的问题中一样,它与分块版本非常相似,除了这里使用了边界和中间标题,但对于这些边界、标题和行尾控制字符之间的二进制数据,这是相同的规则,里面的所有内容都是字节。。。 |
![]() |
mig21 bis · 带套接字的SSL_set_fd地址边界错误 3 年前 |
![]() |
hollow · 在读写C中的套接字时,为什么要使用循环缓冲区? 3 年前 |
![]() |
Filipe · 通过http python发送图像 6 年前 |
|
Mr. Rogers · epoll_wait事件的epoll顺序 6 年前 |
![]() |
Michael Beer · 查找插座的传输类型 6 年前 |