我在python中编写一个简单的Web服务器,允许用户使用multipart / form-data上传文件。据我所知,多部分MIME数据应该是基于行的。例如,边界必须位于一条线的开头。
我无法弄清楚在这方面如何处理二进制数据。我的客户端(Firefox)不将其编码为7位ASCII或任何东西,它只是它发送的原始二进制数据。它是否将数据拆分为任意位置的行?是否为多部分数据指定了最大行长度?我已经尝试通过RFC查看multipart / form-data,但没有找到任何内容。
答案 0 :(得分:8)
在深入了解RFC之后,我想我终于彻底解决了这个问题。身体部位(即multipart/*
消息中的单个部分的身体内容)仅需要基于行,因为部分末尾的边界以CR+LF
开头。但除此之外,数据不一定是基于行的,如果内容恰好包含换行符,它们之间没有最大距离,也不需要进行转义(好吧,除非{{1}是引用字符串)。 Content-Transfer-Encoding
的7位,8位和二进制选项实际上并不表示已对数据进行了任何编码(因此不需要撤消编码),它们只是表示您可以在正文部分看到的数据类型。
我在[表达不好]的问题中真正得到的是如何从套接字中读取/缓冲数据,这样我就能确保抓住边界,而不必拥有任意大的缓冲区(例如,如果内容中恰好没有换行符,那么Content-Transfer-Encoding
最终会缓冲整个内容。)
我最终做的是使用readline
使用最大长度从套接字缓冲,因此缓冲区永远不会长于此,但如果遇到换行符,也会确保终止。这确保了当边界到来时(在readline
之后),它将位于缓冲区的开头。我不得不做一些额外的工作,以确保我没有在实际的身体内容中包含最终CR+LF
,因为根据RFC,它在边界之前是必需的,因此不是内容本身的一部分。 / p>
答案 1 :(得分:2)