Lecture intégrale du socket lors d'une réponse HTTP 1.1
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:
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 ;)