1 fe3fcc3a 2026-06-03 kirill /* $OpenBSD: http.h,v 1.14 2026/06/03 20:00:34 kirill Exp $ */
4 7088e981 2016-07-29 reyk * Copyright (c) 2012 - 2015 Reyk Floeter <reyk@openbsd.org>
6 69fde657 2014-07-09 reyk * Permission to use, copy, modify, and distribute this software for any
7 69fde657 2014-07-09 reyk * purpose with or without fee is hereby granted, provided that the above
8 69fde657 2014-07-09 reyk * copyright notice and this permission notice appear in all copies.
10 69fde657 2014-07-09 reyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 69fde657 2014-07-09 reyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 69fde657 2014-07-09 reyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 69fde657 2014-07-09 reyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 69fde657 2014-07-09 reyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 69fde657 2014-07-09 reyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 69fde657 2014-07-09 reyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 d6302b55 2015-06-11 reyk #ifndef HTTP_H
20 d6302b55 2015-06-11 reyk #define HTTP_H
22 94c8a65e 2021-03-24 benno #include <sys/queue.h>
24 f8da6c59 2014-08-14 reyk #define HTTP_PORT 80
25 f8da6c59 2014-08-14 reyk #define HTTPS_PORT 443
27 69fde657 2014-07-09 reyk enum httpmethod {
28 69fde657 2014-07-09 reyk HTTP_METHOD_NONE = 0,
30 f8da6c59 2014-08-14 reyk /* HTTP/1.1, RFC 7231 */
31 69fde657 2014-07-09 reyk HTTP_METHOD_GET,
32 69fde657 2014-07-09 reyk HTTP_METHOD_HEAD,
33 69fde657 2014-07-09 reyk HTTP_METHOD_POST,
34 69fde657 2014-07-09 reyk HTTP_METHOD_PUT,
35 69fde657 2014-07-09 reyk HTTP_METHOD_DELETE,
36 69fde657 2014-07-09 reyk HTTP_METHOD_OPTIONS,
37 69fde657 2014-07-09 reyk HTTP_METHOD_TRACE,
38 69fde657 2014-07-09 reyk HTTP_METHOD_CONNECT,
40 69fde657 2014-07-09 reyk /* WebDAV, RFC 4918 */
41 69fde657 2014-07-09 reyk HTTP_METHOD_PROPFIND,
42 69fde657 2014-07-09 reyk HTTP_METHOD_PROPPATCH,
43 69fde657 2014-07-09 reyk HTTP_METHOD_MKCOL,
44 69fde657 2014-07-09 reyk HTTP_METHOD_COPY,
45 69fde657 2014-07-09 reyk HTTP_METHOD_MOVE,
46 69fde657 2014-07-09 reyk HTTP_METHOD_LOCK,
47 69fde657 2014-07-09 reyk HTTP_METHOD_UNLOCK,
49 7088e981 2016-07-29 reyk /* WebDAV Versioning Extension, RFC 3253 */
50 7088e981 2016-07-29 reyk HTTP_METHOD_VERSION_CONTROL,
51 7088e981 2016-07-29 reyk HTTP_METHOD_REPORT,
52 7088e981 2016-07-29 reyk HTTP_METHOD_CHECKOUT,
53 7088e981 2016-07-29 reyk HTTP_METHOD_CHECKIN,
54 7088e981 2016-07-29 reyk HTTP_METHOD_UNCHECKOUT,
55 7088e981 2016-07-29 reyk HTTP_METHOD_MKWORKSPACE,
56 7088e981 2016-07-29 reyk HTTP_METHOD_UPDATE,
57 7088e981 2016-07-29 reyk HTTP_METHOD_LABEL,
58 7088e981 2016-07-29 reyk HTTP_METHOD_MERGE,
59 7088e981 2016-07-29 reyk HTTP_METHOD_BASELINE_CONTROL,
60 7088e981 2016-07-29 reyk HTTP_METHOD_MKACTIVITY,
62 7088e981 2016-07-29 reyk /* WebDAV Ordered Collections, RFC 3648 */
63 7088e981 2016-07-29 reyk HTTP_METHOD_ORDERPATCH,
65 7088e981 2016-07-29 reyk /* WebDAV Access Control, RFC 3744 */
66 7088e981 2016-07-29 reyk HTTP_METHOD_ACL,
68 7088e981 2016-07-29 reyk /* WebDAV Redirect Reference Resources, RFC 4437 */
69 7088e981 2016-07-29 reyk HTTP_METHOD_MKREDIRECTREF,
70 7088e981 2016-07-29 reyk HTTP_METHOD_UPDATEREDIRECTREF,
72 7088e981 2016-07-29 reyk /* WebDAV Search, RFC 5323 */
73 7088e981 2016-07-29 reyk HTTP_METHOD_SEARCH,
75 ee259709 2026-05-19 rsadowski /* WebDAV Calendaring Extensions, RFC 4791 */
76 ee259709 2026-05-19 rsadowski HTTP_METHOD_MKCALENDAR,
78 69fde657 2014-07-09 reyk /* PATCH, RFC 5789 */
79 69fde657 2014-07-09 reyk HTTP_METHOD_PATCH,
81 69fde657 2014-07-09 reyk /* Server response (internal value) */
82 69fde657 2014-07-09 reyk HTTP_METHOD_RESPONSE
85 69fde657 2014-07-09 reyk struct http_method {
86 69fde657 2014-07-09 reyk enum httpmethod method_id;
87 69fde657 2014-07-09 reyk const char *method_name;
89 69fde657 2014-07-09 reyk #define HTTP_METHODS { \
90 69fde657 2014-07-09 reyk { HTTP_METHOD_GET, "GET" }, \
91 69fde657 2014-07-09 reyk { HTTP_METHOD_HEAD, "HEAD" }, \
92 69fde657 2014-07-09 reyk { HTTP_METHOD_POST, "POST" }, \
93 69fde657 2014-07-09 reyk { HTTP_METHOD_PUT, "PUT" }, \
94 69fde657 2014-07-09 reyk { HTTP_METHOD_DELETE, "DELETE" }, \
95 69fde657 2014-07-09 reyk { HTTP_METHOD_OPTIONS, "OPTIONS" }, \
96 69fde657 2014-07-09 reyk { HTTP_METHOD_TRACE, "TRACE" }, \
97 69fde657 2014-07-09 reyk { HTTP_METHOD_CONNECT, "CONNECT" }, \
98 69fde657 2014-07-09 reyk { HTTP_METHOD_PROPFIND, "PROPFIND" }, \
99 69fde657 2014-07-09 reyk { HTTP_METHOD_PROPPATCH, "PROPPATCH" }, \
100 69fde657 2014-07-09 reyk { HTTP_METHOD_MKCOL, "MKCOL" }, \
101 69fde657 2014-07-09 reyk { HTTP_METHOD_COPY, "COPY" }, \
102 69fde657 2014-07-09 reyk { HTTP_METHOD_MOVE, "MOVE" }, \
103 69fde657 2014-07-09 reyk { HTTP_METHOD_LOCK, "LOCK" }, \
104 69fde657 2014-07-09 reyk { HTTP_METHOD_UNLOCK, "UNLOCK" }, \
105 7088e981 2016-07-29 reyk { HTTP_METHOD_VERSION_CONTROL, "VERSION-CONTROL" }, \
106 7088e981 2016-07-29 reyk { HTTP_METHOD_REPORT, "REPORT" }, \
107 7088e981 2016-07-29 reyk { HTTP_METHOD_CHECKOUT, "CHECKOUT" }, \
108 7088e981 2016-07-29 reyk { HTTP_METHOD_CHECKIN, "CHECKIN" }, \
109 7088e981 2016-07-29 reyk { HTTP_METHOD_UNCHECKOUT, "UNCHECKOUT" }, \
110 7088e981 2016-07-29 reyk { HTTP_METHOD_MKWORKSPACE, "MKWORKSPACE" }, \
111 7088e981 2016-07-29 reyk { HTTP_METHOD_UPDATE, "UPDATE" }, \
112 7088e981 2016-07-29 reyk { HTTP_METHOD_LABEL, "LABEL" }, \
113 7088e981 2016-07-29 reyk { HTTP_METHOD_MERGE, "MERGE" }, \
114 7088e981 2016-07-29 reyk { HTTP_METHOD_BASELINE_CONTROL, "BASELINE-CONTROL" }, \
115 7088e981 2016-07-29 reyk { HTTP_METHOD_MKACTIVITY, "MKACTIVITY" }, \
116 7088e981 2016-07-29 reyk { HTTP_METHOD_ORDERPATCH, "ORDERPATCH" }, \
117 7088e981 2016-07-29 reyk { HTTP_METHOD_ACL, "ACL" }, \
118 7088e981 2016-07-29 reyk { HTTP_METHOD_MKREDIRECTREF, "MKREDIRECTREF" }, \
119 7088e981 2016-07-29 reyk { HTTP_METHOD_UPDATEREDIRECTREF, "UPDATEREDIRECTREF" }, \
120 7088e981 2016-07-29 reyk { HTTP_METHOD_SEARCH, "SEARCH" }, \
121 ee259709 2026-05-19 rsadowski { HTTP_METHOD_MKCALENDAR, "MKCALENDAR" }, \
122 69fde657 2014-07-09 reyk { HTTP_METHOD_PATCH, "PATCH" }, \
123 69fde657 2014-07-09 reyk { HTTP_METHOD_NONE, NULL } \
126 fa847717 2014-07-12 reyk struct http_error {
127 fa847717 2014-07-12 reyk int error_code;
128 fa847717 2014-07-12 reyk const char *error_name;
132 f8da6c59 2014-08-14 reyk * HTTP status codes based on IANA assignments (2014-06-11 version):
133 f8da6c59 2014-08-14 reyk * https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
134 f8da6c59 2014-08-14 reyk * plus legacy (306) and non-standard (420).
136 fa847717 2014-07-12 reyk #define HTTP_ERRORS { \
137 fa847717 2014-07-12 reyk { 100, "Continue" }, \
138 fa847717 2014-07-12 reyk { 101, "Switching Protocols" }, \
139 f8da6c59 2014-08-14 reyk { 102, "Processing" }, \
140 f8da6c59 2014-08-14 reyk /* 103-199 unassigned */ \
141 fa847717 2014-07-12 reyk { 200, "OK" }, \
142 fa847717 2014-07-12 reyk { 201, "Created" }, \
143 fa847717 2014-07-12 reyk { 202, "Accepted" }, \
144 f8da6c59 2014-08-14 reyk { 203, "Non-Authoritative Information" }, \
145 fa847717 2014-07-12 reyk { 204, "No Content" }, \
146 fa847717 2014-07-12 reyk { 205, "Reset Content" }, \
147 fa847717 2014-07-12 reyk { 206, "Partial Content" }, \
148 f8da6c59 2014-08-14 reyk { 207, "Multi-Status" }, \
149 f8da6c59 2014-08-14 reyk { 208, "Already Reported" }, \
150 f8da6c59 2014-08-14 reyk /* 209-225 unassigned */ \
151 f8da6c59 2014-08-14 reyk { 226, "IM Used" }, \
152 f8da6c59 2014-08-14 reyk /* 227-299 unassigned */ \
153 fa847717 2014-07-12 reyk { 300, "Multiple Choices" }, \
154 fa847717 2014-07-12 reyk { 301, "Moved Permanently" }, \
155 f8da6c59 2014-08-14 reyk { 302, "Found" }, \
156 fa847717 2014-07-12 reyk { 303, "See Other" }, \
157 fa847717 2014-07-12 reyk { 304, "Not Modified" }, \
158 f8da6c59 2014-08-14 reyk { 305, "Use Proxy" }, \
159 f8da6c59 2014-08-14 reyk { 306, "Switch Proxy" }, \
160 fa847717 2014-07-12 reyk { 307, "Temporary Redirect" }, \
161 f8da6c59 2014-08-14 reyk { 308, "Permanent Redirect" }, \
162 f8da6c59 2014-08-14 reyk /* 309-399 unassigned */ \
163 fa847717 2014-07-12 reyk { 400, "Bad Request" }, \
164 fa847717 2014-07-12 reyk { 401, "Unauthorized" }, \
165 fa847717 2014-07-12 reyk { 402, "Payment Required" }, \
166 fa847717 2014-07-12 reyk { 403, "Forbidden" }, \
167 fa847717 2014-07-12 reyk { 404, "Not Found" }, \
168 fa847717 2014-07-12 reyk { 405, "Method Not Allowed" }, \
169 fa847717 2014-07-12 reyk { 406, "Not Acceptable" }, \
170 fa847717 2014-07-12 reyk { 407, "Proxy Authentication Required" }, \
171 fa847717 2014-07-12 reyk { 408, "Request Timeout" }, \
172 fa847717 2014-07-12 reyk { 409, "Conflict" }, \
173 fa847717 2014-07-12 reyk { 410, "Gone" }, \
174 fa847717 2014-07-12 reyk { 411, "Length Required" }, \
175 fa847717 2014-07-12 reyk { 412, "Precondition Failed" }, \
176 f8da6c59 2014-08-14 reyk { 413, "Payload Too Large" }, \
177 f8da6c59 2014-08-14 reyk { 414, "URI Too Long" }, \
178 fa847717 2014-07-12 reyk { 415, "Unsupported Media Type" }, \
179 f8da6c59 2014-08-14 reyk { 416, "Range Not Satisfiable" }, \
180 fa847717 2014-07-12 reyk { 417, "Expectation Failed" }, \
181 7088e981 2016-07-29 reyk { 418, "I'm a teapot" }, \
182 7088e981 2016-07-29 reyk /* 419-421 unassigned */ \
183 f8da6c59 2014-08-14 reyk { 420, "Enhance Your Calm" }, \
184 f8da6c59 2014-08-14 reyk { 422, "Unprocessable Entity" }, \
185 f8da6c59 2014-08-14 reyk { 423, "Locked" }, \
186 f8da6c59 2014-08-14 reyk { 424, "Failed Dependency" }, \
187 f8da6c59 2014-08-14 reyk /* 425 unassigned */ \
188 f8da6c59 2014-08-14 reyk { 426, "Upgrade Required" }, \
189 f8da6c59 2014-08-14 reyk /* 427 unassigned */ \
190 f8da6c59 2014-08-14 reyk { 428, "Precondition Required" }, \
191 f8da6c59 2014-08-14 reyk { 429, "Too Many Requests" }, \
192 f8da6c59 2014-08-14 reyk /* 430 unassigned */ \
193 f8da6c59 2014-08-14 reyk { 431, "Request Header Fields Too Large" }, \
194 7088e981 2016-07-29 reyk /* 432-450 unassigned */ \
195 7088e981 2016-07-29 reyk { 451, "Unavailable For Legal Reasons" }, \
196 7088e981 2016-07-29 reyk /* 452-499 unassigned */ \
197 fa847717 2014-07-12 reyk { 500, "Internal Server Error" }, \
198 fa847717 2014-07-12 reyk { 501, "Not Implemented" }, \
199 fa847717 2014-07-12 reyk { 502, "Bad Gateway" }, \
200 fa847717 2014-07-12 reyk { 503, "Service Unavailable" }, \
201 fa847717 2014-07-12 reyk { 504, "Gateway Timeout" }, \
202 fa847717 2014-07-12 reyk { 505, "HTTP Version Not Supported" }, \
203 f8da6c59 2014-08-14 reyk { 506, "Variant Also Negotiates" }, \
204 f8da6c59 2014-08-14 reyk { 507, "Insufficient Storage" }, \
205 f8da6c59 2014-08-14 reyk { 508, "Loop Detected" }, \
206 f8da6c59 2014-08-14 reyk /* 509 unassigned */ \
207 f8da6c59 2014-08-14 reyk { 510, "Not Extended" }, \
208 f8da6c59 2014-08-14 reyk { 511, "Network Authentication Required" }, \
209 f8da6c59 2014-08-14 reyk /* 512-599 unassigned */ \
210 fa847717 2014-07-12 reyk { 0, NULL } \
213 d082a818 2014-07-13 reyk struct http_mediatype {
214 d082a818 2014-07-13 reyk char *media_name;
215 d082a818 2014-07-13 reyk char *media_type;
216 d082a818 2014-07-13 reyk char *media_subtype;
219 f8da6c59 2014-08-14 reyk * Some default media types based on (2014-08-04 version):
220 f8da6c59 2014-08-14 reyk * https://www.iana.org/assignments/media-types/media-types.xhtml
222 d082a818 2014-07-13 reyk #define MEDIA_TYPES { \
223 d082a818 2014-07-13 reyk { "css", "text", "css" }, \
224 d082a818 2014-07-13 reyk { "html", "text", "html" }, \
225 d082a818 2014-07-13 reyk { "txt", "text", "plain" }, \
226 d082a818 2014-07-13 reyk { "gif", "image", "gif" }, \
227 d082a818 2014-07-13 reyk { "jpeg", "image", "jpeg" }, \
228 d082a818 2014-07-13 reyk { "jpg", "image", "jpeg" }, \
229 d082a818 2014-07-13 reyk { "png", "image", "png" }, \
230 7088e981 2016-07-29 reyk { "svg", "image", "svg+xml" }, \
231 d082a818 2014-07-13 reyk { "js", "application", "javascript" }, \
235 69fde657 2014-07-09 reyk /* Used during runtime */
236 69fde657 2014-07-09 reyk struct http_descriptor {
237 69fde657 2014-07-09 reyk struct kv http_pathquery;
238 69fde657 2014-07-09 reyk struct kv http_matchquery;
239 69fde657 2014-07-09 reyk #define http_path http_pathquery.kv_key
240 69fde657 2014-07-09 reyk #define http_query http_pathquery.kv_value
241 69fde657 2014-07-09 reyk #define http_rescode http_pathquery.kv_key
242 69fde657 2014-07-09 reyk #define http_resmesg http_pathquery.kv_value
243 69fde657 2014-07-09 reyk #define query_key http_matchquery.kv_key
244 69fde657 2014-07-09 reyk #define query_val http_matchquery.kv_value
246 7088e981 2016-07-29 reyk char *http_host;
247 69fde657 2014-07-09 reyk enum httpmethod http_method;
248 69fde657 2014-07-09 reyk int http_chunked;
249 fe3fcc3a 2026-06-03 kirill struct kv *http_cl;
250 f8da6c59 2014-08-14 reyk char *http_version;
251 35266489 2016-08-01 benno unsigned int http_status;
253 7088e981 2016-07-29 reyk /* Rewritten path remains NULL if not used */
254 7088e981 2016-07-29 reyk char *http_path_alias;
256 2d9632ee 2014-07-11 reyk /* A tree of headers and attached lists for repeated headers. */
257 2d9632ee 2014-07-11 reyk struct kv *http_lastheader;
258 f8da6c59 2014-08-14 reyk struct kvtree http_headers;
261 94c8a65e 2021-03-24 benno struct http_method_node {
262 94c8a65e 2021-03-24 benno enum httpmethod hmn_method;
263 94c8a65e 2021-03-24 benno SIMPLEQ_ENTRY(http_method_node) hmn_entry;
266 94c8a65e 2021-03-24 benno struct http_session {
267 94c8a65e 2021-03-24 benno SIMPLEQ_HEAD(, http_method_node) hs_methods;
270 d6302b55 2015-06-11 reyk #endif /* HTTP_H */