@@ -1,7 +1,7 @@
1{-# LANGUAGE DeriveDataTypeable #-}
1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE RecordWildCards #-}
3{-# LANGUAGE RecordWildCards #-}
4−module Servant.Server.Internal.ServantErr where
4+module Servant.Server.Internal.ServerError where
6import Control.Exception
6import Control.Exception
7 (Exception)
7 (Exception)
@@ -13,16 +13,18 @@ import qualified Network.HTTP.Types as HTTP
13import Network.Wai
13import Network.Wai
14 (Response, responseLBS)
14 (Response, responseLBS)
16+data ServerError = ServerError
16−data ServantErr = ServantErr { errHTTPCode :: Int
17+ { errHTTPCode :: Int
17− , errReasonPhrase :: String
18+ , errReasonPhrase :: String
18− , errBody :: LBS.ByteString
19+ , errBody :: LBS.ByteString
19− , errHeaders :: [HTTP.Header]
20+ , errHeaders :: [HTTP.Header]
20− } deriving (Show, Eq, Read, Typeable)
22+ deriving (Show, Eq, Read, Typeable)
22−instance Exception ServantErr
24+instance Exception ServerError
24−responseServantErr :: ServantErr -> Response
26+responseServerError :: ServerError -> Response
25−responseServantErr ServantErr{..} = responseLBS status errHeaders errBody
27+responseServerError ServerError{..} = responseLBS status errHeaders errBody
27 status = HTTP.mkStatus errHTTPCode (BS.pack errReasonPhrase)
29 status = HTTP.mkStatus errHTTPCode (BS.pack errReasonPhrase)
@@ -33,8 +35,8 @@ responseServantErr ServantErr{..} = responseLBS status errHeaders errBody
33-- > failingHandler :: Handler ()
35-- > failingHandler :: Handler ()
34-- > failingHandler = throwError $ err300 { errBody = "I can't choose." }
36-- > failingHandler = throwError $ err300 { errBody = "I can't choose." }
36−err300 :: ServantErr
38+err300 :: ServerError
37−err300 = ServantErr { errHTTPCode = 300
39+err300 = ServerError { errHTTPCode = 300
38 , errReasonPhrase = "Multiple Choices"
40 , errReasonPhrase = "Multiple Choices"
39 , errBody = ""
41 , errBody = ""
40 , errHeaders = []
42 , errHeaders = []
@@ -47,8 +49,8 @@ err300 = ServantErr { errHTTPCode = 300
47-- > failingHandler :: Handler ()
49-- > failingHandler :: Handler ()
48-- > failingHandler = throwError err301
50-- > failingHandler = throwError err301
50−err301 :: ServantErr
52+err301 :: ServerError
51−err301 = ServantErr { errHTTPCode = 301
53+err301 = ServerError { errHTTPCode = 301
52 , errReasonPhrase = "Moved Permanently"
54 , errReasonPhrase = "Moved Permanently"
53 , errBody = ""
55 , errBody = ""
54 , errHeaders = []
56 , errHeaders = []
@@ -61,8 +63,8 @@ err301 = ServantErr { errHTTPCode = 301
61-- > failingHandler :: Handler ()
63-- > failingHandler :: Handler ()
62-- > failingHandler = throwError err302
64-- > failingHandler = throwError err302
64−err302 :: ServantErr
66+err302 :: ServerError
65−err302 = ServantErr { errHTTPCode = 302
67+err302 = ServerError { errHTTPCode = 302
66 , errReasonPhrase = "Found"
68 , errReasonPhrase = "Found"
67 , errBody = ""
69 , errBody = ""
68 , errHeaders = []
70 , errHeaders = []
@@ -75,8 +77,8 @@ err302 = ServantErr { errHTTPCode = 302
75-- > failingHandler :: Handler ()
77-- > failingHandler :: Handler ()
76-- > failingHandler = throwError err303
78-- > failingHandler = throwError err303
78−err303 :: ServantErr
80+err303 :: ServerError
79−err303 = ServantErr { errHTTPCode = 303
81+err303 = ServerError { errHTTPCode = 303
80 , errReasonPhrase = "See Other"
82 , errReasonPhrase = "See Other"
81 , errBody = ""
83 , errBody = ""
82 , errHeaders = []
84 , errHeaders = []
@@ -89,8 +91,8 @@ err303 = ServantErr { errHTTPCode = 303
89-- > failingHandler :: Handler ()
91-- > failingHandler :: Handler ()
90-- > failingHandler = throwError err304
92-- > failingHandler = throwError err304
92−err304 :: ServantErr
94+err304 :: ServerError
93−err304 = ServantErr { errHTTPCode = 304
95+err304 = ServerError { errHTTPCode = 304
94 , errReasonPhrase = "Not Modified"
96 , errReasonPhrase = "Not Modified"
95 , errBody = ""
97 , errBody = ""
96 , errHeaders = []
98 , errHeaders = []
@@ -103,8 +105,8 @@ err304 = ServantErr { errHTTPCode = 304
103-- > failingHandler :: Handler ()
105-- > failingHandler :: Handler ()
104-- > failingHandler = throwError err305
106-- > failingHandler = throwError err305
106−err305 :: ServantErr
108+err305 :: ServerError
107−err305 = ServantErr { errHTTPCode = 305
109+err305 = ServerError { errHTTPCode = 305
108 , errReasonPhrase = "Use Proxy"
110 , errReasonPhrase = "Use Proxy"
109 , errBody = ""
111 , errBody = ""
110 , errHeaders = []
112 , errHeaders = []
@@ -117,8 +119,8 @@ err305 = ServantErr { errHTTPCode = 305
117-- > failingHandler :: Handler ()
119-- > failingHandler :: Handler ()
118-- > failingHandler = throwError err307
120-- > failingHandler = throwError err307
120−err307 :: ServantErr
122+err307 :: ServerError
121−err307 = ServantErr { errHTTPCode = 307
123+err307 = ServerError { errHTTPCode = 307
122 , errReasonPhrase = "Temporary Redirect"
124 , errReasonPhrase = "Temporary Redirect"
123 , errBody = ""
125 , errBody = ""
124 , errHeaders = []
126 , errHeaders = []
@@ -131,8 +133,8 @@ err307 = ServantErr { errHTTPCode = 307
131-- > failingHandler :: Handler ()
133-- > failingHandler :: Handler ()
132-- > failingHandler = throwError $ err400 { errBody = "Your request makes no sense to me." }
134-- > failingHandler = throwError $ err400 { errBody = "Your request makes no sense to me." }
134−err400 :: ServantErr
136+err400 :: ServerError
135−err400 = ServantErr { errHTTPCode = 400
137+err400 = ServerError { errHTTPCode = 400
136 , errReasonPhrase = "Bad Request"
138 , errReasonPhrase = "Bad Request"
137 , errBody = ""
139 , errBody = ""
138 , errHeaders = []
140 , errHeaders = []
@@ -145,8 +147,8 @@ err400 = ServantErr { errHTTPCode = 400
145-- > failingHandler :: Handler ()
147-- > failingHandler :: Handler ()
146-- > failingHandler = throwError $ err401 { errBody = "Your credentials are invalid." }
148-- > failingHandler = throwError $ err401 { errBody = "Your credentials are invalid." }
148−err401 :: ServantErr
150+err401 :: ServerError
149−err401 = ServantErr { errHTTPCode = 401
151+err401 = ServerError { errHTTPCode = 401
150 , errReasonPhrase = "Unauthorized"
152 , errReasonPhrase = "Unauthorized"
151 , errBody = ""
153 , errBody = ""
152 , errHeaders = []
154 , errHeaders = []
@@ -159,8 +161,8 @@ err401 = ServantErr { errHTTPCode = 401
159-- > failingHandler :: Handler ()
161-- > failingHandler :: Handler ()
160-- > failingHandler = throwError $ err402 { errBody = "You have 0 credits. Please give me $$$." }
162-- > failingHandler = throwError $ err402 { errBody = "You have 0 credits. Please give me $$$." }
162−err402 :: ServantErr
164+err402 :: ServerError
163−err402 = ServantErr { errHTTPCode = 402
165+err402 = ServerError { errHTTPCode = 402
164 , errReasonPhrase = "Payment Required"
166 , errReasonPhrase = "Payment Required"
165 , errBody = ""
167 , errBody = ""
166 , errHeaders = []
168 , errHeaders = []
@@ -173,8 +175,8 @@ err402 = ServantErr { errHTTPCode = 402
173-- > failingHandler :: Handler ()
175-- > failingHandler :: Handler ()
174-- > failingHandler = throwError $ err403 { errBody = "Please login first." }
176-- > failingHandler = throwError $ err403 { errBody = "Please login first." }
176−err403 :: ServantErr
178+err403 :: ServerError
177−err403 = ServantErr { errHTTPCode = 403
179+err403 = ServerError { errHTTPCode = 403
178 , errReasonPhrase = "Forbidden"
180 , errReasonPhrase = "Forbidden"
179 , errBody = ""
181 , errBody = ""
180 , errHeaders = []
182 , errHeaders = []
@@ -187,8 +189,8 @@ err403 = ServantErr { errHTTPCode = 403
187-- > failingHandler :: Handler ()
189-- > failingHandler :: Handler ()
188-- > failingHandler = throwError $ err404 { errBody = "(╯°□°)╯︵ ┻━┻)." }
190-- > failingHandler = throwError $ err404 { errBody = "(╯°□°)╯︵ ┻━┻)." }
190−err404 :: ServantErr
192+err404 :: ServerError
191−err404 = ServantErr { errHTTPCode = 404
193+err404 = ServerError { errHTTPCode = 404
192 , errReasonPhrase = "Not Found"
194 , errReasonPhrase = "Not Found"
193 , errBody = ""
195 , errBody = ""
194 , errHeaders = []
196 , errHeaders = []
@@ -201,8 +203,8 @@ err404 = ServantErr { errHTTPCode = 404
201-- > failingHandler :: Handler ()
203-- > failingHandler :: Handler ()
202-- > failingHandler = throwError $ err405 { errBody = "Your account privileges does not allow for this. Please pay $$$." }
204-- > failingHandler = throwError $ err405 { errBody = "Your account privileges does not allow for this. Please pay $$$." }
204−err405 :: ServantErr
206+err405 :: ServerError
205−err405 = ServantErr { errHTTPCode = 405
207+err405 = ServerError { errHTTPCode = 405
206 , errReasonPhrase = "Method Not Allowed"
208 , errReasonPhrase = "Method Not Allowed"
207 , errBody = ""
209 , errBody = ""
208 , errHeaders = []
210 , errHeaders = []
@@ -215,8 +217,8 @@ err405 = ServantErr { errHTTPCode = 405
215-- > failingHandler :: Handler ()
217-- > failingHandler :: Handler ()
216-- > failingHandler = throwError err406
218-- > failingHandler = throwError err406
218−err406 :: ServantErr
220+err406 :: ServerError
219−err406 = ServantErr { errHTTPCode = 406
221+err406 = ServerError { errHTTPCode = 406
220 , errReasonPhrase = "Not Acceptable"
222 , errReasonPhrase = "Not Acceptable"
221 , errBody = ""
223 , errBody = ""
222 , errHeaders = []
224 , errHeaders = []
@@ -229,8 +231,8 @@ err406 = ServantErr { errHTTPCode = 406
229-- > failingHandler :: Handler ()
231-- > failingHandler :: Handler ()
230-- > failingHandler = throwError err407
232-- > failingHandler = throwError err407
232−err407 :: ServantErr
234+err407 :: ServerError
233−err407 = ServantErr { errHTTPCode = 407
235+err407 = ServerError { errHTTPCode = 407
234 , errReasonPhrase = "Proxy Authentication Required"
236 , errReasonPhrase = "Proxy Authentication Required"
235 , errBody = ""
237 , errBody = ""
236 , errHeaders = []
238 , errHeaders = []
@@ -243,8 +245,8 @@ err407 = ServantErr { errHTTPCode = 407
243-- > failingHandler :: Handler ()
245-- > failingHandler :: Handler ()
244-- > failingHandler = throwError $ err409 { errBody = "Transaction conflicts with 59879cb56c7c159231eeacdd503d755f7e835f74" }
246-- > failingHandler = throwError $ err409 { errBody = "Transaction conflicts with 59879cb56c7c159231eeacdd503d755f7e835f74" }
246−err409 :: ServantErr
248+err409 :: ServerError
247−err409 = ServantErr { errHTTPCode = 409
249+err409 = ServerError { errHTTPCode = 409
248 , errReasonPhrase = "Conflict"
250 , errReasonPhrase = "Conflict"
249 , errBody = ""
251 , errBody = ""
250 , errHeaders = []
252 , errHeaders = []
@@ -257,8 +259,8 @@ err409 = ServantErr { errHTTPCode = 409
257-- > failingHandler :: Handler ()
259-- > failingHandler :: Handler ()
258-- > failingHandler = throwError $ err410 { errBody = "I know it was here at some point, but.. I blame bad luck." }
260-- > failingHandler = throwError $ err410 { errBody = "I know it was here at some point, but.. I blame bad luck." }
260−err410 :: ServantErr
262+err410 :: ServerError
261−err410 = ServantErr { errHTTPCode = 410
263+err410 = ServerError { errHTTPCode = 410
262 , errReasonPhrase = "Gone"
264 , errReasonPhrase = "Gone"
263 , errBody = ""
265 , errBody = ""
264 , errHeaders = []
266 , errHeaders = []
@@ -271,8 +273,8 @@ err410 = ServantErr { errHTTPCode = 410
271-- > failingHandler :: Handler ()
273-- > failingHandler :: Handler ()
272-- > failingHandler = throwError err411
274-- > failingHandler = throwError err411
274−err411 :: ServantErr
276+err411 :: ServerError
275−err411 = ServantErr { errHTTPCode = 411
277+err411 = ServerError { errHTTPCode = 411
276 , errReasonPhrase = "Length Required"
278 , errReasonPhrase = "Length Required"
277 , errBody = ""
279 , errBody = ""
278 , errHeaders = []
280 , errHeaders = []
@@ -285,8 +287,8 @@ err411 = ServantErr { errHTTPCode = 411
285-- > failingHandler :: Handler ()
287-- > failingHandler :: Handler ()
286-- > failingHandler = throwError $ err412 { errBody = "Precondition fail: x < 42 && y > 57" }
288-- > failingHandler = throwError $ err412 { errBody = "Precondition fail: x < 42 && y > 57" }
288−err412 :: ServantErr
290+err412 :: ServerError
289−err412 = ServantErr { errHTTPCode = 412
291+err412 = ServerError { errHTTPCode = 412
290 , errReasonPhrase = "Precondition Failed"
292 , errReasonPhrase = "Precondition Failed"
291 , errBody = ""
293 , errBody = ""
292 , errHeaders = []
294 , errHeaders = []
@@ -299,8 +301,8 @@ err412 = ServantErr { errHTTPCode = 412
299-- > failingHandler :: Handler ()
301-- > failingHandler :: Handler ()
300-- > failingHandler = throwError $ err413 { errBody = "Request exceeded 64k." }
302-- > failingHandler = throwError $ err413 { errBody = "Request exceeded 64k." }
302−err413 :: ServantErr
304+err413 :: ServerError
303−err413 = ServantErr { errHTTPCode = 413
305+err413 = ServerError { errHTTPCode = 413
304 , errReasonPhrase = "Request Entity Too Large"
306 , errReasonPhrase = "Request Entity Too Large"
305 , errBody = ""
307 , errBody = ""
306 , errHeaders = []
308 , errHeaders = []
@@ -313,8 +315,8 @@ err413 = ServantErr { errHTTPCode = 413
313-- > failingHandler :: Handler ()
315-- > failingHandler :: Handler ()
314-- > failingHandler = throwError $ err414 { errBody = "Maximum length is 64." }
316-- > failingHandler = throwError $ err414 { errBody = "Maximum length is 64." }
316−err414 :: ServantErr
318+err414 :: ServerError
317−err414 = ServantErr { errHTTPCode = 414
319+err414 = ServerError { errHTTPCode = 414
318 , errReasonPhrase = "Request-URI Too Large"
320 , errReasonPhrase = "Request-URI Too Large"
319 , errBody = ""
321 , errBody = ""
320 , errHeaders = []
322 , errHeaders = []
@@ -327,8 +329,8 @@ err414 = ServantErr { errHTTPCode = 414
327-- > failingHandler :: Handler ()
329-- > failingHandler :: Handler ()
328-- > failingHandler = throwError $ err415 { errBody = "Supported media types: gif, png" }
330-- > failingHandler = throwError $ err415 { errBody = "Supported media types: gif, png" }
330−err415 :: ServantErr
332+err415 :: ServerError
331−err415 = ServantErr { errHTTPCode = 415
333+err415 = ServerError { errHTTPCode = 415
332 , errReasonPhrase = "Unsupported Media Type"
334 , errReasonPhrase = "Unsupported Media Type"
333 , errBody = ""
335 , errBody = ""
334 , errHeaders = []
336 , errHeaders = []
@@ -341,8 +343,8 @@ err415 = ServantErr { errHTTPCode = 415
341-- > failingHandler :: Handler ()
343-- > failingHandler :: Handler ()
342-- > failingHandler = throwError $ err416 { errBody = "Valid range is [0, 424242]." }
344-- > failingHandler = throwError $ err416 { errBody = "Valid range is [0, 424242]." }
344−err416 :: ServantErr
346+err416 :: ServerError
345−err416 = ServantErr { errHTTPCode = 416
347+err416 = ServerError { errHTTPCode = 416
346 , errReasonPhrase = "Request range not satisfiable"
348 , errReasonPhrase = "Request range not satisfiable"
347 , errBody = ""
349 , errBody = ""
348 , errHeaders = []
350 , errHeaders = []
@@ -355,8 +357,8 @@ err416 = ServantErr { errHTTPCode = 416
355-- > failingHandler :: Handler ()
357-- > failingHandler :: Handler ()
356-- > failingHandler = throwError $ err417 { errBody = "I found a quux in the request. This isn't going to work." }
358-- > failingHandler = throwError $ err417 { errBody = "I found a quux in the request. This isn't going to work." }
358−err417 :: ServantErr
360+err417 :: ServerError
359−err417 = ServantErr { errHTTPCode = 417
361+err417 = ServerError { errHTTPCode = 417
360 , errReasonPhrase = "Expectation Failed"
362 , errReasonPhrase = "Expectation Failed"
361 , errBody = ""
363 , errBody = ""
362 , errHeaders = []
364 , errHeaders = []
@@ -369,8 +371,8 @@ err417 = ServantErr { errHTTPCode = 417
369-- > failingHandler :: Handler ()
371-- > failingHandler :: Handler ()
370-- > failingHandler = throwError $ err418 { errBody = "Apologies, this is not a webserver but a teapot." }
372-- > failingHandler = throwError $ err418 { errBody = "Apologies, this is not a webserver but a teapot." }
372−err418 :: ServantErr
374+err418 :: ServerError
373−err418 = ServantErr { errHTTPCode = 418
375+err418 = ServerError { errHTTPCode = 418
374 , errReasonPhrase = "I'm a teapot"
376 , errReasonPhrase = "I'm a teapot"
375 , errBody = ""
377 , errBody = ""
376 , errHeaders = []
378 , errHeaders = []
@@ -383,8 +385,8 @@ err418 = ServantErr { errHTTPCode = 418
383-- > failingHandler :: Handler ()
385-- > failingHandler :: Handler ()
384-- > failingHandler = throwError $ err422 { errBody = "I understood your request, but can't process it." }
386-- > failingHandler = throwError $ err422 { errBody = "I understood your request, but can't process it." }
386−err422 :: ServantErr
388+err422 :: ServerError
387−err422 = ServantErr { errHTTPCode = 422
389+err422 = ServerError { errHTTPCode = 422
388 , errReasonPhrase = "Unprocessable Entity"
390 , errReasonPhrase = "Unprocessable Entity"
389 , errBody = ""
391 , errBody = ""
390 , errHeaders = []
392 , errHeaders = []
@@ -397,8 +399,8 @@ err422 = ServantErr { errHTTPCode = 422
397-- > failingHandler :: Handler ()
399-- > failingHandler :: Handler ()
398-- > failingHandler = throwError $ err500 { errBody = "Exception in module A.B.C:55. Have a great day!" }
400-- > failingHandler = throwError $ err500 { errBody = "Exception in module A.B.C:55. Have a great day!" }
400−err500 :: ServantErr
402+err500 :: ServerError
401−err500 = ServantErr { errHTTPCode = 500
403+err500 = ServerError { errHTTPCode = 500
402 , errReasonPhrase = "Internal Server Error"
404 , errReasonPhrase = "Internal Server Error"
403 , errBody = ""
405 , errBody = ""
404 , errHeaders = []
406 , errHeaders = []
@@ -411,8 +413,8 @@ err500 = ServantErr { errHTTPCode = 500
411-- > failingHandler :: Handler ()
413-- > failingHandler :: Handler ()
412-- > failingHandler = throwError $ err501 { errBody = "/v1/foo is not supported with quux in the request." }
414-- > failingHandler = throwError $ err501 { errBody = "/v1/foo is not supported with quux in the request." }
414−err501 :: ServantErr
416+err501 :: ServerError
415−err501 = ServantErr { errHTTPCode = 501
417+err501 = ServerError { errHTTPCode = 501
416 , errReasonPhrase = "Not Implemented"
418 , errReasonPhrase = "Not Implemented"
417 , errBody = ""
419 , errBody = ""
418 , errHeaders = []
420 , errHeaders = []
@@ -425,8 +427,8 @@ err501 = ServantErr { errHTTPCode = 501
425-- > failingHandler :: Handler ()
427-- > failingHandler :: Handler ()
426-- > failingHandler = throwError $ err502 { errBody = "Tried gateway foo, bar, and baz. None responded." }
428-- > failingHandler = throwError $ err502 { errBody = "Tried gateway foo, bar, and baz. None responded." }
428−err502 :: ServantErr
430+err502 :: ServerError
429−err502 = ServantErr { errHTTPCode = 502
431+err502 = ServerError { errHTTPCode = 502
430 , errReasonPhrase = "Bad Gateway"
432 , errReasonPhrase = "Bad Gateway"
431 , errBody = ""
433 , errBody = ""
432 , errHeaders = []
434 , errHeaders = []
@@ -439,8 +441,8 @@ err502 = ServantErr { errHTTPCode = 502
439-- > failingHandler :: Handler ()
441-- > failingHandler :: Handler ()
440-- > failingHandler = throwError $ err503 { errBody = "We're rewriting in PHP." }
442-- > failingHandler = throwError $ err503 { errBody = "We're rewriting in PHP." }
442−err503 :: ServantErr
444+err503 :: ServerError
443−err503 = ServantErr { errHTTPCode = 503
445+err503 = ServerError { errHTTPCode = 503
444 , errReasonPhrase = "Service Unavailable"
446 , errReasonPhrase = "Service Unavailable"
445 , errBody = ""
447 , errBody = ""
446 , errHeaders = []
448 , errHeaders = []
@@ -453,8 +455,8 @@ err503 = ServantErr { errHTTPCode = 503
453-- > failingHandler :: Handler ()
455-- > failingHandler :: Handler ()
454-- > failingHandler = throwError $ err504 { errBody = "Backend foobar did not respond in 5 seconds." }
456-- > failingHandler = throwError $ err504 { errBody = "Backend foobar did not respond in 5 seconds." }
456−err504 :: ServantErr
458+err504 :: ServerError
457−err504 = ServantErr { errHTTPCode = 504
459+err504 = ServerError { errHTTPCode = 504
458 , errReasonPhrase = "Gateway Time-out"
460 , errReasonPhrase = "Gateway Time-out"
459 , errBody = ""
461 , errBody = ""
460 , errHeaders = []
462 , errHeaders = []
@@ -467,8 +469,8 @@ err504 = ServantErr { errHTTPCode = 504
467-- > failingHandler :: Handler ()
469-- > failingHandler :: Handler ()
468-- > failingHandler = throwError $ err505 { errBody = "I support HTTP/4.0 only." }
470-- > failingHandler = throwError $ err505 { errBody = "I support HTTP/4.0 only." }
470−err505 :: ServantErr
472+err505 :: ServerError
471−err505 = ServantErr { errHTTPCode = 505
473+err505 = ServerError { errHTTPCode = 505
472 , errReasonPhrase = "HTTP Version not supported"
474 , errReasonPhrase = "HTTP Version not supported"
473 , errBody = ""
475 , errBody = ""
474 , errHeaders = []
476 , errHeaders = []