X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/1b53a979e1de9034a9755955ea22cd40ed138f23..0d72fb12dc9a570be45e2f25320ac49f604c3ed2:/Server/src/httpresponse.cpp?ds=sidebyside diff --git a/Server/src/httpresponse.cpp b/Server/src/httpresponse.cpp index fb6ba78..46cc55e 100644 --- a/Server/src/httpresponse.cpp +++ b/Server/src/httpresponse.cpp @@ -27,98 +27,113 @@ #include "plaqui/server/httpresponse.h" #include "plaqui/server/string.h" +#include #ifdef DEBUG # include #endif // DEBUG -PlaQui::Server::HTTPRequest::~HTTPResponse(void) { +using namespace std; + +namespace PlaQui { + +namespace Server { + +HTTPResponse::~HTTPResponse(void) { #ifdef DEBUG - std::cerr << __FILE__ << ": destructor." << std::endl; + cerr << __FILE__ << ": destructor." << endl; #endif // DEBUG } -PlaQui::Server::HTTPResponse::HTTPResponse(const std::string& version): - PlaQui::Server::HTTPMessage(version) { +HTTPResponse::HTTPResponse(const string& body, const string& version): + HTTPMessage(body, version) { #ifdef DEBUG - std::cerr << __FILE__ << ": http_version = " << http_version << std::endl; + cerr << __FILE__ << ": body.length = " << body.length() + << " | version = " << version << endl; #endif // DEBUG } -/* -PlaQui::Server::HTTPResponse::HTTPResponse(const Serializable& body, - const std::string& version): - PlaQui::Server::HTTPMessage(body, version) { +HTTPResponse::HTTPResponse(const HTTPError& error): + status_code(error.code) { #ifdef DEBUG - std::cerr << __FILE__ << ": http_version = " << http_version - << " | body = " << body.serialize() << std::endl; + cerr << __FILE__ << ": HTTPError(status_code = " << error.code + << ", reason = " << HTTPMessage::reason(error.code) << ", desc = " << error.what() + << ")" << endl; #endif // DEBUG + set_body(string(""); } -PlaQui::Server::HTTPResponse::HTTPResponse(const std::string& uri, - const PlaQui::Server::HTTPResponse::HTTPMethod& method, - std::string& query, std::string& version): - PlaQui::Server::HTTPMessage(body, version) { +HTTPResponse::HTTPResponse(unsigned status_code, const string& body): + HTTPMessage(body), status_code(status_code) { #ifdef DEBUG - std::cerr << __FILE__ << ": http_version = " << http_version - << " | body = " << body.serialize() << std::endl; + cerr << __FILE__ << ": status_code = " << status_code + << " | body.length = " << body.length() << endl; #endif // DEBUG } -*/ -std::istream& operator>>(std::istream& is, PlaQui::Server::HTTPResponse& req) { +istream& operator>>(istream& is, HTTPResponse& resp) + throw (HTTPResponse::Error, ios::failure) { #ifdef DEBUG - std::cerr << __FILE__ << ": operator>>()" << std::endl; + cerr << __FILE__ << ": operator>>()" << endl; #endif // DEBUG char buf[BUFSIZ]; // Obtengo primera línea (request) - is.getline(buf, BUFSIZ); + if (!is.getline(buf, BUFSIZ)) { + // No hay mas líneas. + throw ios::failure("socket closed"); + } #ifdef DEBUG - std::cerr << "Recibiendo linea: " << buf << std::endl; + cerr << __FILE__ << ":\tRecibiendo linea: " << buf << endl; #endif // DEBUG - String line = buf; + 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. - std::string::size_type pos = line.find_first_of(String::SPACE_CHARS, 5); - std::string ver = line.substr(5, pos); + string::size_type pos = line.find_first_of(String::SPACE_CHARS, 5); + string ver = line.substr(5, pos - 5); if ((ver == "1.1") || (ver == "1.0")) { - version = ver; + 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).trim(); + 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 != std::string::npos) { - // Si el resto es un protocolo válido, agrego más variables. - String reas = line.substr(pos + 1).trim(); + if (pos != string::npos) { + //FIXME String r = line.substr(pos + 1); + //resp.reason = r.trim(); 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) { - // FIXME - poner excepciones lindas. - throw "Invalid response code"; + throw HTTPResponse::INVALID_HTTP_RESPONSE_CODE; } - stringstream ss = line; // TODO ver forma mas linda de convertir - ss >> status_code; + stringstream ss; + ss << line; // TODO ver forma mas linda de convertir + ss >> resp.status_code; + is >> static_cast(resp); + return is; } -std::ostream& operator<<(std::ostream& os, PlaQui::Server::HTTPResponse& req) { +ostream& operator<<(ostream& os, const HTTPResponse& resp) { #ifdef DEBUG - std::cerr << __FILE__ << ": operator<<()" << std::endl; + cerr << __FILE__ << ": operator<<()" << endl; #endif // DEBUG - os << "HTTP/" << version << " " << status_code << " " << reason << "\r\l"; - // TODO ver que este bien el \r\l - os << *(static_cast(this)); + os << "HTTP/" << resp.version << " " << resp.status_code << " " + << HTTPMessage::reason(resp.status_code) << "\r\n"; + os << static_cast(resp); + return os; } +} // namespace Server + +} // namespace PlaQui +