multipart/form-data中的二进制行(文件上传)

bri*_*rns 7 http multipartform-data

我在python中编写一个简单的Web服务器,允许用户使用multipart/form-data上传文件.据我所知,多部分MIME数据应该是基于行的.例如,边界必须位于一条线的开头.

我无法弄清楚在这方面如何处理二进制数据.我的客户端(Firefox)没有将其编码为7位ASCII或任何东西,它只是它发送的原始二进制数据.它是否将数据拆分为任意位置的行?是否为多部分数据指定了最大行长度?我试过通过RFC查看multipart/form-data,但没有找到任何东西.

bri*_*rns 8

在深入了解RFC之后,我想我终于完全理解了这一点.身体部位(即,multipart/*消息中各个部分的身体内容)只需要基于行,因为部分末端的边界以a开头CR+LF.但除此之外,数据不一定是基于行的,如果内容中恰好有换行符,它们之间没有最大距离,也不需要进行转义(好吧,除非Content-Transfer-Encoding是引用字符串) ).7位,8位和二进制选项Content-Transfer-Encoding实际上并不表示已对数据进行了任何编码(因此不需要撤消编码),它们只是用来表示您的数据类型可以期待看到身体的一部分.

在我的[表达不好]的问题中,我真正得到的是如何从套接字中读取/缓冲数据,这样我就能确保抓住边界,而不必拥有任意大的缓冲区(例如,如果发生了在内容中没有换行符,所以readline最终缓冲整个事情).

我最终做的是readline使用最大长度从套接字缓冲,因此缓冲区永远不会长于此,但如果遇到换行符,也会确保终止.这确保了当边界到来时(在a之后CR+LF),它将位于缓冲区的开头.我不得不做一些额外的monkeying以确保我没有CR+LF在实际的身体内容中包含那个final ,因为根据RFC它在边界之前是必需的,因此不是内容本身的一部分.