RequestMethod.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/* DEBUG: section 73 HTTP Request */
10
11#include "squid.h"
12#include "http/RequestMethod.h"
13#include "SquidConfig.h"
14#include "wordlist.h"
15
16static Http::MethodType &
18{
19 int tmp = (int)aMethod;
20 aMethod = (Http::MethodType)(++tmp);
21 return aMethod;
22}
23
30void
32{
33 // XXX: performance regression due to this method no longer being a constructor
34 // ensure the members are empty/default values before any of the early-return
35 // optimizations can be used.
38
39 if (begin == nullptr)
40 return;
41
42 char const *end = begin + strcspn(begin, w_space);
43
44 if (end == begin)
45 return;
46
47 // TODO: Optimize this linear search.
49 // RFC 2616 section 5.1.1 - Method names are case-sensitive
50 // NP: this is not a HTTP_VIOLATIONS case since there is no MUST/SHOULD involved.
51 if (0 == image().caseCmp(begin, end-begin)) {
52
53 // relaxed parser allows mixed-case and corrects them on output
55 return;
56
57 if (0 == image().cmp(begin, end-begin))
58 return;
59 }
60 }
61
62 // if method not found and method string is not null then it is other method
64 theImage.assign(begin, end-begin);
65}
66
74{
75 if (s.isEmpty())
76 return;
77
78 // TODO: Optimize this linear search.
80 // RFC 2616 section 5.1.1 - Method names are case-sensitive
81 // NP: this is not a HTTP_VIOLATIONS case since there is no MUST/SHOULD involved.
82 if (0 == image().caseCmp(s)) {
83
84 // relaxed parser allows mixed-case and corrects them on output
86 return;
87
88 if (0 == image().cmp(s))
89 return;
90 }
91 }
92
93 // if method not found and method string is not null then it is other method
95 theImage = s;
96}
97
98const SBuf &
100{
101 static const SBuf methodOther("METHOD_OTHER");
104 } else {
105 if (!theImage.isEmpty()) {
106 return theImage;
107 } else {
108 return methodOther;
109 }
110 }
111}
112
113bool
115{
116 // Only a few methods are defined as safe. All others are "unsafe"
117
118 // NOTE:
119 // All known RFCs which register methods are listed in comments.
120 // if there is one not listed which defines methods, it needs
121 // checking and adding. If only to say it is known to define none.
122
123 switch (theMethod) {
124 // RFC 2068 - none
125
126 // RFC 2616 section 9.1.1
127 case Http::METHOD_GET:
130
131 // RFC 3253 section 3.6
133
134 // RFC 3648 - none
135 // RFC 3744 - none
136 // RFC 4437 - none
137 // RFC 4791 - none
138
139 // RFC 4918 section 9.1
141
142 // RFC 5323 section 2
144
145 // RFC 5789 - none
146 // RFC 5842 - none
147
148 // RFC 9113 section 3.4
149 case Http::METHOD_PRI:
150
151 return true;
152
153 default:
154 return false;
155 }
156}
157
158bool
160{
161 // Only a few methods are defined as idempotent.
162
163 // NOTE:
164 // All known RFCs which register methods are listed in comments.
165 // if there is one not listed which defines methods, it needs
166 // checking and adding. If only to say it is known to define none.
167
168 switch (theMethod) {
169 // RFC 2068 - TODO check LINK/UNLINK definition
170
171 // RFC 2616 section 9.1.2
172 case Http::METHOD_GET:
174 case Http::METHOD_PUT:
178
179 // RFC 3253 - TODO check
180 // RFC 3648 - TODO check
181 // RFC 3744 - TODO check
182 // RFC 4437 - TODO check
183 // RFC 4791 - TODO check
184
185 // RFC 4918 section 9
192
193 // RFC 5323 - TODO check
194 // RFC 5789 - TODO check
195 // RFC 5842 - TODO check
196
197 // RFC 7540 section 11.6
198 case Http::METHOD_PRI:
199
200 return true;
201
202 default:
203 return false;
204 }
205}
206
207bool
209{
210 // Only a few methods are defined as cacheable.
211 // All other methods from the below RFC are "MUST NOT cache"
212 switch (theMethod) {
213 // RFC 2616 section 9
214 case Http::METHOD_GET:
216 return true;
217#if WHEN_POST_CACHE_SUPPORTED
218 case Http::METHOD_POST: // Special case.
219 // RFC 2616 specifies POST as possibly cacheable
220 // However, Squid does not implement the required checks yet
221 return true;
222#endif
223
224 // RFC 4918 section 9
225#if WHEN_PROPFIND_CACHE_SUPPORTED
226 case Http::METHOD_PROPFIND: // Special case.
227 // RFC 4918 specifies PROPFIND as possibly cacheable
228 // However, Squid does not implement the required checks yet
229 return true;
230#endif
231
232 // RFC 5323 section 2 - defines no cacheable methods
233
234 // RFC 3253
235#if WHEN_CC_NOCACHE_DOES_REVALIDATES_IS_CONFIRMED
246 // RFC 3253 defines these methods using "MUST include Cache-Control: no-cache".
247 //
248 // XXX: follow RFC 2616 definition of "no-cache" meaning "MAY cache, always revalidate"
249 // XXX: or treat as unregistered/undefined methods ??
250 // However, Squid may not implement the required revalidation checks yet
251 return ??;
252#endif
253
254 // Special Squid method tokens are not cacheable.
255 // RFC 2616 defines all unregistered or unspecified methods as non-cacheable
256 // until such time as an RFC defines them cacheable.
257 default:
258 return false;
259 }
260}
261
262bool
264{
265 switch (theMethod) {
266 /* RFC 2616 section 13.10 - "MUST invalidate" */
268 case Http::METHOD_PUT:
270 return true;
271
272 /* Squid extension to force invalidation */
274 return true;
275
276 /*
277 * RFC 2616 sayeth, in section 13.10, final paragraph:
278 * A cache that passes through requests for methods it does not
279 * understand SHOULD invalidate any entities referred to by the
280 * Request-URI.
281 */
283 return true;
284
285 default:
286 // Methods which are known but not required to invalidate.
287 return false;
288 }
289}
290
291bool
293{
294 if (shouldInvalidate())
295 return true;
296
297 switch (theMethod) {
298 /* common sense suggests purging is not required? */
299 case Http::METHOD_GET: // XXX: but we do purge HEAD on successful GET
310 return false;
311
312 default:
313 return true;
314 }
315}
316
static Http::MethodType & operator++(Http::MethodType &aMethod)
class SquidConfig Config
Definition: SquidConfig.cc:12
bool purgesOthers() const
SBuf theImage
Used for storing the Http::METHOD_OTHER only. A copy of the parsed method text.
bool shouldInvalidate() const
bool isHttpSafe() const
void HttpRequestMethodXXX(char const *)
const SBuf & image() const
bool respMaybeCacheable() const
bool isIdempotent() const
Http::MethodType theMethod
Method type.
Definition: SBuf.h:94
bool isEmpty() const
Definition: SBuf.h:431
void clear()
Definition: SBuf.cc:175
SBuf & assign(const SBuf &S)
Definition: SBuf.cc:83
struct SquidConfig::@106 onoff
int relaxed_header_parser
Definition: SquidConfig.h:315
#define w_space
Definition: forward.h:18
enum Http::_method_t MethodType
const SBuf MethodType_sb[]
Definition: stub_libhttp.cc:58
@ METHOD_TRACE
Definition: MethodType.h:30
@ METHOD_MKWORKSPACE
Definition: MethodType.h:42
@ METHOD_NONE
Definition: MethodType.h:22
@ METHOD_REPORT
Definition: MethodType.h:44
@ METHOD_MERGE
Definition: MethodType.h:47
@ METHOD_LABEL
Definition: MethodType.h:46
@ METHOD_OTHER
Definition: MethodType.h:93
@ METHOD_UPDATE
Definition: MethodType.h:45
@ METHOD_MOVE
Definition: MethodType.h:71
@ METHOD_SEARCH
Definition: MethodType.h:76
@ METHOD_CHECKOUT
Definition: MethodType.h:39
@ METHOD_PUT
Definition: MethodType.h:27
@ METHOD_MKCOL
Definition: MethodType.h:69
@ METHOD_UNLOCK
Definition: MethodType.h:73
@ METHOD_POST
Definition: MethodType.h:26
@ METHOD_CHECKIN
Definition: MethodType.h:40
@ METHOD_OPTIONS
Definition: MethodType.h:31
@ METHOD_PRI
Definition: MethodType.h:89
@ METHOD_CONNECT
Definition: MethodType.h:29
@ METHOD_PROPPATCH
Definition: MethodType.h:68
@ METHOD_MKACTIVITY
Definition: MethodType.h:49
@ METHOD_VERSION_CONTROL
Definition: MethodType.h:43
@ METHOD_ENUM_END
Definition: MethodType.h:94
@ METHOD_GET
Definition: MethodType.h:25
@ METHOD_PURGE
Definition: MethodType.h:92
@ METHOD_COPY
Definition: MethodType.h:70
@ METHOD_LOCK
Definition: MethodType.h:72
@ METHOD_DELETE
Definition: MethodType.h:32
@ METHOD_HEAD
Definition: MethodType.h:28
@ METHOD_PROPFIND
Definition: MethodType.h:67
@ METHOD_BASELINE_CONTROL
Definition: MethodType.h:48
@ METHOD_UNCHECKOUT
Definition: MethodType.h:41
int unsigned int
Definition: stub_fd.cc:19

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors