TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
MissatgeHTTP.h
Veure la documentació d'aquest fitxer.
1 #if !defined(_MISSATGE_HTTP_H_)
2 #define _MISSATGE_HTTP_H_
3 
10 /*
11  * Copyright (c) 2012 Toni Corvera
12  *
13  * This file is part of TFCWeb.
14  *
15  * TFCWeb is free software: you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation, either version 3 of the License, or
18  * (at your option) any later version.
19  *
20  * TFCWeb is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
27  */
28 
29 #include "CapsaleraHTTP.h"
30 #include "portabilitat.h"
31 
32 #include <memory>
33 #include <vector>
34 
35 namespace tfc {
36 
37 // FIXME: RFC 2068 també?
38 // L'RFC recomana (no exigeix) enviar les capçaleres amb un ordre determinat
39 // (de més generals a més concretes respecte el contingut del missatge)
40 //
41 // Interessa conservar l'ordre d'inserció, si es fa servir una taula hash
42 // caldrà algún mètode de fer-ho:
43 // - afegir un vector<string> amb l'ordre d'inserció
44 // - utilitzar boost::multi_index
45 // <http://www.boost.org/doc/libs/1_49_0/libs/multi_index/doc/index.html>
46 // <http://stackoverflow.com/questions/1098175/a-stdmap-that-keep-track-of-the-order-of-insertion>
47 
51 template<typename TCos>
52 class MissatgeHTTP {
53 public:
54  typedef std::vector<CapsaleraHTTP> tipus_llista_capsaleres;
55 
63  std::string capsalera(const std::string & nom, bool * definida = 0) const;
64 
66  virtual bool operator==(const MissatgeHTTP<TCos> & m) const {
67  if (this == &m) {
68  return true;
69  }
70  return capsaleres_ == m.capsaleres_; // FIXME: == ó std::equal() ? Test case
71  }
72 
77  void afegeix_capsalera(const std::string & nom, const std::string & valor);
78 
84  template<typename Iterador>
85  void afegeix_capsaleres(const Iterador & inici, const Iterador & final);
86 
95  return capsaleres_;
96  }
97 
102  void defineix_cos(std::shared_ptr<TCos> cos) {
103  cos_ = cos;
104  }
105 
112  void imprimeix_capsaleres(std::ostream &os, const std::string & le = "\n") const;
113 
118  virtual std::weak_ptr<TCos> cos() const { return cos_; }
119 
120  bool te_cos() const { return 0 != cos_.get(); }
121 
126  bool elimina_capsalera(const std::string & nom) throw();
127 
128 protected:
130  : cos_()
131  {
132  // buit
133  }
134 
139  MissatgeHTTP(const MissatgeHTTP & m);
140 private:
141 
147  struct Impressor;
148 
155 
156 #if 0
157  // L'RFC no obliga però recomana ordenar les capçaleres (de més a menys generals)
158  // amb aquesta intenció interessa mantenir l'ordre d'inserció. Per a fer-ho
159  // cap utilitzar un contenidor addicional (ni map ni unordered_map mantenen l'ordre
160  // d'inserció), o un dels contenidors multi-clau de boost
167  std::unordered_map<std::string, CapsaleraHTTP> capsaleres_;
173  std::vector<std::string> ordre_capsaleres_;
174 #endif
175 
176  std::shared_ptr<TCos> cos_;
177 };
178 
179 } // ns tfc
180 
181 // Implementació (inclosa directament per ser una classe template)
182 #include "MissatgeHTTP.hxx"
183 
184 #endif // _MISSATGE_HTTP_H_
185 
186 // vim:set ts=4 et ai: //