TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
CodisEstatHTTP.cc
Veure la documentació d'aquest fitxer.
1 
8 /*
9  * Copyright (c) 2012 Toni Corvera
10  *
11  * This file is part of TFCWeb.
12  *
13  * TFCWeb is free software: you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation, either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * TFCWeb is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
25  */
26 
27 #include "CodisEstatHTTP.h"
28 
29 #include <cassert>
30 #include <boost/assign.hpp> // boost::assign::map_list_of
31 #include <boost/unordered_map.hpp>
32 
33 using namespace boost;
34 using namespace std;
35 
36 namespace {
37 
38 using namespace tfc;
39 
40 using boost::unordered_map;
41 using boost::hash;
42 
43 // Hashing: unordered_map requereix una funció hash, i (almenys g++/clang)
44 // no crea una per enum's
45 // Solucions:
46 // - Aprofitar que els enums són int's i:
47 // - Definir el map com a unordered_map<int, string>
48 // o
49 // - Reutilitzar el hasher d'int
50 // o
51 // - Derivar tr1::hash per al tipus CodiEstatHTTP
52 // Cal fer-ho en std::tr1 (en aquest cas és permés)
53 
54 // FIXME: És legal enviar capçaleres UTF-8?
55 const unordered_map<CodiEstatHTTP, string, hash<int> > FRASES = assign::map_list_of
56  ( CODI_100, "Continua" )
57  ( CODI_101, "Canviant protocols" )
58  ( CODI_200, "OK" )
59  ( CODI_201, "Creat" )
60  ( CODI_202, "Acceptat" )
61  ( CODI_203, "Informació no autoritària" )
62  ( CODI_204, "Sense contingut" )
63  ( CODI_205, "Re-inici de contingut" )
64  ( CODI_206, "Contingut parcial" )
65  ( CODI_300, "Eleccions múltiples" )
66  ( CODI_301, "Mogut permanentment" )
67  ( CODI_302, "Mogut temporalment" )
68  ( CODI_303, "Vegeu altres" )
69  ( CODI_304, "No modificat" )
70  ( CODI_305, "Utilitza proxy" )
71  ( CODI_306, "" ) // Utilitzat en esborranys anteriors de l'RFC, reservat. RFC 2616
72  ( CODI_307, "Redirecció temporal" ) // RFC 2616
73  ( CODI_400, "Petició incorrecta" )
74  ( CODI_401, "No autoritzat" )
75  ( CODI_402, "Cal pagament" ) // No utilitzat, però reservat
76  ( CODI_403, "Prohibit" )
77  ( CODI_404, "No trobat" )
78  ( CODI_405, "Mètode no permès" )
79  ( CODI_406, "No acceptable" ) // Contingut conflictiu amb "Accept"
80  ( CODI_407, "Cal autenticació de proxy" )
81  ( CODI_408, "Temps de petició exhaurit" )
82  ( CODI_409, "Conflicte" )
83  ( CODI_410, "Desaparegut" )
84  ( CODI_411, "Cal indicar longitud" )
85  ( CODI_412, "Precondició fallida" )
86  ( CODI_413, "Entitat de petició massa gran" )
87  ( CODI_414, "L'URI sol·licitada és massa llarga" )
88  ( CODI_415, "Media type no suportat" )
89  ( CODI_416, "Rang sol·licitat no satisfactible" ) // RFC 2616
90  ( CODI_417, "Expectació fallada" ) // RFC 2616
91  ( CODI_500, "Error intern del servidor" )
92  ( CODI_501, "No implementat" )
93  ( CODI_502, "Porta d'enllaç incorrecta" )
94  ( CODI_503, "Servei no disponible" )
95  ( CODI_504, "Temps de porta d'enllaç exhaurit" )
96  ( CODI_505, "Versió d'HTTP no suportada" )
97  ; // map_list_of
98 
99 } // ns anònim
100 
101 namespace tfc {
102 
103 namespace FrasesEstatHTTP {
104 
105 const string& frase(CodiEstatHTTP codi) {
106  // FRASES és constant, per tant l'operador [] no es pot fer
107  // servir directament, complicant-ne l'accés
108  // find() retorna un iterador al 'pair'
109  const auto it = FRASES.find(codi);
110  assert( FRASES.end() != it );
111 
112  return it->second;
113 }
114 
115 } // ns FrasesEstatHTTP
116 
117 } // ns tfc
118 
119 // vim:set ts=4 et ai: //