]> git.ipfire.org Git - thirdparty/squid.git/blob - src/HttpRequestMethod.h
Merged from trunk.
[thirdparty/squid.git] / src / HttpRequestMethod.h
1 /*
2 * $Id: HttpRequestMethod.h,v 1.12 2008/02/26 00:16:47 rousskov Exp $
3 *
4 *
5 * SQUID Web Proxy Cache http://www.squid-cache.org/
6 * ----------------------------------------------------------
7 *
8 * Squid is the result of efforts by numerous individuals from
9 * the Internet community; see the CONTRIBUTORS file for full
10 * details. Many organizations have provided support for Squid's
11 * development; see the SPONSORS file for full details. Squid is
12 * Copyrighted (C) 2001 by the Regents of the University of
13 * California; see the COPYRIGHT file for full details. Squid
14 * incorporates software developed and/or copyrighted by other
15 * sources; see the CREDITS file for full details.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
30 *
31 */
32
33 #ifndef SQUID_HTTPREQUESTMETHOD_H
34 #define SQUID_HTTPREQUESTMETHOD_H
35
36 #include "squid.h"
37 #include <iosfwd>
38 #include "SquidString.h"
39
40 enum _method_t {
41 METHOD_NONE, /* 000 */
42 METHOD_GET, /* 001 */
43 METHOD_POST, /* 010 */
44 METHOD_PUT, /* 011 */
45 METHOD_HEAD, /* 100 */
46 METHOD_CONNECT, /* 101 */
47 METHOD_TRACE, /* 110 */
48 METHOD_PURGE, /* 111 */
49 METHOD_OPTIONS,
50 METHOD_DELETE, /* RFC2616 section 9.7 */
51 METHOD_PROPFIND,
52 METHOD_PROPPATCH,
53 METHOD_MKCOL,
54 METHOD_COPY,
55 METHOD_MOVE,
56 METHOD_LOCK,
57 METHOD_UNLOCK,
58 METHOD_BMOVE,
59 METHOD_BDELETE,
60 METHOD_BPROPFIND,
61 METHOD_BPROPPATCH,
62 METHOD_BCOPY,
63 METHOD_SEARCH,
64 METHOD_SUBSCRIBE,
65 METHOD_UNSUBSCRIBE,
66 METHOD_POLL,
67 METHOD_REPORT,
68 METHOD_MKACTIVITY,
69 METHOD_CHECKOUT,
70 METHOD_MERGE,
71 METHOD_OTHER,
72 METHOD_ENUM_END // MUST be last, (yuck) this is used as an array-initialization index constant!
73 };
74
75
76 /**
77 * This class represents an HTTP Request METHOD
78 * - i.e. PUT, POST, GET etc.
79 * It has a runtime extension facility to allow it to
80 * efficiently support new methods
81 \ingroup POD
82 */
83 class HttpRequestMethod
84 {
85
86 public:
87 static void AddExtension(const char *methodString);
88 static void Configure(SquidConfig &Config);
89
90 HttpRequestMethod() : theMethod(METHOD_NONE), theImage() {}
91
92 HttpRequestMethod(_method_t const aMethod) : theMethod(aMethod), theImage() {}
93
94 /**
95 \param begin string to convert to request method.
96 \param end end of the method string (relative to begin). Use NULL if this is unknown.
97 *
98 \note DO NOT give end a default (ie NULL). That will cause silent char* conversion clashes.
99 */
100 HttpRequestMethod(char const * begin, char const * end);
101
102 HttpRequestMethod & operator = (const HttpRequestMethod& aMethod)
103 {
104 theMethod = aMethod.theMethod;
105 theImage = aMethod.theImage;
106 return *this;
107 }
108
109 HttpRequestMethod & operator = (_method_t const aMethod)
110 {
111 theMethod = aMethod;
112 theImage.clean();
113 return *this;
114 }
115
116 bool operator == (_method_t const & aMethod) const { return theMethod == aMethod; }
117 bool operator == (HttpRequestMethod const & aMethod) const
118 {
119 return theMethod == aMethod.theMethod &&
120 (theMethod != METHOD_OTHER || theImage == aMethod.theImage);
121 }
122
123 bool operator != (_method_t const & aMethod) const { return theMethod != aMethod; }
124 bool operator != (HttpRequestMethod const & aMethod) const
125 {
126 return !operator==(aMethod);
127 }
128
129 /** Iterate through all HTTP method IDs. */
130 HttpRequestMethod& operator++()
131 {
132 // TODO: when this operator is used in more than one place,
133 // replace it with HttpRequestMethods::Iterator API
134 // XXX: this interface can create METHOD_OTHER without an image
135 assert(theMethod < METHOD_ENUM_END);
136 theMethod = (_method_t)(1 + (int)theMethod);
137 return *this;
138 }
139
140 /** Get an ID representation of the method.
141 \retval METHOD_NONE the method is unset
142 \retval METHOD_OTHER the method is not recognized and has no unique ID
143 \retval * the method is on of the recognized HTTP methods.
144 */
145 _method_t const id() const { return theMethod; }
146
147 /** Get a char string representation of the method. */
148 char const* image() const;
149
150 bool isCacheble() const;
151 bool purgesOthers() const;
152
153 private:
154 static const char *RequestMethodStr[];
155
156 _method_t theMethod; ///< Method type
157 String theImage; ///< Used for store METHOD_OTHER only
158 };
159
160 inline std::ostream &
161 operator << (std::ostream &os, HttpRequestMethod const &method)
162 {
163 os << method.image();
164 return os;
165 }
166
167 inline const char*
168 RequestMethodStr(const _method_t m)
169 {
170 return HttpRequestMethod(m).image();
171 }
172
173 inline const char*
174 RequestMethodStr(const HttpRequestMethod& m)
175 {
176 return m.image();
177 }
178
179 #endif /* SQUID_HTTPREQUESTMETHOD_H */