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.