TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
CosResposta.h
Veure la documentació d'aquest fitxer.
1 #if !defined(_COS_RESPOSTA_H_)
2 #define _COS_RESPOSTA_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 "CodisEstatHTTP.h"
30 #include "Excepcions.h"
31 #include "Servidor.h"
32 #include "Transformacions.h"
33 
34 #include <memory>
35 #include <string>
36 #include <vector>
37 #include <boost/asio.hpp>
38 
39 namespace tfc {
40 
41 #if 0
42 
51 enum ContentEncoding {
52  CE_CAP = 0,
53  CE_IDENTITY,
54  CE_GZIP,
55  CE_COMPRESS,
56  CE_DEFLATE
57 };
58 
68 enum TransferEncoding {
69  TE_CAP = 0,
70  TE_IDENTITY,
71  TE_CHUNKED,
72  TE_GZIP,
73  TE_COMPRESS,
74  TE_DEFLATE
75 };
76 #endif
77 
81 class CosResposta {
82 public:
83  typedef std::pair<std::string, std::string> tipus_capsalera;
84  typedef std::vector<tipus_capsalera> tipus_capsaleres;
85  typedef std::shared_ptr<Transformacio> transformacio_ptr;
86  typedef boost::asio::ip::tcp::socket socket_tcp;
87 
91  explicit CosResposta(const PeticioHTTP & peticio)
92  : peticio_(peticio),
93  deflate_ok_(false), chunked_ok_(false),
94  trans_()
95  {
97  }
98 
100  : peticio_(cr.peticio_),
103  te_(cr.te_), ce_(cr.ce_),
104  trans_(cr.trans_)
105  {
106 
107  }
108 
110  peticio_ = cr.peticio_;
113  te_ = cr.te_;
114  ce_ = cr.ce_;
115  trans_ = cr.trans_;
116  return *this;
117  }
118 
119  virtual ~CosResposta() {
120  // buit
121  }
122 
128  virtual void envia(socket_tcp & socket) const
129  throw (std::runtime_error) = 0;
130 
135  virtual void envia_eom(socket_tcp & socket) const throw (ErrorEscrivintEnSocket);
136 
142  virtual tipus_capsaleres capsaleres() const;
143 
156  virtual bool pot_generar_capsaleres() const {
157  return false;
158  }
159 
160  const PeticioHTTP& peticio() const { return peticio_; }
161 
162 protected:
171  virtual size_t envia(socket_tcp & socket,
172  const std::string & buffer) const throw (ErrorEscrivintEnSocket);
173 
177  size_t envia_literal(socket_tcp & socket, const std::string & buffer)
178  const throw (ErrorEscrivintEnSocket);
179 
180 
182  bool deflate_ok() const { return deflate_ok_; }
183 
185  bool chunked_ok() const { return chunked_ok_; }
186 
191 
193  const std::string& content_encoding() const { return ce_; }
194 
196  const std::string& transfer_encoding() const { return te_; }
197 private:
200 
202  bool deflate_ok_;
203  bool chunked_ok_;
204  std::string te_,
205  ce_;
207 };
208 
209 class RecursDinamic : public CosResposta { // FIXME: Implementació temporal
210 public:
211  explicit RecursDinamic(const PeticioHTTP & p)
212  : CosResposta(p)
213  {
214  // buit
215  }
217  : CosResposta(rd)
218  {
219  // buit
220  }
223  return *this;
224  }
225 
230  virtual std::string html() const = 0;
231 
232  virtual void envia(socket_tcp & socket) const
233  throw (std::runtime_error)
234  {
235  this->envia(socket, html());
236  }
237 protected:
238  using CosResposta::envia; // envia(socket, string)
239 };
240 
242 public:
243  CosPaginaError(const PeticioHTTP & p, CodiEstatHTTP error, const std::string & missatge)
244  : RecursDinamic(p), error_(error), missatge_(missatge), cache_()
245  {
246  // buit
247  }
249  : RecursDinamic(cpe), error_(cpe.error_), missatge_(cpe.missatge_), cache_(cpe.cache_)
250  {
251  // buit
252  }
253 
254  virtual tipus_capsaleres capsaleres() const;
255  virtual std::string html() const;
256 private:
259  }
261  const std::string missatge_;
262  mutable std::string cache_;
263 };
264 
268 class CosTextual : public RecursDinamic {
269 public:
270  CosTextual(const PeticioHTTP & p, const std::string & text)
271  : RecursDinamic(p), text_(text)
272  {
273  // buit
274  }
276  : RecursDinamic(c), text_(c.text_)
277  {
278  // buit
279  }
280 
281  virtual string html() const { return text_; }
282 private:
285  }
286  const std::string text_;
287 };
288 
289 } // ns tfc
290 
291 #endif // _COS_RESPOSTA_H_
292 
293 // vim:set ts=4 et ai: //