TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
PeticioHTTP.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 "PeticioHTTP.h"
28 
29 #include <boost/assign.hpp> // boost::assign::map_list_of
30 
31 using namespace boost;
32 using namespace std;
33 using namespace tfc;
34 
35 namespace {
36 
37 const map<TipusPeticioHTTP, string> NOMS_TIPUS = assign::map_list_of
38  ( GET, "GET" )
39  ( POST, "POST" )
40  ( HEAD, "HEAD" )
41  ( OPTIONS, "OPTIONS" )
42  ( TRACE, "TRACE" )
43  ( PUT, "PUT" )
44  ( METODE_DELETE, "DELETE" )
45  ( CONNECT, "CONNECT" )
46  ( desconegut, "desconegut" );
47 } // ns <anònim>
48 
49 namespace tfc {
50 
51 namespace NomTipusPeticioHTTP {
52 
53 // NOMS_TIPUS és constant, per tant l'operador [] no es pot fer
54 // servir directament, complicant-ne l'accés
55 const string& nom(TipusPeticioHTTP tipus) {
56  return NOMS_TIPUS.find(tipus)->second;
57 }
58 
61  // RFC 2616, 5.1.1: "The method is case-sensitive."
62  if ("GET" == nom) {
63  tipus = GET;
64  }
65  else if ("POST" == nom) {
66  tipus = POST;
67  }
68  else if ("HEAD" == nom) {
69  tipus = HEAD;
70  }
71  else if ("OPTIONS" == nom) {
72  tipus = OPTIONS;
73  }
74  else if ("TRACE" == nom) {
75  tipus = TRACE;
76  }
77  else if ("PUT" == nom) {
78  tipus = PUT;
79  }
80  else if ("DELETE" == nom) {
81  tipus = METODE_DELETE;
82  }
83  else if ("CONNECT" == nom) {
84  tipus = CONNECT;
85  }
86  else {
87  throw ErrorMetodeDesconegut("El mètode `"+nom+"` és desconegut per aquest servidor");
88  }
89  return tipus;
90 }
91 
92 } // ns NomTipusPeticioHTTP
93 
94 // Impressió de VersioHTTP
95 ostream& operator<<(ostream & os, VersioHTTP v) {
96  string s;
97  s.reserve(8);
98  switch (v) {
99  case HTTP_DESCONEGUT: s = "HTTP/?.?"; break;
100  case HTTP_0_9: s = "HTTP/0.9"; break;
101  case HTTP_1_0: s = "HTTP/1.0"; break;
102  case HTTP_1_1: s = "HTTP/1.1"; break;
103  case HTTP_1_X: s = "HTTP/1.x"; break;
104  case HTTP_SUPERIOR: s = "HTTP/x.y"; break;
105  default: // Si passa probablement v no està inicialitzat
106  assert( !"Valor de VersioHTTP fora de rang" );
107  s = "HTTP/?.?";
108  break;
109  }
110 
111  return os << s;
112 }
113 
114 } // ns tfc
115 
116 // vim:set ts=4 et ai: //