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).
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.
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
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
Partager