2009-10-17 5 views
0

J'essaie d'implémenter la fonctionnalité de téléchargement de fichiers dans l'application iPhone. Le code du serveur est testé et fonctionne lorsque les fichiers sont téléchargés à partir du navigateur du bureau, donc je suis passé à l'implémentation du code client Objective-C. J'assemble manuellement le corps des requêtes HTTP, et malgré cela il semble correct, il est rejeté par le serveur (le gestionnaire de serveur est incapable d'extraire les parties du contenu multipart). En désespoir de cause, j'ai simplifié le formulaire pour n'avoir qu'un seul paramètre, mais cela ne fonctionne toujours pas.Impossible d'assembler la requête multipart/form-data

J'ai capturé le trafic réseau et j'ai pu voir que Wireshark ne pouvait pas analyser mon contenu en multi-parties (regardez les captures d'écran: Firefox request, iPhone request). Je le colle ci-dessous dans l'espoir que vous pourriez voir les erreurs que je ne peux pas voir.

Merci d'avance.

Firefox:

POST /cubepaint/actions/gallery/post HTTP/1.1 
Host: [...] 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Authorization: Basic [...] 
Content-Type: multipart/form-data; boundary=---------------------------20072377098235644401115438165 
Content-Length: 180 

-----------------------------20072377098235644401115438165 
Content-Disposition: form-data; name="deviceId" 

12345 
-----------------------------20072377098235644401115438165-- 
HTTP/1.1 200 OK 
Date: Sat, 17 Oct 2009 22:09:21 GMT 
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 mod_ssl/2.2.3 OpenSSL/0.9.8c 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: text/html; charset=UTF-8 

iPhone:

POST /cubepaint/actions/gallery/post HTTP/1.1 
Host: [...] 
User-Agent: Copenhagen/1.0 CFNetwork/459 Darwin/9.8.0 
Content-Type: multipart/form-data; boundary=----------0E7B16E6-CD3D-4213-9B42-07DA30822C74 
Accept: */* 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Authorization: Basic [...] 
Content-Length: 187 
Connection: keep-alive 

----------0E7B16E6-CD3D-4213-9B42-07DA30822C74 
Content-Disposition: form-data; name="deviceId" 

00000000-0000-1000-8000-0016CBCC0B61 
----------0E7B16E6-CD3D-4213-9B42-07DA30822C74-- 
HTTP/1.1 200 OK 
Date: Sat, 17 Oct 2009 22:04:07 GMT 
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 mod_ssl/2.2.3 OpenSSL/0.9.8c 
Keep-Alive: timeout=15, max=100 
Connection: Keep-Alive 
Transfer-Encoding: chunked 
Content-Type: text/html; charset=UTF-8 

Répondre

1

résolu par la lecture de la RFC 2046 (spécification MIME): limite entre les parties de message en plusieurs parties doit contenir deux principaux « -Bois, et la dernière limite devrait contenir en outre deux arrière » -Bois. La limite dans l'en-tête de la demande et le corps de la demande dans la demande Firefox diffèrent:

---------------------------20072377098235644401115438165

et

-----------------------------20072377098235644401115438165

La dernière ressemble limite à ceci:

-----------------------------20072377098235644401115438165--

Vous ne pouviez vraiment pas voir cela avec les yeux quand il y en a de nombreux «leaders» dans la limite originale.

1

Votre version iPhone indique keep-alive, mais ne précise pas la longueur. Pas sûr que cela soit suffisant pour causer des problèmes.

De même, est-il possible que votre serveur vérifie les chaînes d'agent utilisateur qu'il reconnaît (par exemple, pour le mode de rétrocompatibilité)?

Je voudrais également comparer les deux dans un éditeur de texte qui montre les caractères CR/LF pour s'assurer que vous obtenez des fins de ligne appropriées.

Une autre chose que vous pourriez essayer est de créer une page Web simple qui fait un POST en plusieurs parties et lancez-le à partir du navigateur de l'iPhone (au lieu du Mac) puis vérifiez les en-têtes qui traversent le fil. Ou vous pouvez accrocher une boîte à outils comme ASIHTTPRequest et voir quel type de sortie elle génère pour les publications en plusieurs parties (ou simplement utiliser la boîte à outils au lieu d'essayer d'écrire la vôtre).

Bonne chance

+0

Pourriez-vous regarder les captures d'écran affichées? Il y a CR/LF mis en évidence, peut-être que vous pouvez me donner un indice là-dessus. En outre, Content-Length semble être spécifié dans les deux versions, donc je ne suis pas sûr de ce que vous voulez dire par "ne spécifie pas une longueur". –

+0

Je voulais dire "Keep-Alive: 300" - votre échantillon d'iPhone n'a pas une durée de conservation, même s'il spécifie "Connection: keep-alive" - ​​on ne sait jamais, mais je ne pense pas que ce soit important assez pour provoquer la casse.Les captures d'écran que vous listez ici sont traitées par texto et formatées par SO et elles ont toutes l'air bien. Vous voudrez peut-être vérifier la sortie d'origine. Mais la première chose à essayer est de comparer la sortie de MobileSafari (ou ASIHTTPRequest) par rapport à votre code. – Ramin

Questions connexes