1 /*******************************************************************************
2
3 Copyright:
4 Copyright (c) 2004 Kris Bell.
5 Some parts copyright (c) 2009-2016 dunnhumby Germany GmbH.
6 All rights reserved.
7
8 License:
9 Tango Dual License: 3-Clause BSD License / Academic Free License v3.0.
10 See LICENSE_TANGO.txt for details.
11
12 Version: Initial release: April 2004
13
14 Authors: Kris
15
16 *******************************************************************************/
17
18 module ocean.net.http.HttpConst;
19
20 import ocean.meta.types.Qualifiers;
21
22 /*******************************************************************************
23
24 Constants
25
26 *******************************************************************************/
27
28 struct HttpConst
29 {
30 enum istring Eol = "\r\n";
31 }
32
33 /*******************************************************************************
34
35 Headers are distinct types in their own right. This is because they
36 are somewhat optimized via a trailing ':' character.
37
38 *******************************************************************************/
39
40 struct HttpHeaderName
41 {
42 cstring value;
43 }
44
45 /*******************************************************************************
46
47 Define the traditional set of HTTP header names
48
49 *******************************************************************************/
50
51 struct HttpHeader
52 {
53 // size of both the request & response buffer (per thread)
54 enum int IOBufferSize = 16 * 1024;
55
56 // maximum length for POST parameters (to avoid DOS ...)
57 enum int MaxPostParamSize = 4 * 1024;
58
59 enum HttpHeaderName Version = {"HTTP/1.1"};
60 enum HttpHeaderName TextHtml = {"text/html"};
61
62 enum HttpHeaderName Accept = {"Accept:"};
63 enum HttpHeaderName AcceptCharset = {"Accept-Charset:"};
64 enum HttpHeaderName AcceptEncoding = {"Accept-Encoding:"};
65 enum HttpHeaderName AcceptLanguage = {"Accept-Language:"};
66 enum HttpHeaderName AcceptRanges = {"Accept-Ranges:"};
67 enum HttpHeaderName Age = {"Age:"};
68 enum HttpHeaderName Allow = {"Allow:"};
69 enum HttpHeaderName Authorization = {"Authorization:"};
70 enum HttpHeaderName CacheControl = {"Cache-Control:"};
71 enum HttpHeaderName Connection = {"Connection:"};
72 enum HttpHeaderName ContentEncoding = {"Content-Encoding:"};
73 enum HttpHeaderName ContentLanguage = {"Content-Language:"};
74 enum HttpHeaderName ContentLength = {"Content-Length:"};
75 enum HttpHeaderName ContentLocation = {"Content-Location:"};
76 enum HttpHeaderName ContentRange = {"Content-Range:"};
77 enum HttpHeaderName ContentType = {"Content-Type:"};
78 enum HttpHeaderName Cookie = {"Cookie:"};
79 enum HttpHeaderName Date = {"Date:"};
80 enum HttpHeaderName ETag = {"ETag:"};
81 enum HttpHeaderName Expect = {"Expect:"};
82 enum HttpHeaderName Expires = {"Expires:"};
83 enum HttpHeaderName From = {"From:"};
84 enum HttpHeaderName Host = {"Host:"};
85 enum HttpHeaderName Identity = {"Identity:"};
86 enum HttpHeaderName IfMatch = {"If-Match:"};
87 enum HttpHeaderName IfModifiedSince = {"If-Modified-Since:"};
88 enum HttpHeaderName IfNoneMatch = {"If-None-Match:"};
89 enum HttpHeaderName IfRange = {"If-Range:"};
90 enum HttpHeaderName IfUnmodifiedSince = {"If-Unmodified-Since:"};
91 enum HttpHeaderName KeepAlive = {"Keep-Alive:"};
92 enum HttpHeaderName LastModified = {"Last-Modified:"};
93 enum HttpHeaderName Location = {"Location:"};
94 enum HttpHeaderName MaxForwards = {"Max-Forwards:"};
95 enum HttpHeaderName MimeVersion = {"MIME-Version:"};
96 enum HttpHeaderName Pragma = {"Pragma:"};
97 enum HttpHeaderName ProxyAuthenticate = {"Proxy-Authenticate:"};
98 enum HttpHeaderName ProxyConnection = {"Proxy-Connection:"};
99 enum HttpHeaderName Range = {"Range:"};
100 enum HttpHeaderName Referrer = {"Referer:"};
101 enum HttpHeaderName RetryAfter = {"Retry-After:"};
102 enum HttpHeaderName Server = {"Server:"};
103 enum HttpHeaderName ServletEngine = {"Servlet-Engine:"};
104 enum HttpHeaderName SetCookie = {"Set-Cookie:"};
105 enum HttpHeaderName SetCookie2 = {"Set-Cookie2:"};
106 enum HttpHeaderName TE = {"TE:"};
107 enum HttpHeaderName Trailer = {"Trailer:"};
108 enum HttpHeaderName TransferEncoding = {"Transfer-Encoding:"};
109 enum HttpHeaderName Upgrade = {"Upgrade:"};
110 enum HttpHeaderName UserAgent = {"User-Agent:"};
111 enum HttpHeaderName Vary = {"Vary:"};
112 enum HttpHeaderName Warning = {"Warning:"};
113 enum HttpHeaderName WwwAuthenticate = {"WWW-Authenticate:"};
114 }
115
116
117 /*******************************************************************************
118
119 Declare the traditional set of HTTP response codes
120
121 *******************************************************************************/
122
123 enum HttpResponseCode
124 {
125 OK = 200,
126
127 Continue = 100,
128 SwitchingProtocols = 101,
129 Created = 201,
130 Accepted = 202,
131 NonAuthoritativeInformation = 203,
132 NoContent = 204,
133 ResetContent = 205,
134 PartialContent = 206,
135 MultipleChoices = 300,
136 MovedPermanently = 301,
137 Found = 302,
138 SeeOther = 303,
139 NotModified = 304,
140 UseProxy = 305,
141 TemporaryRedirect = 307,
142 BadRequest = 400,
143 Unauthorized = 401,
144 PaymentRequired = 402,
145 Forbidden = 403,
146 NotFound = 404,
147 MethodNotAllowed = 405,
148 NotAcceptable = 406,
149 ProxyAuthenticationRequired = 407,
150 RequestTimeout = 408,
151 Conflict = 409,
152 Gone = 410,
153 LengthRequired = 411,
154 PreconditionFailed = 412,
155 RequestEntityTooLarge = 413,
156 RequestURITooLarge = 414,
157 UnsupportedMediaType = 415,
158 RequestedRangeNotSatisfiable = 416,
159 ExpectationFailed = 417,
160 InternalServerError = 500,
161 NotImplemented = 501,
162 BadGateway = 502,
163 ServiceUnavailable = 503,
164 GatewayTimeout = 504,
165 VersionNotSupported = 505
166 }
167
168 static assert(HttpResponseCode.init == HttpResponseCode.OK);
169
170 /*******************************************************************************
171
172 Status is a compound type, with a name and a code.
173
174 *******************************************************************************/
175
176 struct HttpStatus
177 {
178 int code;
179 char[] name;
180 }
181
182 /*******************************************************************************
183
184 Declare the traditional set of HTTP responses
185
186 *******************************************************************************/
187
188 struct HttpResponses
189 {
190 static const(HttpStatus) Continue = {HttpResponseCode.Continue, "Continue"};
191 static const(HttpStatus) SwitchingProtocols = {HttpResponseCode.SwitchingProtocols, "SwitchingProtocols"};
192 static const(HttpStatus) OK = {HttpResponseCode.OK, "OK"};
193 static const(HttpStatus) Created = {HttpResponseCode.Created, "Created"};
194 static const(HttpStatus) Accepted = {HttpResponseCode.Accepted, "Accepted"};
195 static const(HttpStatus) NonAuthoritativeInformation = {HttpResponseCode.NonAuthoritativeInformation, "NonAuthoritativeInformation"};
196 static const(HttpStatus) NoContent = {HttpResponseCode.NoContent, "NoContent"};
197 static const(HttpStatus) ResetContent = {HttpResponseCode.ResetContent, "ResetContent"};
198 static const(HttpStatus) PartialContent = {HttpResponseCode.PartialContent, "PartialContent"};
199 static const(HttpStatus) MultipleChoices = {HttpResponseCode.MultipleChoices, "MultipleChoices"};
200 static const(HttpStatus) MovedPermanently = {HttpResponseCode.MovedPermanently, "MovedPermanently"};
201 static const(HttpStatus) Found = {HttpResponseCode.Found, "Found"};
202 static const(HttpStatus) TemporaryRedirect = {HttpResponseCode.TemporaryRedirect, "TemporaryRedirect"};
203 static const(HttpStatus) SeeOther = {HttpResponseCode.SeeOther, "SeeOther"};
204 static const(HttpStatus) NotModified = {HttpResponseCode.NotModified, "NotModified"};
205 static const(HttpStatus) UseProxy = {HttpResponseCode.UseProxy, "UseProxy"};
206 static const(HttpStatus) BadRequest = {HttpResponseCode.BadRequest, "BadRequest"};
207 static const(HttpStatus) Unauthorized = {HttpResponseCode.Unauthorized, "Unauthorized"};
208 static const(HttpStatus) PaymentRequired = {HttpResponseCode.PaymentRequired, "PaymentRequired"};
209 static const(HttpStatus) Forbidden = {HttpResponseCode.Forbidden, "Forbidden"};
210 static const(HttpStatus) NotFound = {HttpResponseCode.NotFound, "NotFound"};
211 static const(HttpStatus) MethodNotAllowed = {HttpResponseCode.MethodNotAllowed, "MethodNotAllowed"};
212 static const(HttpStatus) NotAcceptable = {HttpResponseCode.NotAcceptable, "NotAcceptable"};
213 static const(HttpStatus) ProxyAuthenticationRequired = {HttpResponseCode.ProxyAuthenticationRequired, "ProxyAuthenticationRequired"};
214 static const(HttpStatus) RequestTimeout = {HttpResponseCode.RequestTimeout, "RequestTimeout"};
215 static const(HttpStatus) Conflict = {HttpResponseCode.Conflict, "Conflict"};
216 static const(HttpStatus) Gone = {HttpResponseCode.Gone, "Gone"};
217 static const(HttpStatus) LengthRequired = {HttpResponseCode.LengthRequired, "LengthRequired"};
218 static const(HttpStatus) PreconditionFailed = {HttpResponseCode.PreconditionFailed, "PreconditionFailed"};
219 static const(HttpStatus) RequestEntityTooLarge = {HttpResponseCode.RequestEntityTooLarge, "RequestEntityTooLarge"};
220 static const(HttpStatus) RequestURITooLarge = {HttpResponseCode.RequestURITooLarge, "RequestURITooLarge"};
221 static const(HttpStatus) UnsupportedMediaType = {HttpResponseCode.UnsupportedMediaType, "UnsupportedMediaType"};
222 static const(HttpStatus) RequestedRangeNotSatisfiable = {HttpResponseCode.RequestedRangeNotSatisfiable, "RequestedRangeNotSatisfiable"};
223 static const(HttpStatus) ExpectationFailed = {HttpResponseCode.ExpectationFailed, "ExpectationFailed"};
224 static const(HttpStatus) InternalServerError = {HttpResponseCode.InternalServerError, "InternalServerError"};
225 static const(HttpStatus) NotImplemented = {HttpResponseCode.NotImplemented, "NotImplemented"};
226 static const(HttpStatus) BadGateway = {HttpResponseCode.BadGateway, "BadGateway"};
227 static const(HttpStatus) ServiceUnavailable = {HttpResponseCode.ServiceUnavailable, "ServiceUnavailable"};
228 static const(HttpStatus) GatewayTimeout = {HttpResponseCode.GatewayTimeout, "GatewayTimeout"};
229 static const(HttpStatus) VersionNotSupported = {HttpResponseCode.VersionNotSupported, "VersionNotSupported"};
230 }