HTTP Requete POST pour uploader un fichier [C/C++] - C++ - Programmation
MarshPosté le 16-04-2003 à 03:38:01
Bonjours a tous!
Voila, j'ai un probleme sur le developpement que je mene actuellement; je tente d'ecrire un programme qui aurait pour but d'uploader un fichier sur un serveur HTTP. Pour cela, j'ai installe un serveur Apache 1.3, le CGI qui vas bien pour receptionner les uploads et tout configure pour que ca marche. Pour infos je suis sous windows xp. J'ai teste la configuration de mon serveur avec IE6 et tout fonctionne, j'arrive bien a uploader mes fichiers. Le but de mon programme est donc de remplacer IE (ou tout autre navigateur) par mon propre code. J'ai donc regarde un coup dans les diverses RFC traitant de ce sujet (2068 et 1867 particulierement), un peu de doc d'apache et pas mal de sniffing reseau pour essayer de reproduire le mecanisme. Si je poste, c'est que ca ne marche pas mais je ne vois pas d'ou vient le probleme dans mon implementation du protocole. J'utilise une methode POST pour construire mon header comme suit: -------8<-------------- POST /cgi-bin/CGI.exe HTTP/1.1CRLF Host: localhost:80CRLF Content-Length: 1747CRLF Content-Type: multipart/form-data; boundary="abfge"CRLF CRLF -------8<--------------
Les CRLF correspondent a des sequences "\r\n" comme indique dans la RFC2068. Rien de remarquable, a part que pour le Content-Length je donne la valeur exacte du message qui suivra l'en-tete et que mon boundary est bien unique dans les donnees qui seront envoyes par la suite. Apres avoir envoye ce header, j'envois le message lui meme, soit dans mon cas les donnees a uploader comme suit: -------8<-------------- --abfgeCRLF Content-Disposition: form-data; name="dataFile"; filename="c:\temp\test.txt"CRLF Content-Type: application/octet-streamCRLF CRLF <donnees du fichier ici> CRLF CRLF --abfge--CRLF CRLF -------8<-------------- Ici, je commence par envoyer mon "boundary" complet (avec les "--" devant) pour signifier le debut des donnees, suivi de l'entete du champ. Pour le Content-Type, j'ai mis "application/octet-stream" car c'est normalement la valeur par defaut, mais j'ai les memes resultats avec "text/plain". Enfin je termine l'envois par le boundary complet et ses "--" terminaux, sans oublier les sauts habituels. Le contenu des donnees est suffisement petit pour ne pas avoir besoin d'etre tronque en plusieurs paquet (pour mes tests, IE par ex envois tout en un seul bloc). Suite a cet envois, j'attends la reponse du serveur. Apache me revois alors un magnifique code 200 OK, suite a quoi je ferme la connexion. A ce moment je m'attends a trouver mon fichier sur le serveur, mais malheureusement, rien!
J'ai observe comment IE faisait a l'aide d'un sniffer, je n'ai rien trouve de nouveau. Le seul point qui change vraiment c'est qu'IE genere un content-length plus long que le message lui meme, mais ca n'a pas l'air de gener Apache. Moi des que je met une valeur plus petite ou plus grande que la realite, il me renvois une erreur.
Je sais que mon probleme est asser specialise, mais si quelqu'un pouvait m'indiquer une piste, ca me debloquerais! par avance, merci.
Marsh Posté le 16-04-2003 à 03:38:01
Bonjours a tous!
Voila, j'ai un probleme sur le developpement que je mene actuellement; je tente d'ecrire un programme qui aurait pour but d'uploader un fichier sur un serveur HTTP. Pour cela, j'ai installe un serveur Apache 1.3, le CGI qui vas bien pour receptionner les uploads et tout configure pour que ca marche. Pour infos je suis sous windows xp. J'ai teste la configuration de mon serveur avec IE6 et tout fonctionne, j'arrive bien a uploader mes fichiers.
Le but de mon programme est donc de remplacer IE (ou tout autre navigateur) par mon propre code. J'ai donc regarde un coup dans les diverses RFC traitant de ce sujet (2068 et 1867 particulierement), un peu de doc d'apache et pas mal de sniffing reseau pour essayer de reproduire le mecanisme.
Si je poste, c'est que ca ne marche pas mais je ne vois pas d'ou vient le probleme dans mon implementation du protocole.
J'utilise une methode POST pour construire mon header comme suit:
-------8<--------------
POST /cgi-bin/CGI.exe HTTP/1.1CRLF
Host: localhost:80CRLF
Content-Length: 1747CRLF
Content-Type: multipart/form-data; boundary="abfge"CRLF
CRLF
-------8<--------------
Les CRLF correspondent a des sequences "\r\n" comme indique dans la RFC2068.
Rien de remarquable, a part que pour le Content-Length je donne la valeur exacte du message qui suivra l'en-tete et que mon boundary est bien unique dans les donnees qui seront envoyes par la suite.
Apres avoir envoye ce header, j'envois le message lui meme, soit dans mon cas les donnees a uploader comme suit:
-------8<--------------
--abfgeCRLF
Content-Disposition: form-data; name="dataFile"; filename="c:\temp\test.txt"CRLF
Content-Type: application/octet-streamCRLF
CRLF
<donnees du fichier ici>
CRLF
CRLF
--abfge--CRLF
CRLF
-------8<--------------
Ici, je commence par envoyer mon "boundary" complet (avec les "--" devant) pour signifier le debut des donnees, suivi de l'entete du champ. Pour le Content-Type, j'ai mis "application/octet-stream" car c'est normalement la valeur par defaut, mais j'ai les memes resultats avec "text/plain". Enfin je termine l'envois par le boundary complet et ses "--" terminaux, sans oublier les sauts habituels.
Le contenu des donnees est suffisement petit pour ne pas avoir besoin d'etre tronque en plusieurs paquet (pour mes tests, IE par ex envois tout en un seul bloc).
Suite a cet envois, j'attends la reponse du serveur. Apache me revois alors un magnifique code 200 OK, suite a quoi je ferme la connexion.
A ce moment je m'attends a trouver mon fichier sur le serveur, mais malheureusement, rien!
J'ai observe comment IE faisait a l'aide d'un sniffer, je n'ai rien trouve de nouveau. Le seul point qui change vraiment c'est qu'IE genere un content-length plus long que le message lui meme, mais ca n'a pas l'air de gener Apache. Moi des que je met une valeur plus petite ou plus grande que la realite, il me renvois une erreur.
Je sais que mon probleme est asser specialise, mais si quelqu'un pouvait m'indiquer une piste, ca me debloquerais!
par avance, merci.