-rw-r--r-- | include/Makefile.am | 4 | ||||
-rw-r--r-- | include/kingate/cgi_gateway.h | 5 | ||||
-rw-r--r-- | include/kingate/cookies.h | 300 | ||||
-rw-r--r-- | include/kingate/headers.h | 94 | ||||
-rw-r--r-- | include/kingate/util.h | 13 |
5 files changed, 415 insertions, 1 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index e0b778b..ee5cd51 100644 --- a/include/Makefile.am +++ b/include/Makefile.am | |||
@@ -1,7 +1,9 @@ | |||
1 | nobase_include_HEADERS = \ | 1 | nobase_include_HEADERS = \ |
2 | kingate/cgi_gateway.h \ | 2 | kingate/cgi_gateway.h \ |
3 | kingate/cgi_interface.h \ | 3 | kingate/cgi_interface.h \ |
4 | kingate/fastcgi.h \ | 4 | kingate/fastcgi.h \ |
5 | kingate/exception.h \ | 5 | kingate/exception.h \ |
6 | kingate/util.h \ | 6 | kingate/util.h \ |
7 | kingate/plaincgi.h | 7 | kingate/plaincgi.h \ |
8 | kingate/cookies.h \ | ||
9 | kingate/headers.h | ||
diff --git a/include/kingate/cgi_gateway.h b/include/kingate/cgi_gateway.h index a5c4056..f20d72b 100644 --- a/include/kingate/cgi_gateway.h +++ b/include/kingate/cgi_gateway.h | |||
@@ -1,92 +1,97 @@ | |||
1 | #ifndef __KINGATE_CGI_GATEWAY_H | 1 | #ifndef __KINGATE_CGI_GATEWAY_H |
2 | #define __KINGATE_CGI_GATEWAY_H | 2 | #define __KINGATE_CGI_GATEWAY_H |
3 | 3 | ||
4 | #include <map> | 4 | #include <map> |
5 | #include "kingate/cgi_interface.h" | 5 | #include "kingate/cgi_interface.h" |
6 | #include "kingate/cookies.h" | ||
6 | 7 | ||
7 | #ifndef __deprecated | 8 | #ifndef __deprecated |
8 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 | 9 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 |
9 | #define __deprecated __attribute__((deprecated)) | 10 | #define __deprecated __attribute__((deprecated)) |
10 | #else | 11 | #else |
11 | #define __deprecated | 12 | #define __deprecated |
12 | #endif | 13 | #endif |
13 | #endif | 14 | #endif |
14 | 15 | ||
15 | /** | 16 | /** |
16 | * @file | 17 | * @file |
17 | * @brief the cgi_gateway -- main interface to CGI. | 18 | * @brief the cgi_gateway -- main interface to CGI. |
18 | */ | 19 | */ |
19 | 20 | ||
20 | namespace kingate { | 21 | namespace kingate { |
21 | using namespace std; | 22 | using namespace std; |
22 | 23 | ||
23 | /** | 24 | /** |
24 | * The main class interfacing with the CGI environment. | 25 | * The main class interfacing with the CGI environment. |
25 | */ | 26 | */ |
26 | class cgi_gateway { | 27 | class cgi_gateway { |
27 | public: | 28 | public: |
28 | /** | 29 | /** |
29 | * The interface to CGI environment (e.g. fastcgi). | 30 | * The interface to CGI environment (e.g. fastcgi). |
30 | */ | 31 | */ |
31 | cgi_interface& iface; | 32 | cgi_interface& iface; |
32 | /** | 33 | /** |
33 | * The type describing map holding parameters parsed from query string or input. | 34 | * The type describing map holding parameters parsed from query string or input. |
34 | */ | 35 | */ |
35 | typedef multimap<string,string> params_t; | 36 | typedef multimap<string,string> params_t; |
36 | /** | 37 | /** |
37 | * The GET-passed parameters. | 38 | * The GET-passed parameters. |
38 | */ | 39 | */ |
39 | params_t get; | 40 | params_t get; |
40 | /** | 41 | /** |
41 | * The POST-passed parameters. | 42 | * The POST-passed parameters. |
42 | */ | 43 | */ |
43 | params_t post; | 44 | params_t post; |
44 | /** | 45 | /** |
46 | * Cookies passed. | ||
47 | */ | ||
48 | cookies_t cookies; | ||
49 | /** | ||
45 | * Was the stdin content parsed? | 50 | * Was the stdin content parsed? |
46 | */ | 51 | */ |
47 | bool b_parsed_content; | 52 | bool b_parsed_content; |
48 | 53 | ||
49 | /** | 54 | /** |
50 | * @param ci the interface to use. | 55 | * @param ci the interface to use. |
51 | */ | 56 | */ |
52 | cgi_gateway(cgi_interface& ci); | 57 | cgi_gateway(cgi_interface& ci); |
53 | 58 | ||
54 | /** | 59 | /** |
55 | * Check whether there is an 'environment' meta-variable with specific name | 60 | * Check whether there is an 'environment' meta-variable with specific name |
56 | * passed to CGI. | 61 | * passed to CGI. |
57 | * @param n variable name. | 62 | * @param n variable name. |
58 | * @return true if yes. | 63 | * @return true if yes. |
59 | * @see cgi_interface::has_meta() | 64 | * @see cgi_interface::has_meta() |
60 | * @see get_meta() | 65 | * @see get_meta() |
61 | */ | 66 | */ |
62 | bool has_meta(const string& n) const { return iface.has_meta(n); } | 67 | bool has_meta(const string& n) const { return iface.has_meta(n); } |
63 | /** | 68 | /** |
64 | * Retrieve the 'environment' meta-variable value. | 69 | * Retrieve the 'environment' meta-variable value. |
65 | * @param n variable name. | 70 | * @param n variable name. |
66 | * @return variable contents. | 71 | * @return variable contents. |
67 | * @see exception_notfound | 72 | * @see exception_notfound |
68 | * @see cgi_interface::get_meta() | 73 | * @see cgi_interface::get_meta() |
69 | */ | 74 | */ |
70 | const string& get_meta(const string& n) const { return iface.get_meta(n); } | 75 | const string& get_meta(const string& n) const { return iface.get_meta(n); } |
71 | 76 | ||
72 | /** | 77 | /** |
73 | * fetch reference to the 'stdin' stream. | 78 | * fetch reference to the 'stdin' stream. |
74 | * @return the reference to the corresponding istream object. | 79 | * @return the reference to the corresponding istream object. |
75 | * @see cgi_interface::in() | 80 | * @see cgi_interface::in() |
76 | */ | 81 | */ |
77 | istream& in() { return iface.in(); } | 82 | istream& in() { return iface.in(); } |
78 | /** | 83 | /** |
79 | * fetch reference to the 'stdout' stream. | 84 | * fetch reference to the 'stdout' stream. |
80 | * @return the reference to the corresponding ostream object. | 85 | * @return the reference to the corresponding ostream object. |
81 | * @see cgi_interface::out() | 86 | * @see cgi_interface::out() |
82 | */ | 87 | */ |
83 | ostream& out() { return iface.out(); } | 88 | ostream& out() { return iface.out(); } |
84 | /** | 89 | /** |
85 | * fetch reference to the 'stderr' stream. | 90 | * fetch reference to the 'stderr' stream. |
86 | * @return the reference to the corresponding ostream object. | 91 | * @return the reference to the corresponding ostream object. |
87 | * @see cgi_interface::err() | 92 | * @see cgi_interface::err() |
88 | */ | 93 | */ |
89 | ostream& err() { return iface.err(); } | 94 | ostream& err() { return iface.err(); } |
90 | /** | 95 | /** |
91 | * cast to the ostream -- fetches the reference to the 'stdout' | 96 | * cast to the ostream -- fetches the reference to the 'stdout' |
92 | * stream. | 97 | * stream. |
diff --git a/include/kingate/cookies.h b/include/kingate/cookies.h new file mode 100644 index 0000000..83ef0c6 --- a/dev/null +++ b/include/kingate/cookies.h | |||
@@ -0,0 +1,300 @@ | |||
1 | #ifndef __KINGATE_COOKIES_H | ||
2 | #define __KINGATE_COOKIES_H | ||
3 | |||
4 | #include <string> | ||
5 | #include <map> | ||
6 | #include <ostream> | ||
7 | |||
8 | /** | ||
9 | * @file | ||
10 | * @brief cookies-related classes. | ||
11 | */ | ||
12 | |||
13 | namespace kingate { | ||
14 | using namespace std; | ||
15 | |||
16 | /** | ||
17 | * Class, holding the cookie with parameters. | ||
18 | */ | ||
19 | class cookie : public map<string,string> { | ||
20 | public: | ||
21 | /** | ||
22 | * Cookie name. | ||
23 | */ | ||
24 | string name; | ||
25 | /** | ||
26 | * Cookie value. | ||
27 | */ | ||
28 | string value; | ||
29 | |||
30 | cookie() { } | ||
31 | /** | ||
32 | * @param n cookie name. | ||
33 | * @param v cookie value. | ||
34 | */ | ||
35 | cookie(const string& n,const string& v) | ||
36 | : name(n), value(v) { } | ||
37 | |||
38 | /** | ||
39 | * set cookie parameter. | ||
40 | * @param p parameter name. | ||
41 | * @param v parameter value. | ||
42 | * @see _get_string() | ||
43 | */ | ||
44 | void _set_string(const string& p,const string& v); | ||
45 | |||
46 | /** | ||
47 | * @param n cookie name. | ||
48 | * @see get_name() | ||
49 | */ | ||
50 | void set_name(const string& n) { name = n; } | ||
51 | /** | ||
52 | * @param v cookie value. | ||
53 | * @see set_value() | ||
54 | */ | ||
55 | void set_value(const string& v) { value = v; } | ||
56 | /** | ||
57 | * @param c coomment. | ||
58 | * @see get_comment() | ||
59 | * @see has_comment() | ||
60 | * @see unset_comment() | ||
61 | */ | ||
62 | void set_comment(const string& c); | ||
63 | /** | ||
64 | * @param d domain. | ||
65 | * @see get_domain() | ||
66 | * @see has_domain() | ||
67 | * @see unset_domain() | ||
68 | */ | ||
69 | void set_domain(const string& d); | ||
70 | /** | ||
71 | * @param ma max-age. | ||
72 | * @see get_max_age() | ||
73 | * @see has_max_age() | ||
74 | * @see unset_max_age() | ||
75 | */ | ||
76 | void set_max_age(const string& ma); | ||
77 | /** | ||
78 | * @param p path. | ||
79 | * @see get_path() | ||
80 | * @see has_path() | ||
81 | * @see unset_path() | ||
82 | */ | ||
83 | void set_path(const string& p); | ||
84 | /** | ||
85 | * set cookie security. | ||
86 | * @param s true if secure. | ||
87 | * @see get_secure() | ||
88 | * @see is_secure() | ||
89 | */ | ||
90 | void set_secure(bool s); | ||
91 | |||
92 | /** | ||
93 | * @param e expiration time. | ||
94 | * @see get_expires() | ||
95 | * @see has_expires() | ||
96 | * @see unset_expires() | ||
97 | */ | ||
98 | void set_expires(const string& e); | ||
99 | |||
100 | /** | ||
101 | * get cookie parameter. | ||
102 | * @param p parameter name. | ||
103 | * @return parameter value. | ||
104 | * @see _set_string() | ||
105 | */ | ||
106 | const string& _get_string(const string& p) const; | ||
107 | |||
108 | /** | ||
109 | * @return cookie name. | ||
110 | * @see set_name() | ||
111 | */ | ||
112 | const string& get_name() const { return name; } | ||
113 | /** | ||
114 | * @return cookie value. | ||
115 | * @see set_value() | ||
116 | */ | ||
117 | const string& get_value() const { return value; } | ||
118 | /** | ||
119 | * @return cookie comment. | ||
120 | * @see set_comment() | ||
121 | * @see has_comment() | ||
122 | * @see unset_comment() | ||
123 | */ | ||
124 | const string& get_comment() const; | ||
125 | /** | ||
126 | * @return cookie domain. | ||
127 | * @see set_domain() | ||
128 | * @see has_domain() | ||
129 | * @see unset_domain() | ||
130 | */ | ||
131 | const string& get_domain() const; | ||
132 | /** | ||
133 | * @return cookie max-age. | ||
134 | * @see set_max_age() | ||
135 | * @see has_max_age() | ||
136 | * @see unset_max_age() | ||
137 | */ | ||
138 | const string& get_max_age() const; | ||
139 | /** | ||
140 | * @return cookie path. | ||
141 | * @see set_path() | ||
142 | * @see has_path() | ||
143 | * @see unset_path() | ||
144 | */ | ||
145 | const string& get_path() const; | ||
146 | /** | ||
147 | * @return cookie security. | ||
148 | * @see is_secure() | ||
149 | * @see set_secure() | ||
150 | */ | ||
151 | bool get_secure() const; | ||
152 | /** | ||
153 | * @return cookie security. | ||
154 | * @see get_secure() | ||
155 | * @see set_secure() | ||
156 | */ | ||
157 | bool is_secure() const { return get_secure(); } | ||
158 | |||
159 | /** | ||
160 | * @return cookie expiration time. | ||
161 | * @see set_expires() | ||
162 | * @see has_expires() | ||
163 | * @see unset_expires() | ||
164 | */ | ||
165 | const string& get_expires() const; | ||
166 | |||
167 | /** | ||
168 | * @return true if cookie has comment. | ||
169 | * @see set_comment() | ||
170 | * @see get_comment() | ||
171 | * @see unset_comment() | ||
172 | */ | ||
173 | bool has_comment() const; | ||
174 | /** | ||
175 | * @return true if cookie has domain. | ||
176 | * @see set_domain() | ||
177 | * @see get_domain() | ||
178 | * @see unset_domain() | ||
179 | */ | ||
180 | bool has_domain() const; | ||
181 | /** | ||
182 | * @return true if cookie has max-age. | ||
183 | * @see set_max_age() | ||
184 | * @see get_max_age() | ||
185 | * @see unset_max_age() | ||
186 | */ | ||
187 | bool has_max_age() const; | ||
188 | /** | ||
189 | * @return true if cookie has path. | ||
190 | * @see set_path() | ||
191 | * @see get_path() | ||
192 | * @see unset_path() | ||
193 | */ | ||
194 | bool has_path() const; | ||
195 | |||
196 | /** | ||
197 | * @return true if cookie has expiration time. | ||
198 | * @see set_expires() | ||
199 | * @see get_expires() | ||
200 | * @see unset_expires() | ||
201 | */ | ||
202 | bool has_expires() const; | ||
203 | |||
204 | /** | ||
205 | * rid cookie of comment. | ||
206 | * @see set_comment() | ||
207 | * @see get_comment() | ||
208 | * @see has_comment() | ||
209 | */ | ||
210 | void unset_comment(); | ||
211 | /** | ||
212 | * rid cookie of domain. | ||
213 | * @see set_domain() | ||
214 | * @see get_domain() | ||
215 | * @see has_domain() | ||
216 | */ | ||
217 | void unset_domain(); | ||
218 | /** | ||
219 | * rid cookie of max-age. | ||
220 | * @see set_max_age() | ||
221 | * @see get_max_age() | ||
222 | * @see has_max_age() | ||
223 | */ | ||
224 | void unset_max_age(); | ||
225 | /** | ||
226 | * rid cookie of path. | ||
227 | * @see set_path() | ||
228 | * @see get_path() | ||
229 | * @see has_path() | ||
230 | */ | ||
231 | void unset_path(); | ||
232 | |||
233 | /** | ||
234 | * rid cookie of expiration time. | ||
235 | * @see set_expires() | ||
236 | * @see get_expires() | ||
237 | * @see has_expires() | ||
238 | */ | ||
239 | void unset_expires(); | ||
240 | |||
241 | /** | ||
242 | * render the 'Set-Cookie' HTTP header according to RFC2109. | ||
243 | * Absolutely useless, only works with lynx. | ||
244 | * @return the rendered header content. | ||
245 | */ | ||
246 | string set_cookie_header_rfc2109() const; | ||
247 | /** | ||
248 | * render the 'Set-Cookie' header according to the early vague | ||
249 | * netscape specs and common practice. | ||
250 | * @return the rendered header content. | ||
251 | */ | ||
252 | string set_cookie_header() const; | ||
253 | }; | ||
254 | |||
255 | /** | ||
256 | * Cookies container class. | ||
257 | */ | ||
258 | class cookies_t : public map<string,cookie> { | ||
259 | public: | ||
260 | |||
261 | cookies_t() { } | ||
262 | /** | ||
263 | * @param s 'Cookie:' HTTP header contents to parse. | ||
264 | */ | ||
265 | cookies_t(const string& s) { parse_cookies(s); } | ||
266 | |||
267 | /** | ||
268 | * @param c cookie to set. | ||
269 | */ | ||
270 | void set_cookie(const cookie& c) { (*this)[c.get_name()]=c; } | ||
271 | /** | ||
272 | * @param n cookie name to remove. | ||
273 | */ | ||
274 | void unset_cookie(const key_type& n) { erase(n); } | ||
275 | /** | ||
276 | * @param n cookie name. | ||
277 | * @return true if exists. | ||
278 | */ | ||
279 | bool has_cookie(const key_type& n) const; | ||
280 | /** | ||
281 | * Return the named cookie if one exists. | ||
282 | * @param n cookie name. | ||
283 | * @return const reference to cookie object. | ||
284 | */ | ||
285 | const cookie& get_cookie(const key_type& n) const; | ||
286 | /** | ||
287 | * Return the named cookie if one exists. | ||
288 | * @param n cookie name. | ||
289 | * @return reference to cookie object. | ||
290 | */ | ||
291 | cookie& get_cookie(const key_type& n); | ||
292 | |||
293 | /** | ||
294 | * @param s HTTP 'Cookie' header content. | ||
295 | */ | ||
296 | void parse_cookies(const string& s); | ||
297 | }; | ||
298 | } | ||
299 | |||
300 | #endif /* __KINGATE_COOKIES_H */ | ||
diff --git a/include/kingate/headers.h b/include/kingate/headers.h new file mode 100644 index 0000000..fb37fec --- a/dev/null +++ b/include/kingate/headers.h | |||
@@ -0,0 +1,94 @@ | |||
1 | #ifndef __KINGATE_HEADERS_H | ||
2 | #define __KINGATE_HEADERS_H | ||
3 | |||
4 | #include <string> | ||
5 | #include <map> | ||
6 | #include <ostream> | ||
7 | |||
8 | /** | ||
9 | * @file | ||
10 | * @brief the headers -- HTTP headers container class. | ||
11 | */ | ||
12 | |||
13 | namespace kingate { | ||
14 | using namespace std; | ||
15 | |||
16 | /** | ||
17 | * The container class for HTTP headers. | ||
18 | */ | ||
19 | class headers : public multimap<string,string> { | ||
20 | public: | ||
21 | |||
22 | /** | ||
23 | * Reference header if one exists. | ||
24 | * @param k the header. | ||
25 | * @return reference to the content. | ||
26 | */ | ||
27 | const mapped_type& operator[](const key_type& k) const { | ||
28 | return get_header(k); | ||
29 | } | ||
30 | /** | ||
31 | * Reference header, creating one if needed. | ||
32 | * @param k the header. | ||
33 | * @return reference to the content. | ||
34 | */ | ||
35 | mapped_type& operator[](const key_type& k) { | ||
36 | return get_header(k); | ||
37 | } | ||
38 | |||
39 | /** | ||
40 | * Set HTTP header. Remove all existent occurences of headers with | ||
41 | * this name. | ||
42 | * @param h header name. | ||
43 | * @param c header content. | ||
44 | */ | ||
45 | void set_header(const key_type& h,const mapped_type& c); | ||
46 | /** | ||
47 | * Add HTTP header. | ||
48 | * @param h header name. | ||
49 | * @param c header content. | ||
50 | */ | ||
51 | void add_header(const key_type& h,const mapped_type& c); | ||
52 | /** | ||
53 | * Remove named header. | ||
54 | * @param h header name. | ||
55 | */ | ||
56 | void unset_header(const key_type& h); | ||
57 | /** | ||
58 | * Return const reference to the existing header. | ||
59 | * @param h header name. | ||
60 | * @return reference to header content. | ||
61 | */ | ||
62 | const mapped_type& get_header(const key_type& h) const; | ||
63 | /** | ||
64 | * Return reference to the header, creating one if needed. | ||
65 | * @param h header name. | ||
66 | * @return reference to the content. | ||
67 | */ | ||
68 | mapped_type& get_header(const key_type& h); | ||
69 | /** | ||
70 | * Return the range of headers with a certain name. | ||
71 | * @param h header name. | ||
72 | * @return pair of const iterators with the beginning and the end | ||
73 | * of range. | ||
74 | */ | ||
75 | pair<const_iterator,const_iterator> get_headers(const key_type& h) const; | ||
76 | /** | ||
77 | * Return the range of headers with a certain name. | ||
78 | * @param h header name. | ||
79 | * @return pair of iterators with the beginning and the end | ||
80 | * of range. | ||
81 | */ | ||
82 | pair<iterator,iterator> get_headers(const key_type& h); | ||
83 | /** | ||
84 | * Inquire whether the named header exists. | ||
85 | * @param h header name. | ||
86 | * @return true if exists. | ||
87 | */ | ||
88 | bool has_header(const key_type& h) const; | ||
89 | |||
90 | }; | ||
91 | |||
92 | } | ||
93 | |||
94 | #endif /* __KINGATE_HEADERS_H */ | ||
diff --git a/include/kingate/util.h b/include/kingate/util.h index 6024ccf..3fd96f6 100644 --- a/include/kingate/util.h +++ b/include/kingate/util.h | |||
@@ -1,49 +1,62 @@ | |||
1 | #ifndef __KINGATE_UTIL_H | 1 | #ifndef __KINGATE_UTIL_H |
2 | #define __KINGATE_UTIL_H | 2 | #define __KINGATE_UTIL_H |
3 | 3 | ||
4 | #include <string> | 4 | #include <string> |
5 | 5 | ||
6 | #ifndef __deprecated | 6 | #ifndef __deprecated |
7 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 | 7 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 |
8 | #define __deprecated __attribute__((deprecated)) | 8 | #define __deprecated __attribute__((deprecated)) |
9 | #else | 9 | #else |
10 | #define __deprecated | 10 | #define __deprecated |
11 | #endif | 11 | #endif |
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | namespace kingate { | 14 | namespace kingate { |
15 | using namespace std; | 15 | using namespace std; |
16 | 16 | ||
17 | /** | 17 | /** |
18 | * Encode string for passing via URL. | 18 | * Encode string for passing via URL. |
19 | * @param str string unencoded. | 19 | * @param str string unencoded. |
20 | * @return the encoded string. | 20 | * @return the encoded string. |
21 | */ | 21 | */ |
22 | string url_encode(const string& str); | 22 | string url_encode(const string& str); |
23 | /** | 23 | /** |
24 | * Remove URL-encoding from the string. | 24 | * Remove URL-encoding from the string. |
25 | * @param str the URL-encoded string. | 25 | * @param str the URL-encoded string. |
26 | * @return the decoded string. | 26 | * @return the decoded string. |
27 | */ | 27 | */ |
28 | string url_decode(const string& str); | 28 | string url_decode(const string& str); |
29 | 29 | ||
30 | /** | 30 | /** |
31 | * Quote string for use in HTTP header. | ||
32 | * @param str the string to quote. | ||
33 | * @return the quoted string. | ||
34 | */ | ||
35 | string http_quoted_string(const string& str); | ||
36 | /** | ||
37 | * Quote string for use in HTTP header if necessary. | ||
38 | * @param str the string to quote. | ||
39 | * @return the quoted string or token left as is. | ||
40 | */ | ||
41 | string http_quote(const string& str); | ||
42 | |||
43 | /** | ||
31 | * deprecated alias to url_encode. | 44 | * deprecated alias to url_encode. |
32 | * @see url_encode | 45 | * @see url_encode |
33 | */ | 46 | */ |
34 | inline string __deprecated url_escape(const string& str) { | 47 | inline string __deprecated url_escape(const string& str) { |
35 | return url_encode(str); | 48 | return url_encode(str); |
36 | } | 49 | } |
37 | /** | 50 | /** |
38 | * deprecated alias to url_decode. | 51 | * deprecated alias to url_decode. |
39 | * @see url_decode | 52 | * @see url_decode |
40 | */ | 53 | */ |
41 | inline string __deprecated url_unescape(const string& str) { | 54 | inline string __deprecated url_unescape(const string& str) { |
42 | return url_decode(str); | 55 | return url_decode(str); |
43 | } | 56 | } |
44 | } | 57 | } |
45 | 58 | ||
46 | #endif /* __KINGATE_UTIL_H */ | 59 | #endif /* __KINGATE_UTIL_H */ |
47 | /* | 60 | /* |
48 | * vim:set ft=cpp: | 61 | * vim:set ft=cpp: |
49 | */ | 62 | */ |