ANNA Suite  2020b
Multipurpose development suite for Telco applications
Message.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
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 //
7 
8 
9 #ifndef anna_http_Message_hpp
10 #define anna_http_Message_hpp
11 
13 
14 #include <anna/comm/Message.hpp>
15 
16 #include <anna/http/Header.hpp>
17 #include <anna/http/Version.hpp>
18 
19 namespace anna {
20 
21 namespace http {
22 
23 namespace parser {
24 class Abstract;
25 }
26 
30 class Message : public comm::Message {
31 public:
34 
40 
45  struct Type {
46  enum _v {
49  };
50  };
51 
56  Type::_v getType() const { return a_type; }
57 
62  const std::string& getVersion() const { return a_version; }
63 
64  /*
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.
67  */
68  Version::_v getVersionAsEnum() const { return Version::asEnum(a_version); }
69 
75  const std::string& getExtraParameters() const { return a_extraParameters; }
76 
81  void setVersion(const std::string& version) { a_version = version; }
82 
87  void setVersion(const Version::_v version) { a_version = Version::asCString(version); }
88 
97  comm::Message* setBody(const xml::Node* node) noexcept(false);
98 
105  noexcept(false) {
106  return a_headers.create()->initialize(type);
107  }
108 
114  Header* createHeader(const std::string& name)
115  noexcept(false) {
116  return a_headers.create()->initialize(name);
117  }
118 
126  const Header* find(const Header::Type::_v type) const {
127  return const_cast <Message*>(this)->find(type);
128  }
129 
137  Header* find(const Header::Type::_v type) ;
138 
145  Header* find(const char* name) ;
146 
150  void clear() { a_headers.clear(); clearBody(); a_extraParameters.clear();}
151 
156  header_iterator header_begin() { return a_headers.begin(); }
157 
162  header_iterator header_end() { return a_headers.end(); }
163 
168  const_header_iterator header_begin() const { return a_headers.begin(); }
169 
174  const_header_iterator header_end() const { return a_headers.end(); }
175 
180  const DataBlock& code() noexcept(false);
181 
186  virtual std::string asString() const = 0;
187 
194  static Header* header(header_iterator& ii) { return Recycler<Header>::data(ii); }
195 
202  static const Header* header(const_header_iterator& ii) { return Recycler<Header>::data(ii); }
203 
204 protected:
209  Message(const Type::_v type) : comm::Message(StatusCodeBuffer::Reserve),
210  a_type(type), a_version("HTTP/1.1")
211  {;}
212 
213 private:
214  const Type::_v a_type;
215  std::string a_version;
216  Recycler <Header> a_headers;
217  std::string a_extraParameters;
218 
219  void codeLine(const std::string& line) noexcept(false);
220 
221  void appendExtraParameter(const std::string& extraParameter) {
222  a_extraParameters += ' ';
223  a_extraParameters += extraParameter;
224  }
225 
226  virtual std::string codeStartLine() const noexcept(false) = 0;
227 
228  friend class parser::Abstract;
229 };
230 
231 
232 }
233 }
234 
235 #endif
static const Header * header(const_header_iterator &ii)
Definition: Message.hpp:202
static T * data(iterator ii)
Definition: Recycler.hpp:233
container::const_iterator const_iterator
Definition: Recycler.hpp:34
Definition: Message.hpp:30
_v
Definition: Version.hpp:27
Recycler< Header >::iterator header_iterator
Definition: Message.hpp:32
header_iterator header_begin()
Definition: Message.hpp:156
Definition: Node.hpp:56
Definition: Abstract.hpp:28
Definition: Message.hpp:45
const_header_iterator header_begin() const
Definition: Message.hpp:168
const_header_iterator header_end() const
Definition: Message.hpp:174
Version::_v getVersionAsEnum() const
Definition: Message.hpp:68
header_iterator header_end()
Definition: Message.hpp:162
const Header * find(const Header::Type::_v type) const
Definition: Message.hpp:126
Definition: Header.hpp:25
Definition: Message.hpp:26
Message(const Type::_v type)
Definition: Message.hpp:209
_v
Definition: Message.hpp:46
Definition: Recycler.hpp:30
container::iterator iterator
Definition: Recycler.hpp:33
void initialize(const char *buffer, const int size) noexcept(false)
Recycler< Header >::const_iterator const_header_iterator
Definition: Message.hpp:33
Header * createHeader(const Header::Type::_v type) noexcept(false)
Definition: Message.hpp:104
void clear()
Definition: Message.hpp:150
Definition: Message.hpp:47
Message * setBody(const DataBlock &body) noexcept(false)
Definition: Message.hpp:51
static Header * header(header_iterator &ii)
Definition: Message.hpp:194
void setVersion(const std::string &version)
Definition: Message.hpp:81
Definition: app.hpp:12
Type::_v getType() const
Definition: Message.hpp:56
void setVersion(const Version::_v version)
Definition: Message.hpp:87
Definition: Response.hpp:21
Header * createHeader(const std::string &name) noexcept(false)
Definition: Message.hpp:114
_v
Definition: Header.hpp:32
const std::string & getVersion() const
Definition: Message.hpp:62
Definition: Message.hpp:87
const std::string & getExtraParameters() const
Definition: Message.hpp:75
Definition: DataBlock.hpp:24