2010-10-14 40 views
0

Le code ci-dessous est utilisé dans une application iPad pour envoyer une requête HTTP à un serveur web Node.js, ce qui produit l'erreur suivante, mais fonctionne bien avec un formulaire HTML + navigateur classique.Est-ce une requête HTTP mal formée d'un iPad, qui tue l'analyseur multipartie Node.js

Le serveur est Node.js + formidable qui a un analyseur multipart qui meurt seulement this line of code cette 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 

Voici le code 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]; 

La demande est-être envoyé malformé? Si oui, pourquoi et comment devrait-il être fait?

+0

Je ne sais pas si vous générez une requête malformée, mais ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/) rend la création de messages multi-formulaires simple et vous n'avez plus à transpirer ces types de détails. –

+2

Il n'y a pas besoin d'utiliser 'stringWithString:' sur un littéral NSString ('@" ... "'). C'est déjà une chaîne. Je doute de votre utilisation de 'dataWithData:' aussi: avez-vous vraiment besoin de faire une copie de l'objet de données que vous avez déjà? –

+0

@Robot K - merci qui a fait l'affaire – roder

Répondre

4

En fait, nous avons eu ce même problème dans un code iOS envoyé à Node.js. Notre problème s'est avéré être le CR-LF précédant la première limite. Node.js utilise un composant pour analyser MIME qui est très pointilleux sur le format et les caractères CR-LF précédents sont considérés comme mal formés. Je ne suis pas sûr, mais le CR-LF suivant votre dernière limite peut causer le même problème. Votre première limite devrait ressembler à ceci:

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

Votre limite finale devrait ressembler à ceci:

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

Notez que les limites intermédiaires doivent inclure le CR-LF avant et après la frontière:

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

Ma lecture de la spécification indique que vous pouvez avoir des données avant la première limite et après la limite finale, mais l'analyseur doit ignorer ces zones. Le composant Node.js utilise pour analyser cela est très difficile. Il existe un correctif pour le composant d'analyse, mais il n'a pas encore été intégré au projet.

+0

Vous êtes une bouée de sauvetage !!! Merci beaucoup! 8 heures je ne savais pas quel est le problème avec cette demande en plusieurs parties! –