]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Server/src/httpmessage.cpp
Ya anda de nuevo el server. Compila y anda tan (in?)estable como antes, aunque tiene...
[z.facultad/75.42/plaqui.git] / Server / src / httpmessage.cpp
1 // vim: set noexpandtab tabstop=4 shiftwidth=4:
2 //----------------------------------------------------------------------------
3 //                                  PlaQui
4 //----------------------------------------------------------------------------
5 // This file is part of PlaQui.
6 //
7 // PlaQui is free software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the Free Software
9 // Foundation; either version 2 of the License, or (at your option) any later
10 // version.
11 //
12 // PlaQui is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 // details.
16 //
17 // You should have received a copy of the GNU General Public License along
18 // with PlaQui; if not, write to the Free Software Foundation, Inc., 59 Temple
19 // Place, Suite 330, Boston, MA  02111-1307  USA
20 //----------------------------------------------------------------------------
21 // Creado:  dom oct 26 22:02:09 ART 2003
22 // Autores: Leandro Lucarella <llucare@fi.uba.ar>
23 //----------------------------------------------------------------------------
24 //
25 // $Id$
26 //
27
28 #include "plaqui/server/string.h"
29 #include "plaqui/server/httpmessage.h"
30 #include <sstream>
31 #include <cstdlib>
32 #ifdef DEBUG
33 #       include <iostream>
34 #endif // DEBUG
35
36 using namespace std;
37
38 namespace PlaQui {
39         
40 namespace Server {
41
42 HTTPMessage::~HTTPMessage(void) {
43 #ifdef DEBUG
44         cerr << __FILE__ << ": destructor." << endl;
45 #endif // DEBUG
46 }
47
48 HTTPMessage::HTTPMessage(const string& version):
49                 version(version) {
50 #ifdef DEBUG
51         cerr << __FILE__ << ": version = " << version << endl;
52 #endif // DEBUG
53 }
54
55 /*
56 HTTPMessage::HTTPMessage(const string& _body,
57                 const string& http_version):
58                 http_version(http_version) {
59 #ifdef DEBUG
60         cerr << __FILE__ << ": http_version = " << http_version
61                 << " | body = " << body << endl;
62 #endif // DEBUG
63         set_body(_body);
64 }
65 */
66
67 void HTTPMessage::set_body(const string& _body) {
68         body = _body;
69         if (body.length()) {
70                 stringstream ss; // TODO ver forma mas linda de convertir
71                 ss << body.length();
72                 headers["Content-Length"] = ss.str();
73         }
74 }
75
76 const string& HTTPMessage::get_body(void) const {
77         return body;
78 }
79
80 istream& operator>>(istream& is, HTTPMessage& m) {
81 #ifdef DEBUG
82         cerr << __FILE__ << ": operator>>()" << endl;
83 #endif // DEBUG
84         char buf[BUFSIZ];
85         bool is_header = true;
86         // TODO body
87         // Para hacer que reciba bien el body hay que chequear la cabecera
88         // Content-length, si queda tiempo lo haré...
89         //stringstream body_ss;
90         while (is.getline(buf, BUFSIZ)) {
91                 String sbuf(buf);
92                 sbuf.trim();
93                 if (sbuf.length()) {
94                         if (is_header) {
95                                 stringstream ss;
96                                 ss << sbuf;
97                                 ss >> m.headers;
98                         }// else { TODO body
99                         //      body_ss << sbuf << endl;
100                         //}
101                 } else {
102                         if (is_header) {
103                                 // TODO body
104                                 // Ver si tiene un Content-Length para saber si esperamos body.
105                                 // Si no esperamos body, no hay que hacer otro is.getline()
106                                 // porque se queda esperando forever.
107                                 is_header = false;
108                                 break;
109                         }// else { TODO body
110                         //      body_ss << sbuf << endl;
111                         //}
112                 }
113         }
114         // TODO body
115         //m.body = body_ss.str();
116         return is;
117 }
118
119 ostream& operator<<(ostream& os, const HTTPMessage& m) {
120 #ifdef DEBUG
121         cerr << __FILE__ << ": operator<<()" << endl;
122 #endif // DEBUG
123         return os << m.headers << "\n\r" // Fin de cabeceras
124                 << m.body;
125 }
126
127 } // namespace Server
128
129 } // namespace PlaQui
130