Bonjour,

Je suis entrain d'écrire plusieurs classes permettant de faire des requêtes HTTP/HTTPS et gérant les différent scenarii d'authentification définis dans ces protocoles.

En HTTP 1.1, l'usage de réponses "chunkées" me déroute à plusieurs égards et notamment dans la lecture du contenu du socket.
De ce que j'ai compris, un serveur HTTP 1.1 va diviser la réponse à faire en plusieurs morceaux et les envoie au fil de l'eau précédés de leur taille en octets.

J'utilise massivement Boost.asio et me suis inspiré de cet exemple : http://www.boost.org/doc/libs/1_53_0...ync_client.cpp
Je l'ai complétement repris pour fusionner les deux approches synchrones/asynchrones et ajouter HTTPS/SSL.

En mode synchrone, je cherche à mettre l'intégralité du contenu du socket dans un std::stringstream avant de passer à la phase de traitement (c'est pareil en asynchrone en fait mais avec une spécificité supplémentaire qui complexifierait l'explication 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
 
	std::stringstream *http_body = new std::stringstream(); // Flux du corp de la reponse à la requete
	boost::asio::streambuf *response = new boost::asio::streambuf(HTTP_SOCKET_MAXSIZE); // Flux de reponse brut
	boost::system::error_code step_err; // Erreur éventuelle à cet étape du traitement
	int size_read = -1; // Taille en octets lue depuis le socket
	// Premiere lecture avant le \r\n\r\n séparant les headers du body
	try {
		boost::asio::read_until(*socket, *response, "\r\n\r\n");
		*http_body << response;
	}catch (boost::system::system_error &e){
		step_err = e.code();
	}
 
	// Lecture du body ligne par ligne jusqu'à la fin
	while (size_read != 5){
		try {
			boost::asio::read_until(*socket, *response, "\r\n");
			size_read = response->size();
			std::cout << size_read << std::endl;
			*http_body << response;
		}catch (boost::system::system_error &e){
			step_err = e.code();
		}
	}
 
	this->send_handle_readContent (socket, response, http_body, step_err); // Passage a l'étape suivante
Néanmoins, dans le cas de réponses longues (une page HTML, par exemple http://www.infos-reseaux.com sur lequel je fais mes tests) je n'ai pas la totalité de la réponse. La lecture s'arrête à un endroit complétement arbitraire qui ne laisse rien entrevoir sur le pourquoi de la chose.

Sur des réponses bien plus courtes, par exemple :http://www.infos-reseaux.com/service...poData.Owner/2
J'ai le tout sans problème.

Le fait que la réponse soit chunkée ne permet pas de connaitre à l'avance la taille totale de la réponse du coup je vois mal comment déterminer une condition de fin de lecture.
Je crois que c'est ce qui pose problème ici.

Est-ce que quelqu'un a une expérience en la matière?

Merci par avance & bon week end