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