Это неверно сформированный http-запрос от iPad, который убивает многочастный парсер Node.js. - PullRequest
0 голосов
/ 14 октября 2010

Приведенный ниже код используется в приложении iPad для отправки HTTP-запроса на веб-сервер Node.js, который выдает следующую ошибку, но прекрасно работает с обычной формой браузера HTML +.

Сервер Node.js + грозный , который имеет многочастный синтаксический анализатор, который умирает только на этой строке кода с этой ошибкой :

сообщение: ошибка синтаксического анализатора, 0 из 29162 проанализировано байтов

стек: ошибка: ошибка синтаксического анализатора, 0 из 29162 проанализировано байтов на IncomingForm.write (/usr/local/lib/node/.npm/formidable/0.9.8/package/lib/formidable/incoming_form.js:120:17) на входящем сообщении. (/usr/local/lib/node/.npm/formidable/0.9.8/package/lib/formidable/incoming_form.js:73:12)

at IncomingMessage.emit (events:27:15)
at HTTPParser.onBody (http:100:23)
at Stream.ondata (http:763:22)
at IOWatcher.callback (net:494:29)
at node.js:768:9

Это код iPad:

NSMutableURLRequest * theRequest   = [[NSMutableURLRequest alloc] initWithURL:url];

[theRequest setTimeoutInterval:60];

[theRequest setHTTPMethod:@"POST"];

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

[theRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];


//media 

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];    
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"image\"; filename=\"iosaudio.cai\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:theAudio]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[theRequest setHTTPBody:body];

Неправильно ли отправлен запрос? Если да, то почему и как это должно быть сделано?

1 Ответ

4 голосов
/ 28 марта 2013

У нас на самом деле была такая же проблема при публикации кода iOS на Node.js.Нашим вопросом оказался CR-LF, предшествующий первой границе.Node.js использует компонент для разбора MIME, который очень требователен к формату, и предыдущие символы CR-LF рассматриваются как искаженные.Я не уверен, но CR-LF после вашей последней границы может вызвать ту же проблему.Ваша первая граница должна выглядеть следующим образом:

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

Ваша конечная граница должна выглядеть следующим образом:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@--",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

Обратите внимание, что промежуточные границы должны включать CR-LF до и после границы:

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

Мое чтение спецификации указывает на то, что вы можете иметь данные до первой границы и после последней границы, но анализатор должен игнорировать эти области.Компонент Node.js, используемый для анализа, очень требователен.В компоненте синтаксического анализа есть патч, но он еще не попал в проект.

...