-void ControlServer::real_run(void) {
- // FIXME se tiene que ir a la clase para poder frenarlo desde afuera.
- bool stop = false;
- char buf[BUFFER_SIZE];
- while (!stop) {
- stringstream sstr;
- while (!stop && socket.getline(buf, BUFFER_SIZE)) {
+void ControlServer::real_run(void) throw() {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": real_run()" << endl;
+#endif // DEBUG
+ //char buf[BUFSIZ];
+ while (!stop()) {
+ Command command;
+ try {
+ //Glib::Mutex::Lock lock(socket_mutex);
+ socket >> command;
+ } catch (const ios::failure& e) {
+ // TODO poner buenos codigos de error.
+ signal_error().emit(1000000, "Se desconectó.");
+ return;
+ } catch (const sockerr& e) {
+ signal_error().emit(e.serrno(), e.errstr());
+ return;
+ // Si se cerró el socket.
+ //} catch (const ios::failure& e) {
+ // stop = true;
+ // continue;
+ // Si hay un error al parsear el comando, se envia una respuesta con el
+ // error.
+ } catch (const HTTPError& e) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << " : real_run() ERROR: status_code = "
+ << e.code << " | reason = " << HTTPMessage::reason(e.code)
+ << " | desc = " << e.what() << endl;
+#endif // DEBUG
+ //Glib::Mutex::Lock lock(socket_mutex);
+ socket << HTTPResponse(e) << flush;
+ continue;
+ }
+ // TODO agregar las verificaciones de abajo a HTTPRequest y padres.
+ // Actualizacion: Estoy usando trim() en casi todos lados, no debería
+ // ser necesario.
+/*
+ // Primera línea no vacía (que debe ser el request).
+ bool is_first = true;
+ while (!stop && socket.getline(buf, BUFSIZ)) {