Bonjour,
J'essaie d'écrire un mini serveur http en C++. Pour l'instant j'essaie de mettre au point les éléments techniques sans me préoccuper de la conception.
Jusqu'ici tout se passe bien : Je récupère la requête et j'envoie un réponse.
Le problème survient lorsque la requête utilise la méthode POST. Avec IE ça marche mais avec Firefox je reçois un message d'erreur :
et l'écho de mon serveur annonce avoir reçu la requête suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Connexion réinitialisée La connexion avec le serveur a été réinitialisée pendant le chargement de la page.
On voit que je ne reçois pas le corps de la requête (les variables et leurs valeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 POST /tst-post.txt HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.7) Gecko/20070 914 Firefox/2.0.0.7 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plai n;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
Avec IE je reçois
Le code de mon serveur est ici:
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 POST /tst-post.txt HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shock wave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application /msword, */* Accept-Language: fr-ch Content-Type: application/x-www-form-urlencoded UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.5072 7) Host: localhost:8080 Content-Length: 26 Connection: Keep-Alive Cache-Control: no-cache zone1=dd&zone2=ee&zone3=ff
Ma page de formulaire est :
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 #include <winsock2.h> #include <cstdlib> #include <string> #include <iostream> #include <strstream> using namespace std; //#pragma comment(lib, "ws2_32.lib") void write( SOCKET csock, string str ){ cout << str ; send(csock, str.c_str(), str.length(), 0); } void write( SOCKET csock, string contentType, string content ){ strstream stream; stream << "HTTP/1.1 200 OK\nServer: esneHttpd/1.0\n" << "Content-Type: " << contentType << "\n" "Content-Length: " << content.length() << "\n" << "\n" << content << ends ; cout << stream.str() ; string str=stream.str(); send(csock, str.c_str(), str.length(), 0); } string read( SOCKET csock ){ char buffer[1024]; int octetsLus ; octetsLus = recv(csock, buffer, 1024, 0); buffer[octetsLus]='\0'; return string(buffer); } SOCKET initialiseSocket( int port ) { WSADATA WSAData; SOCKET sock; SOCKADDR_IN sin; WSAStartup(MAKEWORD(2,0), &WSAData); sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_family = AF_INET; sin.sin_port = htons(port); sock = socket(AF_INET, SOCK_STREAM, 0); bind(sock, (SOCKADDR *)&sin, sizeof(sin)); listen(sock, 0); return sock; } void main() { SOCKET sock; SOCKET csock; SOCKADDR_IN csin; int valRet ; string request; sock = initialiseSocket(8080); int sinsize = sizeof(csin); while(true){ cout << "------------Attente d'une requete" << endl; csock = accept(sock, (SOCKADDR *)&csin, &sinsize); request = read(csock); cout << "-------------" << endl ; cout << request << endl; write(csock,"text/plain","texte de la page\n"); cout << "-------------" << endl ; closesocket(csock); } }
Je compile avec Borland 5.5 et VC6...
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 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> <title>formulaire</title> </head> <body> <form method="get" action="http://localhost:8080/tst-get.txt"> <p>zone1<input value="aa" name="zone1" size="20" type="text"></p> <p>zone2<input value="bb" name="zone2" size="20" type="text"></p> <p>zone3<input value="cc" name="zone3" size="20" type="text"></p> <p> <input value="GET" type="submit"></p> </form> <form method="post" enctype="application/x-www-form-urlencoded" action="http://localhost:8080/tst-post.txt"> <p>zone1<input value="dd" name="zone1" size="20" type="text"></p> <p>zone2<input value="ee" name="zone2" size="20" type="text"></p> <p>zone3<input value="ff" name="zone3" size="20" type="text"></p> <p> <input value="POST" type="submit"></p> </form> </body> </html>
Pourriez-vous me donner quelques pistes de recherche ?
Ma méthode de lecture est-elle fautive ?
Est-ce Firefox qui envoie des choses bizarres ?
Merci pour votre aide.
Partager