Случайная ошибка «без границ» с NSMutableURLRequest - PullRequest
0 голосов
/ 10 января 2011

Я использую NSMutableURLRequest для загрузки изображения на веб-сервер. Я думал, что мой код стабилен, так как он работает для большинства пользователей, но некоторые пользователи просто не могут загружать изображения. Просматривая логи моего сервера, я вижу случайные

Предупреждение «Отсутствует граница в POST-данных multipart / form-data в поле« Неизвестно »в строке 0», которое указывает на ошибку границы при создании тела сообщения.

Ниже я использую:

request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:[method uppercaseString]];

NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data, boundary=%@", boundary];

[request setValue:contentType forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];

// add the image
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"Content-Disposition: form-data; name=\"image_upload\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
NSData *jpegData = UIImageJPEGRepresentation(jpeg, 100);
[postBody appendData:jpegData];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// add the other POST params
keys = [postdata allKeys];
int l = [keys count];
for (int i=0; i<l; i++){
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", [keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[postdata objectForKey:[keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    }

Я могу понять, если код выдает предупреждение PHP 100% времени, но, вероятно, это происходит один раз в каждые 30 или 40 пользователей. Если пользователь получает эту ошибку, то же самое относится к любому изображению, которое он пытается опубликовать.

Может ли кто-нибудь увидеть что-либо сразу очевидное или иметь какое-либо представление о том, почему это будет периодически возникающей проблемой?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Поля заголовка HTTP не чувствительны к регистру, поэтому не должно иметь значения, используете ли вы Content-Type, Content-type или CONTENT-TYPE. Кроме того, ваш ответ не объясняет, почему эта проблема возникла лишь у небольшого числа ваших пользователей.

У меня есть другое объяснение отсутствующей границы, основанное на реальном опыте. Оказывается, некоторые поставщики сотовых данных, в частности Vodafone, фильтруют все HTTP-запросы через прокси-серверы, которые добавляют различные пользовательские заголовки (например, x-up-subno, HTTP_SM_MS_CRYPTED и другие). У меня есть реальные доказательства того, что некоторые из этих прокси-серверов портят формы, помеченные как multipart/form-data, удаляя атрибут «border» заголовка Content-Type и, таким образом, делая форму не разбираемой практически для любого сервера.

0 голосов
/ 11 января 2011

Оказывается, проблема была с этой строкой:

[request setValue:contentType forHTTPHeaderField:@"Content-type"];

Это, конечно, должно быть:

[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

(обратите внимание на случай). Тем не менее, не уверен, почему это нарушило запрос только небольшого числа пользователей.

...