2010-10-14 1 views
0

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

Сервер Node.js + formidable который имеет многослойный анализатор, который умирает только на this line of code с этим error:

message: parser error, 0 of 29162 bytes parsed

stack: Error: parser error, 0 of 29162 bytes parsed at IncomingForm.write (/usr/local/lib/node/.npm/formidable/0.9.8/package/lib/formidable/incoming_form.js:120:17) at IncomingMessage. (/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]; 

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

+0

Я не знаю, генерирует ли вы неверный запрос, но ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/) делает создание сообщений в многостраничной форме мертвым простым, и вам больше не придется потеть эти виды деталей. –

+2

Нет необходимости использовать 'stringWithString:' в литерале NSString ('@" ... "'). Это уже строка. Я также очень сомневаюсь в том, что вы используете 'dataWithData:' также: действительно ли вам нужно сделать копию объекта данных, который у вас уже есть? –

+0

@Robot K - спасибо, что сделал трюк – roder

ответ

4

На самом деле у нас была эта же проблема в некоторых сообщениях для 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 использует для синтаксического анализа, это очень разборчиво. Патч для компонента синтаксического анализа, но он еще не пробился в проект.

+0

Ты спасатель !!! Большое спасибо! 8 часов Я не знал, в чем проблема с этим многостраничным запросом! –

Смежные вопросы