Remove dynamic exceptions
[anna.git] / include / anna / http / Header.hpp
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_Header_hpp
10 #define anna_http_Header_hpp
11
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/core/Allocator.hpp>
14
15 namespace anna {
16
17 namespace http {
18
19 class Token;
20 class Message;
21
22 /**
23    Representacion de las cabeceras HTTP.
24 */
25 class Header {
26 public:
27   /**
28      Tipos de cabeceras definidos en la RFC 2616.
29      \see Header.
30   */
31   struct Type {
32     enum _v {
33       None,
34       /* Generales */
35       CacheControl, Connection, Date, Pragma, Trailer, TransferEncoding, Upgrade, Via,
36       Warning,
37       /* Request  */
38       Accept, AcceptCharset, AcceptEncoding, AcceptLanguage, Authorization, Expect, From,
39       Host, IfMatch, IfModifiedSince, IfNoneMatch, IfRange, IfUnmodifiedSince, MaxForwards,
40       ProxyAuthorization, Range, Referer, TE, UserAgent,
41       /* Entity Header */
42       Allow, ContentEncoding, ContentLanguage, ContentLength, ContentLocation, ContentMD5,
43       ContentRange, ContentType, Expires, LastModified,
44       /* Response Header */
45       AcceptRanges, Age, ETAG, Location, ProxyAuthenticate, RetryAfter, Server, Vary,
46       WWWAuthenticate,
47       /* Uso interno */
48       Unknown, End, Begin = 1
49     };
50   };
51
52   /**
53      Categorias de cabeceras definidos en la RFC 2616.
54      \see Header.
55   */
56   struct Category { enum _v { General, Response, Request, Entity, Extension }; };
57
58   /**
59      Modos de comparacion aplicados en el metodo #compare.
60      \see Header.
61   */
62   struct Compare { enum _v { Exact = 0, RightTrim = 1, LeftTrim = 2, NoCase = 4, FullMode = 7 }; };
63
64   /**
65      Destructor.
66   */
67   ~Header() { delete a_extensionName; }
68
69   /**
70      Devuelve el tipo de la cabecera.
71      \return el tipo de la cabecera.
72   */
73   Type::_v getType() const { return a_type; }
74
75   /**
76      Devuelve la categoria de la cabecera.
77      \return la categoria de la cabecera.
78   */
79   Category::_v getCategory() const { return a_category; }
80
81   /**
82      Devuelve el puntero nombre de la extension, puede ser NULL.
83      \return el puntero nombre de la extension, puede ser NULL.
84   */
85   const std::string* getExtensionName() const { return a_extensionName; }
86
87   /**
88      Devuelve el valor asociado a esta cabecera.
89      \return el valor asociado a esta cabecera.
90   */
91   const std::string& getStringValue() const { return a_value; }
92
93   /**
94      Devuelve el valor numerico asociado a esta cabecera.
95      \return el valor numerico asociado a esta cabecera.
96   */
97   const int getIntegerValue() const ;
98
99   /**
100      Establece el valor de esta cabecera.
101      \param token Token del que obtendremos el valor.
102      \warning Exclusivamente uso interno.
103   */
104   void setValue(const Token* token) ;
105
106   /**
107      Establece el valor asociado a esta cabecera.
108      \param value Valor a establecer.
109   */
110   void setValue(const std::string& value) { a_value = value; }
111
112   /**
113      Establece el valor asociado a esta cabecera.
114      \param value Valor a establecer.
115   */
116   void setValue(const int value) ;
117
118   /**
119      Operador de copia.
120      \param other Cabecera de la que copiar.
121      \return La instancia de si misma.
122   */
123   Header& operator = (const Header& other) ;
124
125   /**
126      Compara el contenido actual de esta cabecera con el literal recibido como parametro y
127      devuelve  un entero menor, igual o mayor que cero si se encuentra que el contenido
128      es,  respectivamente, menor que, igual a (concordante), o mayor que \em str.
129
130      \param str La cadena con la que comparar.
131      \param flags Modo de comparacion aplicado.
132
133      \return Un entero menor, igual o mayor que cero si se encuentra que el contenido
134      es, respectivamente, menor que, igual a (concordante), o mayor que \em str.
135   */
136   int compare(const char* str, const int flags = Compare::LeftTrim | Compare::NoCase) const ;
137
138   /**
139      Compara el contenido actual de esta cabecera con el literal recibido como parametro y
140      devuelve  \em true o \em false dependiendo de si el contenido coincide con \em str.
141
142      \param str La cadena con la que comparar.
143      \param flags Modo de comparacion aplicado.
144
145      \return  \em true o \em false dependiendo de si el contenido coincide con \em str.
146   */
147   bool match(const char* str, const int flags = Compare::LeftTrim | Compare::NoCase) const {
148     return compare(str, flags) == 0;
149   }
150
151   /**
152      Devuelve una cadena con toda la informacion relevante de este objeto.
153      \return una cadena con toda la informacion relevante de este objeto.
154   */
155   std::string asString() const ;
156
157   /**
158      Interpreta el token recibido como parametro y devuelve el valor de Type con el
159      que esta asociado.
160      \param token Token obtenido en la fase de analisis.
161      \warning Exclusivamente uso interno.
162      \return El tipo de cabecera.
163   */
164   static Type::_v asType(const Token* token) ;
165
166   /**
167      Interpreta el token recibido como parametro y devuelve el nombre de la cabecera
168      con la que esta asociado.
169      \param type Tipo de cabecera.
170      \warning Exclusivamente uso interno.
171      \return El literal con el nombre de la cabecera correspondiente al tipo recibido.
172   */
173   static const char* asLiteral(const Type::_v type) ;
174
175 private:
176   Type::_v a_type;
177   Category::_v a_category;
178   std::string* a_extensionName;
179   std::string a_value;
180   static const char* st_names [Type::End];
181
182   Header() : a_extensionName(NULL), a_category(Category::Extension) {;}
183   Header* initialize(const Type::_v type) noexcept(false);
184   Header* initialize(const std::string& name) noexcept(false);
185   std::string code() const ;
186
187   friend class Message;
188   friend class Allocator<Header>;
189 };
190
191
192 }
193 }
194
195 #endif