]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/httprequest.cpp
Algunos cambios mas, ya es probable que compile de nuevo (aunque no ande como deberia).
[z.facultad/75.42/plaqui.git] / Server / src / httprequest.cpp
index 4c28a51fba7fb084608b60b07fd3ff9b0a622ad8..2fb866158d3e2fc49157e102e9c4e7fd3985565c 100644 (file)
 #      include <iostream>
 #endif // DEBUG
 
 #      include <iostream>
 #endif // DEBUG
 
-PlaQui::Server::HTTPRequest::~HTTPRequest(void) {
+using namespace std;
+
+namespace PlaQui {
+
+namespace Server {
+
+HTTPRequest::~HTTPRequest(void) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ << ": destructor." << std::endl;
+       cerr << __FILE__ << ": destructor." << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-PlaQui::Server::HTTPRequest::HTTPRequest(const std::string& version):
-               PlaQui::Server::HTTPMessage(version) {
+HTTPRequest::HTTPRequest(const string& uri,    const HTTPMethod& method,
+               const string& query, const string& version):
+               HTTPMessage(version), method(method), uri(uri), query(query) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ << ": http_version = " << http_version << std::endl;
+       cerr << __FILE__ << ": uri = " << uri << " | "
+                       << "method = " << ((method == GET) ? "GET" : "POST") << " | "
+                       << "query = " << query << " | "
+                       << "version = " << version << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-PlaQui::Server::HTTPRequest::HTTPRequest(const Serializable& body,
-               const std::string& version):
-               PlaQui::Server::HTTPMessage(body, version) {
+/*
+HTTPRequest::HTTPRequest(const Serializable& body,
+               const string& version):
+               HTTPMessage(body, version) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ << ": http_version = " << http_version
-               << " | body = " << body.serialize() << std::endl;
+       cerr << __FILE__ << ": http_version = " << http_version
+               << " | body = " << body.serialize() << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-PlaQui::Server::HTTPRequest::HTTPRequest(const std::string& uri,
-               const PlaQui::Server::HTTPRequest::HTTPMethod& method,
-               std::string& query, std::string& version):
-               PlaQui::Server::HTTPMessage(body, version) {
+HTTPRequest::HTTPRequest(const string& uri,
+               const HTTPRequest::HTTPMethod& method,
+               string& query, string& version):
+               HTTPMessage(body, version) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ << ": http_version = " << http_version
-               << " | body = " << body.serialize() << std::endl;
+       cerr << __FILE__ << ": http_version = " << http_version
+               << " | body = " << body.serialize() << endl;
 #endif // DEBUG
 }
 #endif // DEBUG
 }
+*/
 
 
-void PlaQui::Server::HTTPRequest::serialize(std::ostream& os) {
+istream& operator>>(istream& is, HTTPRequest& req) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ << ": serialize()" << std::endl;
+       cerr << __FILE__ << ": operator>>()" << endl;
 #endif // DEBUG
 #endif // DEBUG
-       os << method << " " << uri;
-       if (query_string.length()) {
-               os << "?" << query;
-       }
-       os << "HTTP/" << version << "\r\l" << std::flush; // TODO ver que este bien el \r\l
-       HTTPMessage::serilize(os);
-       if (headers.size()) {
-               headers.serilize(os);
-       }
-       os << "\r\l" << std::flush;
-       if (body.size()) {
-               body.serilize(os);
-       }
-}
-
-void PlaQui::Server::HTTPRequest::unserialize(std::istream& is) {
-       const unsigned BUFFER_SIZE = 4096;
-       char buf[BUFFER_SIZE];
+       char buf[BUFSIZ];
        // Obtengo primera línea (request)
        // Obtengo primera línea (request)
-       is.getline(buf, BUFFER_SIZE);
+       is.getline(buf, BUFSIZ);
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << "Recibiendo linea: " << buf << std::endl;
+       cerr << "Recibiendo linea: " << buf << endl;
 #endif // DEBUG
 #endif // DEBUG
-       String line = buf;
+       String line(buf);
        // Si es la primera línea, es el request.
        if (line.length() < 3) {
                // FIXME - poner excepciones lindas.
                throw "HTTP/1.1 501 Method Not Implemented";
        }
        // Averiguo método.
        // Si es la primera línea, es el request.
        if (line.length() < 3) {
                // FIXME - poner excepciones lindas.
                throw "HTTP/1.1 501 Method Not Implemented";
        }
        // Averiguo método.
-       std::string::size_type pos = line.find_first_of(String::SPACE_CHARS);
+       string::size_type pos = line.find_first_of(String::SPACE_CHARS);
        String met = line.substr(0, pos); 
        if (met.to_upper() == "GET") {
        String met = line.substr(0, pos); 
        if (met.to_upper() == "GET") {
-               method = GET;
+               req.method = HTTPRequest::GET;
        } else if (met.to_upper() == "POST") {
        } else if (met.to_upper() == "POST") {
-               method = POST;
+               req.method = HTTPRequest::POST;
        } else {
                // FIXME - poner excepciones lindas.
                throw "HTTP/1.1 501 Method Not Implemented";
        }
        // Si tiene sólo el método, no es válido.
        line = line.substr(pos + 1);
        } else {
                // FIXME - poner excepciones lindas.
                throw "HTTP/1.1 501 Method Not Implemented";
        }
        // Si tiene sólo el método, no es válido.
        line = line.substr(pos + 1);
-       iine.trim();
+       line.trim();
        if (!line.length()) {
                // FIXME - poner excepciones lindas.
                throw "HTTP/1.1 400 Bad Request";
        }
        // Si tiene más espacios, tengo la URI y el protocolo (o un error).
        pos = line.find_first_of(String::SPACE_CHARS);
        if (!line.length()) {
                // FIXME - poner excepciones lindas.
                throw "HTTP/1.1 400 Bad Request";
        }
        // Si tiene más espacios, tengo la URI y el protocolo (o un error).
        pos = line.find_first_of(String::SPACE_CHARS);
-       if (pos != std::string::npos) {
+       if (pos != string::npos) {
                // Si el resto es un protocolo válido, agrego más variables.
                String protocol = line.substr(pos + 1);
                protocol = protocol.trim();
                if (protocol.to_upper() == "HTTP/1.0") {
                // Si el resto es un protocolo válido, agrego más variables.
                String protocol = line.substr(pos + 1);
                protocol = protocol.trim();
                if (protocol.to_upper() == "HTTP/1.0") {
-                       version = "1.0";
+                       req.version = "1.0";
                } else if (protocol.to_upper() == "HTTP/1.1") {
                } else if (protocol.to_upper() == "HTTP/1.1") {
-                       version = "1.1";
+                       req.version = "1.1";
                // Si no es un error.
                } else {
                        // FIXME - poner excepciones lindas.
                // Si no es un error.
                } else {
                        // FIXME - poner excepciones lindas.
@@ -138,14 +133,33 @@ void PlaQui::Server::HTTPRequest::unserialize(std::istream& is) {
                throw "HTTP/1.1 400 Bad Request";
        }
        // Si tiene un query string.
                throw "HTTP/1.1 400 Bad Request";
        }
        // Si tiene un query string.
-       pos = request.find("?");
-       if (pos != std::string::npos) {
-               query = line.substr(pos + 1);
+       pos = line.find("?");
+       if (pos != string::npos) {
+               req.query = line.substr(pos + 1);
        } else {
        } else {
-               query  = "";
+               req.query  = "";
        }
        }
-       uri = line.substr(0, pos);
-       // Fin de request, obtengo cabeceras y cuerpo.
-       HTTPMessage::unserialize(is);
+       req.uri = line.substr(0, pos);
+       // Fin de request, obtengo el mensaje.
+       is >> static_cast<HTTPMessage&>(req);
+       //PlaQui::Server::operator>>(is, static_cast<HTTPMessage>(req));
+       return is;
 }
 
 }
 
+ostream& operator<<(ostream& os, const HTTPRequest& req) {
+#ifdef DEBUG
+       cerr << __FILE__ << ": operator<<()" << endl;
+#endif // DEBUG
+       os << req.method << " " << req.uri;
+       if (req.query.length()) {
+               os << "?" << req.query;
+       }
+       // TODO ver que este bien el \r\l
+       os << " HTTP/" << req.version << "\r\n" << static_cast<const HTTPMessage&>(req);
+       return os;
+}
+
+} // namespace Server
+
+} // namespace PlaQui
+