TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
CapsaleraHTTP.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 "CapsaleraHTTP.h"
28 
29 #include <algorithm>
30 #include <vector>
31 #include <boost/algorithm/string.hpp>
32 #include <boost/assign.hpp>
33 
34 using namespace std;
35 using boost::algorithm::to_lower_copy;
36 
37 namespace {
38 
39 // Capçaleres que en l'RFC es defineixen amb múltiples valors (vegeu el bloc
40 // de comentaris al final d'aquest fitxer)
41 const vector<string> MULTI_VALOR = boost::assign::list_of
42  ( "accept" )
43  ( "accept-charset" )
44  ( "accept-encoding" )
45  ( "accept-language" )
46  ( "accept-ranges" )
47  ( "allow" )
48  ( "cache-control" )
49  ( "connection" )
50  ( "content-encoding" )
51  ( "content-language" )
52  ( "expect" )
53  ( "if-match" )
54  ( "if-none-match" )
55  ( "proxy-authenticate" )
56  ( "range" )
57  ( "te" )
58  ( "trailer" )
59  ( "transfer-encoding" )
60  ( "upgrade" )
61  ( "vary" )
62  ;
63 
64 } // ns anònim
65 
66 namespace tfc {
67 
68 void CapsaleraHTTP::set_valor(const string & nou_valor) {
69  valor_ = nou_valor;
70 }
71 
72 // static
73 bool CapsaleraHTTP::es_repetible(const string & nom) {
74  return MULTI_VALOR.end() != std::find(MULTI_VALOR.begin(),
75  MULTI_VALOR.end(),
76  to_lower_copy(nom));
77 }
78 
79 /* ----------------------------------------------------------- *
80  Classificació de capçaleres, RFC 2068
81  -----------------------------------------------------------
82 
83  - Generals (peticions i respostes), aplicables a missatge però no a cos
84  pàg. 34
85  Cache-Control
86  Connection
87  Date
88  Pragma
89  Transfer-Encoding
90  Upgrade
91  Via
92  - De petició, aplicables a petició i al propi client
93  pàg. 37
94  Accept
95  Accept-Charset
96  Accept-Encoding
97  Accept-Language
98  Authorization
99  From
100  Host
101  If-Modified-Since
102  If-Match
103  If-None-Match
104  If-Range
105  If-Unmodified-Since
106  Max-Forwards
107  Proxy-Authorization
108  Range
109  Referer
110  User-Agent
111  - De resposta, aplicables a futurs accessos al recurs, i al propi servidor
112  pàg. 40
113  Age [cache]
114  Location
115  Proxy-Authenticate
116  Public
117  Retry-After
118  Server
119  Vary
120  Warning
121  WWW-Authenticate
122  - D'entitat, aplicables a l'entitat transferida (o sol·licitada)
123  pàg. 41
124  Allow
125  Content-Base
126  Content-Encoding
127  Content-Language
128  Content-Length
129  Content-Location
130  Content-MD5
131  Content-Range
132  Content-Type
133  ETag
134  Expires
135  Last-Modified
136 
137 * ------------------------------------------------------------ */
138 
139 /* ----------------------------------------------------------- *
140  Multiplicitat de valors,
141  RFC 2068 a partir de pàg. 94
142  RFC 2616 a partir de pàg. 100
143  Els dos RFCs defineixen la multiplicitat d'algunes capçaleres de
144  forma diferent, però només en capçaleres que accepten valors
145  múltiples, de cara a aquest projecte això no és un problema
146  -----------------------------------------------------------
147 
148  - Múltiples valors (separats per comes): #( valors ) = 0 a infinit
149  Accept
150  Allow
151  TE
152 
153  - Múltiples valors (separats per comes): 1#( valors) = 1 a infinit
154  Accept-Charset
155  Accept-Encoding
156  Accept-Language
157  Accept-Ranges
158  Cache-Control
159  Connection
160  Content-Encoding
161  Content-Language
162  Expect
163  If-Match
164  If-None-Match
165  Proxy-Authenticate
166  Range // Requereix un anàlisi especial per què el format no és simètric respecte la coma: "bytes=0-0, 10-20"
167  Trailer
168  Transfer-Encoding
169  Upgrade
170  Vary
171 
172  - Valors únics
173  Age
174  Authorization
175  Content-Base // Eliminat en RFC 2616
176  Content-Length
177  Content-Location
178  Content-MD5
179  Content-Range
180  Content-Type
181  Date
182  ETag
183  Expires
184  From
185  Host
186  If-Modified-Since
187  If-Range
188  If-Unmodified-Since
189  Location
190  Max-Forwards
191  Proxy-Authorization
192  Referer
193  Retry-After
194  Server
195  User-Agent
196  Via
197  Warning
198  WWW-Authenticate
199 
200 * ------------------------------------------------------------ */
201 
202 } // ns tfc
203 
204 // vim:set ts=4 et ai: //