1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_http_Message_hpp
10 #define anna_http_Message_hpp
12 #include <anna/core/util/Recycler.hpp>
14 #include <anna/comm/Message.hpp>
16 #include <anna/http/Header.hpp>
17 #include <anna/http/Version.hpp>
28 Clase base de los mensajes HTTP segun la RFC 2616.
30 class Message : public comm::Message {
32 typedef Recycler <Header>::iterator header_iterator;
33 typedef Recycler <Header>::const_iterator const_header_iterator;
36 * Para poder acceder a todos los métodos de anna::comm::Message;;setBody cuando
37 * se invocan desde un anna::http::Message (o heredados).
39 using comm::Message::setBody;
42 Tipos de mensaje HTTP.
47 Request, /**< Peticion HTTP */
48 Response /**< Respuesta HTTP */
53 Devuelve el tipo de este mensaje HTTP.
54 \return el tipo de este mensaje HTTP.
56 Type::_v getType() const throw() { return a_type; }
59 Devuelve la version del protocolo HTTP usada en el mensaje.
60 \return la version del protocolo HTTP usada en el mensaje.
62 const std::string& getVersion() const throw() { return a_version; }
65 * Devuelve el enumerado que identifica la versión HTTP usada en el mensaje.
66 * \return el enumerado que identifica la versión HTTP usada en el mensaje.
68 Version::_v getVersionAsEnum() const throw() { return Version::asEnum(a_version); }
71 * Devuelve los parámetros extras que pueden haber estado contenidos en los bloques
72 * de datos, en caso de que el mensaje se haya recibido como un "Transfer-Encoding: chunked".
73 * \return Los parámetros extras que pueden haber estado contenidos en los bloques
75 const std::string& getExtraParameters() const throw() { return a_extraParameters; }
78 Establece la version a codificar en el mensaje.
79 \param version Texto con la version HTTP a usar, HTTP/1.1, por ejemplo.
81 void setVersion(const std::string& version) throw() { a_version = version; }
84 * Establece la versión a codificar en el mensaje.
85 * \param version Identificador de la versión.
87 void setVersion(const Version::_v version) throw() { a_version = Version::asCString(version); }
90 * Establece el cuerpo de este mensaje con el contenido del documento XML correspondiente al
91 * nodo XML recibido como parámetro.
93 * También establece la cabecera \em Content-Type.
95 * \param node Nodo XML que contiene el documento XML.
97 comm::Message* setBody(const xml::Node* node) throw(RuntimeException);
100 Crea una nueva cabecera en este mensaje.
101 \param type Tipo de cabecera a crear.
102 \return La instancia de la nueva cabecera.
104 Header* createHeader(const Header::Type::_v type)
105 throw(RuntimeException) {
106 return a_headers.create()->initialize(type);
110 Crea una nueva cabecera en este mensaje.
111 \param name Nombre de la cabecera a crear.
112 \return La instancia de la nueva cabecera.
114 Header* createHeader(const std::string& name)
115 throw(RuntimeException) {
116 return a_headers.create()->initialize(name);
120 Devuelve la instancia de la primera cabecera que coincide con el tipo
121 recibido como parametro. Puede ser NULL si el mensaje no contiene ninguna
122 cabecera del tipo solicitado.
123 \param type Tipo de cabecera buscado.
124 \return La primera cabecera que coincide con el tipo recibido como parametro.
126 const Header* find(const Header::Type::_v type) const throw() {
127 return const_cast <Message*>(this)->find(type);
131 Devuelve la instancia de la primera cabecera que coincide con el tipo
132 recibido como parametro. Puede ser NULL si el mensaje no contiene ninguna
133 cabecera del tipo solicitado.
134 \param type Tipo de cabecera buscado.
135 \return La primera cabecera que coincide con el tipo recibido como parametro.
137 Header* find(const Header::Type::_v type) throw();
140 Devuelve la instancia de la primera cabecera de tipo Header::Category::Extension cuyo
141 nombre coincide con el recibido como parametro. Puede ser NULL.
142 \param name Nombre de la extension buscada.
143 \return La primera cabecera que coincide con el tipo recibido como parametro.
145 Header* find(const char* name) throw();
148 Inicializa el contenido de este mensaje. Libera las cabeceras y el cuerpo del mensaje.
150 void clear() throw() { a_headers.clear(); clearBody(); a_extraParameters.clear();}
153 Devuelve un iterador al comienzo de la lista de cabeceras.
154 \return un iterador al comienzo de la lista de cabeceras.
156 header_iterator header_begin() throw() { return a_headers.begin(); }
159 Devuelve un iterador al final de la lista de cabeceras.
160 \return un iterador al final de la lista de cabeceras.
162 header_iterator header_end() throw() { return a_headers.end(); }
165 Devuelve un iterador al comienzo de la lista de cabeceras.
166 \return un iterador al comienzo de la lista de cabeceras.
168 const_header_iterator header_begin() const throw() { return a_headers.begin(); }
171 Devuelve un iterador al final de la lista de cabeceras.
172 \return un iterador al final de la lista de cabeceras.
174 const_header_iterator header_end() const throw() { return a_headers.end(); }
177 Codifica este mensaje.
178 \return El bloque de datos que contiene el mensaje codificado.
180 const DataBlock& code() throw(anna::RuntimeException);
183 Devuelve una cadena con toda la informacion relevante de este objeto.
184 \return una cadena con toda la informacion relevante de este objeto.
186 virtual std::string asString() const throw() = 0;
189 Devuelve la instancia de la cabecera a la que referencia el iterator
190 recibido como parametro.
191 \return la instancia de la cabecera a la que referencia el iterator
192 recibido como parametro.
194 static Header* header(header_iterator& ii) throw() { return Recycler<Header>::data(ii); }
197 Devuelve la instancia de la cabecera a la que referencia el iterator
198 recibido como parametro.
199 \return la instancia de la cabecera a la que referencia el iterator
200 recibido como parametro.
202 static const Header* header(const_header_iterator& ii) throw() { return Recycler<Header>::data(ii); }
207 \param type Tipo de mensaje.
209 Message(const Type::_v type) : comm::Message(StatusCodeBuffer::Reserve),
210 a_type(type), a_version("HTTP/1.1")
214 const Type::_v a_type;
215 std::string a_version;
216 Recycler <Header> a_headers;
217 std::string a_extraParameters;
219 void codeLine(const std::string& line) throw(RuntimeException);
221 void appendExtraParameter(const std::string& extraParameter) throw() {
222 a_extraParameters += ' ';
223 a_extraParameters += extraParameter;
226 virtual std::string codeStartLine() const throw(anna::RuntimeException) = 0;
228 friend class parser::Abstract;