* Obtiene los datos de la respuesta HTTP desde un texto.
*/
friend std::istream& operator>>(std::istream& is, Response& resp)
- /*throw(HTTPResponse::Error, std::ios::failure, sockerr)*/;
+ throw(HTTPResponse::Error, std::ios::failure, sockerr,
+ xmlpp::parse_error);
/**
* Convierte la respuesta HTTP en texto.
while (!stop()) {
Response response;
try {
- //Glib::Mutex::Lock lock(socket_mutex);
socket >> response;
// Si se cerró el socket.
} catch (const ios::failure& e) {
} catch (const sockerr& e) {
signal_error().emit(e.serrno(), e.errstr());
return;
+ } catch (const xmlpp::parse_error& e) {
+ signal_error().emit(100001, e.what());
+ continue;
// Si hay un error al parsear la respuesta.
} catch (const HTTPResponse::Error& e) {
#ifdef DEBUG
streamsize size;
to(m.headers["Content-Length"], size);
char* const buf2 = new char[size+1];
- if (is.readsome(buf2, size)) {
- m.body = buf2;
+ if (is.readsome(buf2, size) == size) {
+ // Agrego fin de string porque el readsome no lo hace.
+ buf2[size] = '\0';
+ m.set_body(buf2);
+#ifdef DEBUG
+ } else {
+ // TODO dar error?
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": operator>>() ERROR!!! Caracteres extraidos: "
+ << n << endl;
+#endif // DEBUG
}
delete []buf2;
}
}
istream& operator>>(istream& is, Response& resp)
- /*throw (HTTPResponse::Error, ios::failure, sockerr)*/ {
+ throw (HTTPResponse::Error, ios::failure, sockerr,
+ xmlpp::parse_error) {
#ifdef DEBUG
cerr << __FILE__ << "(" << __LINE__ << ")" << ": operator>>()" << endl;
#endif // DEBUG
is >> static_cast<HTTPResponse&>(resp);
if (resp.get_body().length()) {
- // TODO parseo XML del body para buscar las cosas basicas de la respuesta.
- Response::Parser parser(resp);
- try {
- parser.parse_memory(resp.get_body());
- } catch (const xmlpp::parse_error& e) {
- // TODO - ver gravedad.
-#ifdef DEBUG
- cerr << __FILE__ << "(" << __LINE__ << ")"
- << " : operator>>() error de parseo: " << e.what() << endl;
-#endif // DEBUG
- }
+ Response::Parser(resp).parse_memory(resp.get_body());
}
return is;
}