IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Problème envoi de fichier par méthode HTTP Post (INDY pour C++Builder)


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Problème envoi de fichier par méthode HTTP Post (INDY pour C++Builder)
    Bonjour à toutes et à tous,

    Je suis en train de développer une application dont une des fonctionnalité est de télécharger des fichiers dans un module IP autonome.

    Ainsi, j'essaye de contourner l'utilisation d'une page web pour le téléchargement des fichiers, pour utiliser à la place un programme C++.

    Mon souci est que je reçois une réponse HTTP "400 Bad Request" lorsque j'utilise mon programme. J'utilise les composants INDY pour C++ Builder, et j'ai remarqué que le programme transmet les balises "request" dans un ordre différent que lorsque je passe par la page web :

    avec la page web :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    POST /Forms/web_files_new_1 HTTP/1.1
    Host: 192.168.0.71
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://192.168.0.71/admin/web_files_new.htm
    Cookie: C1=W6C1DMS5wIT2Co9
    Content-Type: multipart/form-data; boundary=---------------------------47853213518639
    Content-Length: 409
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -----------------------------47853213518639
    Content-Disposition: form-data; name="currentdirectory"
     
    WEB/
    -----------------------------47853213518639
    Content-Disposition: form-data; name="file"; filename="indexfile.txt"
    Content-Type: text/plain
     
    Mozilla Backup
    Revize: 2
    Verze: 
    ****////\\\\****
    YNNYYNNYYYYYNN
    ****////\\\\****
    ****////\\\\****
     
    -----------------------------47853213518639--
    Alors qu'avec mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    POST /Forms/web_files_new_1 HTTP/1.1
    Connection: keep-alive
    Content-Type: multipart/form-data; boundary=---------------------------47853213518639
    Content-Length: 396
    Host: 192.168.0.71
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Accept-Encoding: gzip,deflate
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Referer: Referer: http://192.168.0.71/admin/web_files_new.htm
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
    Authorization: Basic cm9vdDpkYnBz
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ---------------------------47853213518639
    Content-Disposition: form-data; name="currentdirectory"
     
    WEB/
    ---------------------------47853213518639
    Content-Disposition: form-data; name="file"; filename="indexfile.txt"
    Content-Type: text/plain
     
    Mozilla Backup
    Revize: 2
    Verze:
    ****////\\****
    YNNYYNNYYYYYNN
    ****////\\****
    ****////\\****
     
    ---------------------------47853213518639--
    Mes questions sont donc :
    - est ce que l'ordre des informations "Request" sont importantes ?
    - est ce que l'utilisation de coockies (absent dans mon programme) pourrait générer une erreur 400 bad request ?
    - est ce que l'utilisation du découpage "boundary" peut engendrer ce type d'erreur ?

    Je complète ce post avec mon ptit bout d'code C++ pour la gestion du POST pour les fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    AnsiString fichier;
            const AnsiString CRLF = "\r\n";
     
            fichier = "---------------------------47853213518639"+CRLF+
            "Content-Disposition: form-data; name=\"currentdirectory\""+CRLF+
            CRLF+
            "WEB/"+CRLF+
            "---------------------------47853213518639"+CRLF+
            "Content-Disposition: form-data; name=\"file\"; filename=\"indexfile.txt\""+CRLF+
            "Content-Type: text/plain"+CRLF+
            CRLF+
            "Mozilla Backup"+CRLF+
            "Revize: 2"+CRLF+
            "Verze:"+CRLF+
            "****////\\\\****"+CRLF+
            "YNNYYNNYYYYYNN"+CRLF+
            "****////\\\\****"+CRLF+
            "****////\\\\****"+CRLF+
            CRLF+
            "---------------------------47853213518639--"+CRLF;
     
            Memo1->Lines->Add(fichier);
            AnsiString buffer_emission2;
            TStringStream * Send2 = new TStringStream(buffer_emission2);
            Send2->WriteString(fichier);
     
     
     
    // envoi du fichier
            TMemoryStream *Receive1 = new TMemoryStream() ;
            //AnsiString buffer_emission;
            //TStringStream * Send1 = new TStringStream(buffer_emission) ;
            //Send1->WriteString(affichage_emission->Text);
     
            IdHTTP1->Request->Host = "192.168.0.71";
            IdHTTP1->Request->UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11";
            IdHTTP1->Request->Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
            IdHTTP1->Request->AcceptLanguage = "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3";
            IdHTTP1->Request->AcceptEncoding = "gzip,deflate";
            IdHTTP1->Request->AcceptCharSet = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
            IdHTTP1->Request->Connection = "keep-alive";
            IdHTTP1->Request->Referer = "Referer: http://"+adresse_IP->Text+"/admin/web_files_new.htm";
            IdHTTP1->Request->ContentType = "multipart/form-data; boundary=---------------------------47853213518639";
     
            //Keep-Alive: 300
     
            Adresse_IP_cible = "http://"+adresse_IP->Text+"/Forms/web_files_new_1";
            AnsiString AnID = username->Text;
            AnsiString APass = password->Text;
            IdHTTP1->Request->Username = AnID;
            IdHTTP1->Request->Password = APass;
     
            try
            {
                    IdHTTP1->Post(Adresse_IP_cible,Send2,Receive1);
            }
            catch(...)
            {
                    Application->MessageBox("Can not send to the HTTP communication.", NULL, MB_OK | MB_ICONSTOP);
            }
    Merci d'avance pour votre aide.

    Thomas

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut et maintenant j'ai une erreur 303 ...
    Suite à la lecture de la magnifique FAQ http://delphi.developpez.com/faq/?page=indy_gene_bases je n'ai plus l'erreur "400 Bad request". En effet il fallait utiliser le composant TIdMultiPartFormDataStream.

    Sauf que maintenant, j'ai une erreur "303 See Other" ... dont la description est la suivante : La réponse à la requête peut être trouvée à une autre URI et devrait être obtenue par une nouvelle requête GET sur cette nouvelle URI.

    Quelqu'un aurait il plus d'information pour la résolution de ce type d'erreur ?

    Merci d'avance !

    Thomas

    Je joins la partie de code réécrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
            TIdMultiPartFormDataStream *mon_multipart;
     
            if (OpenDialog1->Execute())
            {
     
    /*                try
                    {
                            fichier = new TFileStream(OpenDialog1->FileName, fmOpenRead);
                    }
                    catch (...)
                    {
                            Application->MessageBox("Cannot opening file !", NULL, MB_OK | MB_ICONSTOP);
                    }
    */
     
    // renseignement des HTTP->requests
                    IdHTTP1->Request->Host = adresse_IP->Text;
                    IdHTTP1->Request->UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11";
                    IdHTTP1->Request->Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
                    IdHTTP1->Request->AcceptLanguage = "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3";
                    IdHTTP1->Request->AcceptEncoding = "gzip,deflate";
                    IdHTTP1->Request->AcceptCharSet = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
                    IdHTTP1->Request->Connection = "keep-alive";
                    IdHTTP1->Request->Referer = "http://"+adresse_IP->Text+"/admin/web_files_new.htm";
                    IdHTTP1->Request->ContentType = "multipart/form-data";
     
                    //Keep-Alive: 300
     
                    Adresse_IP_cible = "http://"+adresse_IP->Text+"/Forms/web_files_new_1";
                    AnsiString AnID = username->Text;
                    AnsiString APass = password->Text;
                    IdHTTP1->Request->Username = AnID;
                    IdHTTP1->Request->Password = APass;
     
    // ajout des renseignements pour le Multipart/form-data
                    mon_multipart = new TIdMultiPartFormDataStream;
                    mon_multipart->AddFormField("currentdirectory","WEB/");
                    mon_multipart->AddFile("file",OpenDialog1->FileName,"text/plain");
     
    // envoi du fichier
                    //TMemoryStream *Receive1 = new TMemoryStream() ;
                    try
                    {
                            IdHTTP1->Post(Adresse_IP_cible,mon_multipart);
                    }
                    catch(...)
                    {
                            Application->MessageBox("Can not send to the HTTP communication.", NULL, MB_OK | MB_ICONSTOP);
                    }
    Et la nouvelle trame que ce code génère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    POST /Forms/web_files_new_1 HTTP/1.1
    Connection: keep-alive
    Content-Type: multipart/form-data; boundary=--------020608114121531
    Content-Length: 438
    Host: 192.168.0.71
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Accept-Encoding: gzip,deflate
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Referer: http://192.168.0.71/admin/web_files_new.htm
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ----------020608114121531
    Content-Disposition: form-data; name="currentdirectory"
     
    WEB/
    ----------020608114121531
    Content-Disposition: form-data; name="file"; filename="C:\Documents and Settings\Thomas\Mes documents\indexfile2.txt"
    Content-Type: text/plain
    Content-Transfer-Encoding: binary
     
    Mozilla Backup
    Revize: 2
    Verze: 
    ****////\\\\****
    YNNYYNNYYYYYNN
    ****////\\\\****
    ****////\\\\****
     
    ----------020608114121531--

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Problème résolu : envoi de fichier par méthode post + authentification (INDY)
    Et bien voila j'ai résolu mon problème tout seul comme un grand.

    Le problème était de se loguer sur la première page Web avant d'envoyer des fichiers.

    Pour faire cela :

    - 1 GET sur la première page avec gestion des cookies pour avoir un cookie sur la session.

    - 1 POST sur une page relative à la première page pour s'authentifier (il fallait voir le source de la page Web)

    - 1 POST avec gestion Multipart pour envoyer les fichiers.

    L'erreur 303, ce n'est pas la peine de s'en soucier.
    Pour les cookies il fallait juste mettre un composant CookieManager et placer la propriété allowcookie=true.

    Je mets la source pour ceux que ça pourrait intéresser.

    Code pour l'authentification sur la première page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
            TMemoryStream *Receive0 = new TMemoryStream();
            TStringList *Commandes = new TStringList;
     
            IdHTTP1->Request->Host = adresse_IP->Text;
            IdHTTP1->Request->UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11";
            IdHTTP1->Request->Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
            IdHTTP1->Request->AcceptLanguage = "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3";
            IdHTTP1->Request->AcceptEncoding = "gzip,deflate";
            IdHTTP1->Request->AcceptCharSet = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
            IdHTTP1->Request->Connection = "keep-alive";
            IdHTTP1->Request->Referer = "http://"+adresse_IP->Text+"/login.htm";
            IdHTTP1->Request->ContentType = "application/x-www-form-urlencoded";
     
            //Keep-Alive: 300
     
            Adresse_IP_cible = "http://"+adresse_IP->Text+"/login.htm";
            AnsiString AnID = username->Text;
            AnsiString APass = password->Text;
            IdHTTP1->Request->Username = AnID;
            IdHTTP1->Request->Password = APass;
     
    // d'abord je fais un petit GET
            try
            {
                    IdHTTP1->Get(Adresse_IP_cible,Receive0);
            }
            catch(...)
            {
     
            }
            AnsiString Buffer_reception;
            Buffer_reception.SetLength(1000);
            Receive0->Read(&Buffer_reception[1], 1000);
            affichage_reception->Lines->Add(Buffer_reception);
     
            Adresse_IP_cible = "http://"+adresse_IP->Text+"/Forms/login_1";
     
    // ajout des renseignements pour la connection à la session
            Commandes->Add("cache=");
            Commandes->Add("protocol=http");
            Commandes->Add("username=root");
            Commandes->Add("password=dbps");
            Commandes->Add("btLogin=Login");
     
    // envoi du POST
            try
            {
                    IdHTTP1->Post(Adresse_IP_cible,Commandes,Receive0);
            }
            catch(...)
            {
     
            }
     
            code_reponse->Text = IdHTTP1->ResponseCode;
     
    //affichage reception
    //        AnsiString Buffer_reception;
    //        Buffer_reception.SetLength(1000);
            Receive0->Read(&Buffer_reception[1], 1000);
            affichage_reception->Lines->Add(Buffer_reception);
    Code pour l'envoi de fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
            int TailleFichier;
            TFileStream *fichier;
            TIdMultiPartFormDataStream *mon_multipart;
     
            if (OpenDialog1->Execute())
            {
     
                    try
                    {
                            fichier = new TFileStream(OpenDialog1->FileName, fmOpenRead);
                    }
                    catch (...)
                    {
                            Application->MessageBox("Cannot opening file !", NULL, MB_OK | MB_ICONSTOP);
                    }
     
     
    // renseignement des HTTP->requests
                    IdHTTP1->Request->Host = adresse_IP->Text;
                    IdHTTP1->Request->UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11";
                    IdHTTP1->Request->Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
                    IdHTTP1->Request->AcceptLanguage = "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3";
                    IdHTTP1->Request->AcceptEncoding = "gzip,deflate";
                    IdHTTP1->Request->AcceptCharSet = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
                    IdHTTP1->Request->Connection = "keep-alive";
                    IdHTTP1->Request->Referer = "http://"+adresse_IP->Text+"/admin/web_files_new.htm";
                    IdHTTP1->Request->ContentType = "multipart/form-data";
     
                    //Keep-Alive: 300
     
                    Adresse_IP_cible = "http://"+adresse_IP->Text+"/Forms/web_files_new_1";
                    //AnsiString AnID = username->Text;
                    //AnsiString APass = password->Text;
                    //IdHTTP1->Request->Username = AnID;
                    //IdHTTP1->Request->Password = APass;
     
    // ajout des renseignements pour le Multipart/form-data
                    mon_multipart = new TIdMultiPartFormDataStream;
                    mon_multipart->AddFormField("currentdirectory","WEB/");
                    //mon_multipart->AddFile("file",OpenDialog1->FileName,"text/plain");
                    mon_multipart->AddObject("file","multipart/form-data",fichier,ExtractFileName(OpenDialog1->FileName));
                    mon_multipart->Position = 0;
     
    // envoi du fichier
                    try
                    {
                            IdHTTP1->Post(Adresse_IP_cible,mon_multipart);
                    }
                    catch(...)
                    {
     
                    }
     
    // get ?
                    IdHTTP1->Request->Host = adresse_IP->Text;
                    IdHTTP1->Request->UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11";
                    IdHTTP1->Request->Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
                    IdHTTP1->Request->AcceptLanguage = "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3";
                    IdHTTP1->Request->AcceptEncoding = "gzip,deflate";
                    IdHTTP1->Request->AcceptCharSet = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
                    IdHTTP1->Request->Connection = "keep-alive";
                    IdHTTP1->Request->Referer = "http://"+adresse_IP->Text+"/admin/web_files_new.htm";
                    IdHTTP1->Request->ContentType = "application/x-www-form-urlencoded";
     
                    Adresse_IP_cible = "http://"+adresse_IP->Text+"/admin/web_files_new.htm";
                    TMemoryStream *Receive0 = new TMemoryStream();
     
                    try
                    {
                            IdHTTP1->Get(Adresse_IP_cible,Receive0);
                    }
                    catch(...)
                    {
     
                    }
     
                    delete fichier;
                    code_reponse->Text = IdHTTP1->ResponseCode;
     
    //affichage reception
                    /*
                    AnsiString Buffer_reception1;
                    Buffer_reception1.SetLength(1000);
                    Receive1->Read(&Buffer_reception1[1], 1000);
                    affichage_reception->Lines->Add(Buffer_reception1);
                    */
            }
    à la prochaine !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Web Service][HttpRequest] Envoie de fichier par requête POST
    Par cjean dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/12/2016, 15h26
  2. [XL-2007] Export fichier par requête HTTP POST
    Par Bartania dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 12/08/2014, 09h09
  3. La méthode HTTP POST n'est pas supportée par cette URL
    Par jrosenzw dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/10/2008, 15h48
  4. [HTTP] Envoi de fichiers par http post
    Par java_girl dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 28/08/2006, 16h44
  5. [HTTP] Envoi de fichiers par http
    Par Delendial dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/09/2004, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo