Iphone 在HTTP多部分/表单数据内容类型(iOS)中转义CRLF

Iphone 在HTTP多部分/表单数据内容类型(iOS)中转义CRLF,iphone,http,ios,multipartform-data,Iphone,Http,Ios,Multipartform Data,我试图使用multipart/form数据内容类型发布一个文件,我遇到了一个问题: 当我编写文件内容时,是否应该转义CRLFs?我在网上看到一段代码,我想可能是错的: NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: url]; [req setHTTPMethod: @"POST"]; NSString* contentType = @"multipart/form-data, boundary=AaB03x";

我试图使用multipart/form数据内容类型发布一个文件,我遇到了一个问题:
当我编写文件内容时,是否应该转义CRLFs?我在网上看到一段代码,我想可能是错的:

NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: url];
[req setHTTPMethod: @"POST"];

NSString* contentType = @"multipart/form-data, boundary=AaB03x";
[req setValue:contentType forHTTPHeaderField: @"Content-type"];

NSData* boundary = [@"\r\n--AaB03x\r\n" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData: boundary];
[postBody appendData: [@"Content-Disposition: form-data; name=\"datafile\"; filename=\"t.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData: [@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData: imageData];
[postBody appendData: boundary];
[req setHTTPBody:postBody];
这是错误的,因为imageData可能包含\r\n序列,对吗?如果是这样,有没有办法在原始数据中转义CRLF?还是我遗漏了什么


提前谢谢

这是一个有趣的问题。查看边界,似乎应由合成代理确保边界不会出现在封装的数据中。此外,它还声明如下:

注意:因为边界分隔符不能出现在主体部分中 被封装后,用户代理必须谨慎选择 唯一的边界参数值。中的边界参数值 上面的例子可能是设计用于 以极低的概率生成边界分隔符 存在于要封装的数据中,而无需预扫描 数据

我的解释是,为了确保边界值不会出现在封装的数据中,您必须扫描数据以查找边界值。因为在大多数情况下,这是一个不可接受的昂贵操作,所以用户代理只需选择一个在数据中发生概率非常低的值

考虑一下示例中边界出现在随机字节串中的概率(为了论证起见,我们假设它表示JPEG图像)。要提前结束图像数据,需要匹配的完整字符串为“\r\n--AaB03x”-10字节或80位。从任何位开始,接下来的10个字节是该序列的概率是2^80中的一个。在1MB JPEG文件中,有2^23位。这意味着包含该序列的JPEG文件的概率小于2^23/2^80,或2^57中的一个(超过100万亿)


所以,我认为答案是100%确定,你必须检查边界序列的数据,然后如果数据中存在边界序列,就使用另一个边界序列。但在实践中,边界序列发生的可能性很小,不值得这样做。

从技术上讲,这是错误的,因为尾随的
\r\n
不应该是中所述的边界的一部分。尾随的
\r\n
应该是
传输填充的一部分,但实际上,这并不重要,因为您无论如何都要将其放在边界之后


我还认为应该避免整个序列,而不是子序列

为什么这是一个不可接受的昂贵的操作?除非使用暴力算法,否则搜索将花费O(n)的时间。