/// Cuerpo del mensaje.
std::string body;
- protected:
+ protected: // TODO hacer privados con get() y set() ???
+
+ public:
/// Version HTTP.
std::string version;
- public:
-
/// Cabeceras HTTP.
HTTPHeaders headers;
// Atributos.
- protected:
+ protected: // TODO hacer privados con get() y set() ???
+
+ public:
/// Método HTTP.
+ /// @todo TODO - convertirlo a string? Hace todo más fácil (y más ineficiente :)
HTTPMethod method;
/// URI.
//char buf[BUFSIZ];
while (!stop) {
HTTPRequest request;
- socket >> request;
+ try {
+ socket >> request;
+ } catch (const char* e) {
+ cerr << "Error: " << e << endl;
+ stop = true;
+ continue;
+ } catch (string e) {
+ cerr << "Error: " << e << endl;
+ stop = true;
+ continue;
+ } catch (...) {
+ cerr << "Error desconocido!" << endl;
+ stop = true;
+ continue;
+ }
// TODO agregar las verificaciones de abajo a HTTPRequest y padres.
/*
// Primera línea no vacía (que debe ser el request).
response_xml << " </head>" << endl;
response_xml << " <body>" << endl;
response_xml << " <h1>PlaQui</h1>" << endl;
- response_xml << " <p>versión 0.2</p>" << endl;
+ response_xml << " <p>versión 0.3</p>" << endl;
response_xml << " <h2>Pedido HTTP</h2>" << endl;
response_xml << " <ul>" << endl;
+ response_xml << " <li><b>Versión:</b> " << request.version << endl;
+ response_xml << " <li><b>Método:</b> " << (request.method ? "POST" : "GET") << endl;
+ response_xml << " <li><b>URI:</b> " << request.uri << endl;
+ response_xml << " <li><b>Query:</b> " << request.query << endl;
for (HTTPHeaders::const_iterator i = request.headers.begin();
i != request.headers.end(); i++) {
response_xml << " <li><b>" << i->first << ":</b> "
string::size_type pos = sbuf.find(":");
if (pos == string::npos) {
// FIXME poner mejores excepciones.
- throw "Wrong header";
+ throw string("Wrong header: ") + sbuf;
}
h[sbuf.substr(0, pos)] = String(sbuf.substr(pos + 1)).trim();
+#ifdef DEBUG
+ cerr << __FILE__ << " " << sbuf.substr(0, pos) << " = "
+ << h[sbuf.substr(0, pos)] << endl;
+#endif // DEBUG
return is;
}
// $Id$
//
+#include "plaqui/server/string.h"
#include "plaqui/server/httpmessage.h"
#include <sstream>
#include <cstdlib>
#endif // DEBUG
char buf[BUFSIZ];
bool is_header = true;
- stringstream body_ss;
+ // TODO body
+ // Para hacer que reciba bien el body hay que chequear la cabecera
+ // Content-length, si queda tiempo lo haré...
+ //stringstream body_ss;
while (is.getline(buf, BUFSIZ)) {
- string sbuf = buf;
+ String sbuf(buf);
+ sbuf.trim();
if (sbuf.length()) {
if (is_header) {
stringstream ss;
- ss << buf;
+ ss << sbuf;
ss >> m.headers;
- } else {
- body_ss << buf << endl;
- }
+ }// else { TODO body
+ // body_ss << sbuf << endl;
+ //}
} else {
if (is_header) {
+ // TODO body
+ // Ver si tiene un Content-Length para saber si esperamos body.
+ // Si no esperamos body, no hay que hacer otro is.getline()
+ // porque se queda esperando forever.
is_header = false;
- } else {
- body_ss << buf << endl;
- }
+ break;
+ }// else { TODO body
+ // body_ss << sbuf << endl;
+ //}
}
}
- // TODO si el body es un serializable, deberia auto deserializarse.
- m.body = body_ss.str();
+ // TODO body
+ //m.body = body_ss.str();
return is;
}
// Inicializa threads.
Glib::thread_init();
+ try {
// Corre el server.
Server server(port);
server.run(false);
+ } catch (const char* e) {
+ cerr << "Error: " << e << endl;
+ } catch (exception e) {
+ cerr << "Error: " << e.what() << endl;
+ } catch (...) {
+ cerr << "Error desconocido!" << endl;
+ }
return 0;
}