]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/httpresponse.cpp
Se arregla el bug que hacia que se cuelgue el cliente al desconectarse.
[z.facultad/75.42/plaqui.git] / Server / src / httpresponse.cpp
index ab26bd3aff5c6a7198ac11cda624ca52a87609a8..0177ae35cf44c9b5aef2f0c0f687569af5b4d85e 100644 (file)
@@ -40,82 +40,87 @@ namespace Server {
 
 HTTPResponse::~HTTPResponse(void) {
 #ifdef DEBUG
 
 HTTPResponse::~HTTPResponse(void) {
 #ifdef DEBUG
-       cerr << __FILE__ << ": destructor." << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": destructor." << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-HTTPResponse::HTTPResponse(const string& version):
-               HTTPMessage(version) {
+HTTPResponse::HTTPResponse(const string& body, const string& version):
+               HTTPMessage(body, version) {
 #ifdef DEBUG
 #ifdef DEBUG
-       cerr << __FILE__ << ": version = " << version << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": body.length = " << body.length()
+               << " | version = " << version << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-/*
-HTTPResponse::HTTPResponse(const Serializable& body,
-               const string& version):
-               HTTPMessage(body, version) {
+HTTPResponse::HTTPResponse(const HTTPError& error):
+               status_code(error.code) {
 #ifdef DEBUG
 #ifdef DEBUG
-       cerr << __FILE__ << ": http_version = " << http_version
-               << " | body = " << body.serialize() << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": HTTPError(status_code = " << error.code
+               << ", reason = " << HTTPMessage::reason(error.code) << ", desc = " << error.what()
+               << ")" << endl;
 #endif // DEBUG
 #endif // DEBUG
+       set_body(string("<response desc=\"") + error.what() + "\" />");
 }
 
 }
 
-HTTPResponse::HTTPResponse(const string& uri,
-               const HTTPResponse::HTTPMethod& method,
-               string& query, string& version):
-               HTTPMessage(body, version) {
+HTTPResponse::HTTPResponse(unsigned status_code, const string& body):
+               HTTPMessage(body), status_code(status_code) {
 #ifdef DEBUG
 #ifdef DEBUG
-       cerr << __FILE__ << ": http_version = " << http_version
-               << " | body = " << body.serialize() << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": status_code = " << status_code
+               << " | body.length = " << body.length() << endl;
 #endif // DEBUG
 }
 #endif // DEBUG
 }
-*/
 
 
-istream& operator>>(istream& is, HTTPResponse& resp) {
+istream& operator>>(istream& is, HTTPResponse& resp)
+               throw (HTTPResponse::Error, sockerr, ios::failure) {
 #ifdef DEBUG
 #ifdef DEBUG
-       cerr << __FILE__ << ": operator>>()" << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": operator>>()" << endl;
 #endif // DEBUG
        char buf[BUFSIZ];
        // Obtengo primera línea (request)
 #endif // DEBUG
        char buf[BUFSIZ];
        // Obtengo primera línea (request)
-       is.getline(buf, BUFSIZ);
+       if (!is.getline(buf, BUFSIZ)) {
+               // Fin de archivo.
+               throw ios::failure("eof");
+       }
 #ifdef DEBUG
 #ifdef DEBUG
-       cerr << "Recibiendo linea: " << buf << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ":\tRecibiendo linea: " << buf << endl;
 #endif // DEBUG
        String line(buf);
        // Si es la primera línea, es el request.
 #endif // DEBUG
        String line(buf);
        // Si es la primera línea, es el request.
-       if (line.to_upper().substr(0, 4) != "HTTP/") {
-               // FIXME - poner excepciones lindas.
-               throw "Not a HTTP response";
+       if (String(line.substr(0, 5)).to_upper() != "HTTP/") {
+               throw HTTPResponse::INVALID_HTTP_RESPONSE;
        }
        // Averiguo la versión.
        string::size_type pos = line.find_first_of(String::SPACE_CHARS, 5);
        }
        // Averiguo la versión.
        string::size_type pos = line.find_first_of(String::SPACE_CHARS, 5);
-       string ver = line.substr(5, pos); 
+       string ver = line.substr(5, pos - 5); 
        if ((ver == "1.1") || (ver == "1.0")) {
                resp.version = ver;
        } else {
        if ((ver == "1.1") || (ver == "1.0")) {
                resp.version = ver;
        } else {
-               // FIXME - poner excepciones lindas.
-               throw "Invalid HTTP version";
+               throw HTTPResponse::INVALID_HTTP_VERSION;
        }
        // Si tiene sólo la versión HTTP, no es válido.
        line = line.substr(pos + 1);
        line.trim();
        if (!line.length()) {
        }
        // Si tiene sólo la versión HTTP, no es válido.
        line = line.substr(pos + 1);
        line.trim();
        if (!line.length()) {
-               // FIXME - poner excepciones lindas.
-               throw "Invalid HTTP response";
+               throw HTTPResponse::MISSING_HTTP_RESPONSE_CODE;
        }
        // Si tiene más espacios, tengo la razón (reason).
        pos = line.find_first_of(String::SPACE_CHARS);
        if (pos != string::npos) {
        }
        // Si tiene más espacios, tengo la razón (reason).
        pos = line.find_first_of(String::SPACE_CHARS);
        if (pos != string::npos) {
-               String r = line.substr(pos + 1);
-               resp.reason = r.trim();
+               //FIXME String r = line.substr(pos + 1);
+               //resp.reason = r.trim();
                line = line.substr(0, pos);
        }
        line = line.trim();
        // Seteo el código.
                line = line.substr(0, pos);
        }
        line = line.trim();
        // Seteo el código.
+       // TODO - chequear el codigo a ver si pertenece a uno definido en la RFC.
        if (line.length() != 3) {
        if (line.length() != 3) {
-               // FIXME - poner excepciones lindas.
-               throw "Invalid response code";
+               throw HTTPResponse::INVALID_HTTP_RESPONSE_CODE;
        }
        stringstream ss;
        ss << line; // TODO ver forma mas linda de convertir
        }
        stringstream ss;
        ss << line; // TODO ver forma mas linda de convertir
@@ -124,12 +129,13 @@ istream& operator>>(istream& is, HTTPResponse& resp) {
        return is;
 }
 
        return is;
 }
 
-ostream& operator<<(ostream& os, const HTTPResponse& resp) {
+ostream& operator<<(ostream& os, const HTTPResponse& resp) throw(sockerr) {
 #ifdef DEBUG
 #ifdef DEBUG
-       cerr << __FILE__ << ": operator<<()" << endl;
+       cerr << __FILE__ << "(" << __LINE__ << ")"
+               << ": operator<<()" << endl;
 #endif // DEBUG
 #endif // DEBUG
-       os << "HTTP/" << resp.version << " " << resp.status_code << " " << resp.reason << "\n\r";
-       // TODO ver que este bien el \r\l
+       os << "HTTP/" << resp.version << " " << resp.status_code << " "
+               << HTTPMessage::reason(resp.status_code) << "\r\n";
        os << static_cast<const HTTPMessage&>(resp);
        return os;
 }
        os << static_cast<const HTTPMessage&>(resp);
        return os;
 }