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 :
puis
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
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
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--
puis
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
Mes questions sont donc :
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--
- 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 :
Merci d'avance pour votre aide.
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); }
Thomas
Partager