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 :
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.
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
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
On voit que je ne reçois pas le corps de la requête (les variables et leurs valeurs.
Avec IE je reçois
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
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
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);
 
	}
}
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
 
<!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>
Je compile avec Borland 5.5 et VC6...
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.