Skip to content

Commit 8314ce7

Browse files
authored
[default-responses] Implement all HttpResponseException classes
closes javalin#1811
1 parent 726f263 commit 8314ce7

File tree

2 files changed

+327
-0
lines changed

2 files changed

+327
-0
lines changed

javalin/src/main/java/io/javalin/http/HttpResponseException.kt

Lines changed: 299 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,67 @@
66

77
package io.javalin.http
88

9+
import io.javalin.http.HttpStatus.ACCEPTED
10+
import io.javalin.http.HttpStatus.ALREADY_REPORTED
911
import io.javalin.http.HttpStatus.BAD_GATEWAY
1012
import io.javalin.http.HttpStatus.BAD_REQUEST
1113
import io.javalin.http.HttpStatus.CONFLICT
14+
import io.javalin.http.HttpStatus.CONTENT_TOO_LARGE
15+
import io.javalin.http.HttpStatus.CONTINUE
16+
import io.javalin.http.HttpStatus.CREATED
17+
import io.javalin.http.HttpStatus.EARLY_HINTS
18+
import io.javalin.http.HttpStatus.ENHANCE_YOUR_CALM
19+
import io.javalin.http.HttpStatus.EXPECTATION_FAILED
20+
import io.javalin.http.HttpStatus.FAILED_DEPENDENCY
1221
import io.javalin.http.HttpStatus.FORBIDDEN
1322
import io.javalin.http.HttpStatus.FOUND
1423
import io.javalin.http.HttpStatus.GATEWAY_TIMEOUT
1524
import io.javalin.http.HttpStatus.GONE
25+
import io.javalin.http.HttpStatus.HTTP_VERSION_NOT_SUPPORTED
26+
import io.javalin.http.HttpStatus.IM_A_TEAPOT
27+
import io.javalin.http.HttpStatus.IM_USED
28+
import io.javalin.http.HttpStatus.INSUFFICIENT_STORAGE
1629
import io.javalin.http.HttpStatus.INTERNAL_SERVER_ERROR
30+
import io.javalin.http.HttpStatus.LENGTH_REQUIRED
31+
import io.javalin.http.HttpStatus.LOCKED
32+
import io.javalin.http.HttpStatus.LOOP_DETECTED
1733
import io.javalin.http.HttpStatus.METHOD_NOT_ALLOWED
34+
import io.javalin.http.HttpStatus.MISDIRECTED_REQUEST
35+
import io.javalin.http.HttpStatus.MOVED_PERMANENTLY
36+
import io.javalin.http.HttpStatus.MULTIPLE_CHOICES
37+
import io.javalin.http.HttpStatus.MULTI_STATUS
38+
import io.javalin.http.HttpStatus.NETWORK_AUTHENTICATION_REQUIRED
39+
import io.javalin.http.HttpStatus.NON_AUTHORITATIVE_INFORMATION
40+
import io.javalin.http.HttpStatus.NOT_ACCEPTABLE
1841
import io.javalin.http.HttpStatus.NOT_FOUND
42+
import io.javalin.http.HttpStatus.NOT_IMPLEMENTED
43+
import io.javalin.http.HttpStatus.NOT_MODIFIED
44+
import io.javalin.http.HttpStatus.NO_CONTENT
45+
import io.javalin.http.HttpStatus.OK
46+
import io.javalin.http.HttpStatus.PARTIAL_CONTENT
47+
import io.javalin.http.HttpStatus.PAYMENT_REQUIRED
48+
import io.javalin.http.HttpStatus.PERMANENT_REDIRECT
49+
import io.javalin.http.HttpStatus.PRECONDITION_FAILED
50+
import io.javalin.http.HttpStatus.PRECONDITION_REQUIRED
51+
import io.javalin.http.HttpStatus.PROCESSING
52+
import io.javalin.http.HttpStatus.PROXY_AUTHENTICATION_REQUIRED
53+
import io.javalin.http.HttpStatus.RANGE_NOT_SATISFIABLE
54+
import io.javalin.http.HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE
55+
import io.javalin.http.HttpStatus.REQUEST_TIMEOUT
56+
import io.javalin.http.HttpStatus.RESET_CONTENT
57+
import io.javalin.http.HttpStatus.SEE_OTHER
1958
import io.javalin.http.HttpStatus.SERVICE_UNAVAILABLE
59+
import io.javalin.http.HttpStatus.SWITCHING_PROTOCOLS
60+
import io.javalin.http.HttpStatus.TEMPORARY_REDIRECT
61+
import io.javalin.http.HttpStatus.TOO_EARLY
62+
import io.javalin.http.HttpStatus.TOO_MANY_REQUESTS
2063
import io.javalin.http.HttpStatus.UNAUTHORIZED
64+
import io.javalin.http.HttpStatus.UNAVAILABLE_FOR_LEGAL_REASONS
65+
import io.javalin.http.HttpStatus.UNPROCESSABLE_CONTENT
66+
import io.javalin.http.HttpStatus.UNSUPPORTED_MEDIA_TYPE
67+
import io.javalin.http.HttpStatus.UPGRADE_REQUIRED
68+
import io.javalin.http.HttpStatus.URI_TOO_LONG
69+
import io.javalin.http.HttpStatus.USE_PROXY
2170

2271
open class HttpResponseException @JvmOverloads constructor(
2372
val status: Int,
@@ -31,12 +80,122 @@ open class HttpResponseException @JvmOverloads constructor(
3180
) : this(status.code, message, details)
3281
}
3382

83+
open class ContinueResponse @JvmOverloads constructor(
84+
message: String = CONTINUE.message,
85+
details: Map<String, String> = mapOf()
86+
) : HttpResponseException(CONTINUE, message, details)
87+
88+
open class SwitchingProtocolsResponse @JvmOverloads constructor(
89+
message: String = SWITCHING_PROTOCOLS.message,
90+
details: Map<String, String> = mapOf()
91+
) : HttpResponseException(SWITCHING_PROTOCOLS, message, details)
92+
93+
open class ProcessingResponse @JvmOverloads constructor(
94+
message: String = PROCESSING.message,
95+
details: Map<String, String> = mapOf()
96+
) : HttpResponseException(PROCESSING, message, details)
97+
98+
open class EarlyHintsResponse @JvmOverloads constructor(
99+
message: String = EARLY_HINTS.message,
100+
details: Map<String, String> = mapOf()
101+
) : HttpResponseException(EARLY_HINTS, message, details)
102+
103+
open class OkResponse @JvmOverloads constructor(
104+
message: String = OK.message,
105+
details: Map<String, String> = mapOf()
106+
) : HttpResponseException(OK, message, details)
107+
108+
open class CreatedResponse @JvmOverloads constructor(
109+
message: String = CREATED.message,
110+
details: Map<String, String> = mapOf()
111+
) : HttpResponseException(CREATED, message, details)
112+
113+
open class AcceptedResponse @JvmOverloads constructor(
114+
message: String = ACCEPTED.message,
115+
details: Map<String, String> = mapOf()
116+
) : HttpResponseException(ACCEPTED, message, details)
117+
118+
open class NonAuthoritativeInformationResponse @JvmOverloads constructor(
119+
message: String = NON_AUTHORITATIVE_INFORMATION.message,
120+
details: Map<String, String> = mapOf()
121+
) : HttpResponseException(NON_AUTHORITATIVE_INFORMATION, message, details)
122+
123+
open class NoContentResponse @JvmOverloads constructor(
124+
message: String = NO_CONTENT.message,
125+
details: Map<String, String> = mapOf()
126+
) : HttpResponseException(NO_CONTENT, message, details)
127+
128+
open class ResetContentResponse @JvmOverloads constructor(
129+
message: String = RESET_CONTENT.message,
130+
details: Map<String, String> = mapOf()
131+
) : HttpResponseException(RESET_CONTENT, message, details)
132+
133+
open class PartialContentResponse @JvmOverloads constructor(
134+
message: String = PARTIAL_CONTENT.message,
135+
details: Map<String, String> = mapOf()
136+
) : HttpResponseException(PARTIAL_CONTENT, message, details)
137+
138+
open class MultiStatusResponse @JvmOverloads constructor(
139+
message: String = MULTI_STATUS.message,
140+
details: Map<String, String> = mapOf()
141+
) : HttpResponseException(MULTI_STATUS, message, details)
142+
143+
open class AlreadyReportedResponse @JvmOverloads constructor(
144+
message: String = ALREADY_REPORTED.message,
145+
details: Map<String, String> = mapOf()
146+
) : HttpResponseException(ALREADY_REPORTED, message, details)
147+
148+
open class ImUsedResponse @JvmOverloads constructor(
149+
message: String = IM_USED.message,
150+
details: Map<String, String> = mapOf()
151+
) : HttpResponseException(IM_USED, message, details)
152+
34153
open class RedirectResponse @JvmOverloads constructor(
35154
status: HttpStatus = FOUND,
36155
message: String = status.message,
37156
details: Map<String, String> = mapOf()
38157
) : HttpResponseException(status, message, details)
39158

159+
open class MultipleChoicesResponse @JvmOverloads constructor(
160+
message: String = MULTIPLE_CHOICES.message,
161+
details: Map<String, String> = mapOf()
162+
) : HttpResponseException(MULTIPLE_CHOICES, message, details)
163+
164+
open class MovedPermanentlyResponse @JvmOverloads constructor(
165+
message: String = MOVED_PERMANENTLY.message,
166+
details: Map<String, String> = mapOf()
167+
) : HttpResponseException(MOVED_PERMANENTLY, message, details)
168+
169+
open class FoundResponse @JvmOverloads constructor(
170+
message: String = FOUND.message,
171+
details: Map<String, String> = mapOf()
172+
) : HttpResponseException(FOUND, message, details)
173+
174+
open class SeeOtherResponse @JvmOverloads constructor(
175+
message: String = SEE_OTHER.message,
176+
details: Map<String, String> = mapOf()
177+
) : HttpResponseException(SEE_OTHER, message, details)
178+
179+
open class NotModifiedResponse @JvmOverloads constructor(
180+
message: String = NOT_MODIFIED.message,
181+
details: Map<String, String> = mapOf()
182+
) : HttpResponseException(NOT_MODIFIED, message, details)
183+
184+
open class UseProxyResponse @JvmOverloads constructor(
185+
message: String = USE_PROXY.message,
186+
details: Map<String, String> = mapOf()
187+
) : HttpResponseException(USE_PROXY, message, details)
188+
189+
open class TemporaryRedirectResponse @JvmOverloads constructor(
190+
message: String = TEMPORARY_REDIRECT.message,
191+
details: Map<String, String> = mapOf()
192+
) : HttpResponseException(TEMPORARY_REDIRECT, message, details)
193+
194+
open class PermanentRedirectResponse @JvmOverloads constructor(
195+
message: String = PERMANENT_REDIRECT.message,
196+
details: Map<String, String> = mapOf()
197+
) : HttpResponseException(PERMANENT_REDIRECT, message, details)
198+
40199
open class BadRequestResponse @JvmOverloads constructor(
41200
message: String = BAD_REQUEST.message,
42201
details: Map<String, String> = mapOf()
@@ -47,6 +206,11 @@ open class UnauthorizedResponse @JvmOverloads constructor(
47206
details: Map<String, String> = mapOf()
48207
) : HttpResponseException(UNAUTHORIZED, message, details)
49208

209+
open class PaymentRequiredResponse @JvmOverloads constructor(
210+
message: String = PAYMENT_REQUIRED.message,
211+
details: Map<String, String> = mapOf()
212+
) : HttpResponseException(PAYMENT_REQUIRED, message, details)
213+
50214
open class ForbiddenResponse @JvmOverloads constructor(
51215
message: String = FORBIDDEN.message,
52216
details: Map<String, String> = mapOf()
@@ -62,6 +226,21 @@ open class MethodNotAllowedResponse @JvmOverloads constructor(
62226
details: Map<String, String> = mapOf()
63227
) : HttpResponseException(METHOD_NOT_ALLOWED, message, details)
64228

229+
open class NotAcceptableResponse @JvmOverloads constructor(
230+
message: String = NOT_ACCEPTABLE.message,
231+
details: Map<String, String> = mapOf()
232+
) : HttpResponseException(NOT_ACCEPTABLE, message, details)
233+
234+
open class ProxyAuthenticationRequiredResponse @JvmOverloads constructor(
235+
message: String = PROXY_AUTHENTICATION_REQUIRED.message,
236+
details: Map<String, String> = mapOf()
237+
) : HttpResponseException(PROXY_AUTHENTICATION_REQUIRED, message, details)
238+
239+
open class RequestTimeoutResponse @JvmOverloads constructor(
240+
message: String = REQUEST_TIMEOUT.message,
241+
details: Map<String, String> = mapOf()
242+
) : HttpResponseException(REQUEST_TIMEOUT, message, details)
243+
65244
open class ConflictResponse @JvmOverloads constructor(
66245
message: String = CONFLICT.message,
67246
details: Map<String, String> = mapOf()
@@ -72,11 +251,111 @@ open class GoneResponse @JvmOverloads constructor(
72251
details: Map<String, String> = mapOf()
73252
) : HttpResponseException(GONE, message, details)
74253

254+
open class LengthRequiredResponse @JvmOverloads constructor(
255+
message: String = LENGTH_REQUIRED.message,
256+
details: Map<String, String> = mapOf()
257+
) : HttpResponseException(LENGTH_REQUIRED, message, details)
258+
259+
open class PreconditionFailedResponse @JvmOverloads constructor(
260+
message: String = PRECONDITION_FAILED.message,
261+
details: Map<String, String> = mapOf()
262+
) : HttpResponseException(PRECONDITION_FAILED, message, details)
263+
264+
open class ContentTooLargeResponse @JvmOverloads constructor(
265+
message: String = CONTENT_TOO_LARGE.message,
266+
details: Map<String, String> = mapOf()
267+
) : HttpResponseException(CONTENT_TOO_LARGE, message, details)
268+
269+
open class UriTooLongResponse @JvmOverloads constructor(
270+
message: String = URI_TOO_LONG.message,
271+
details: Map<String, String> = mapOf()
272+
) : HttpResponseException(URI_TOO_LONG, message, details)
273+
274+
open class UnsupportedMediaTypeResponse @JvmOverloads constructor(
275+
message: String = UNSUPPORTED_MEDIA_TYPE.message,
276+
details: Map<String, String> = mapOf()
277+
) : HttpResponseException(UNSUPPORTED_MEDIA_TYPE, message, details)
278+
279+
open class RangeNotSatisfiableResponse @JvmOverloads constructor(
280+
message: String = RANGE_NOT_SATISFIABLE.message,
281+
details: Map<String, String> = mapOf()
282+
) : HttpResponseException(RANGE_NOT_SATISFIABLE, message, details)
283+
284+
open class ExpectationFailedResponse @JvmOverloads constructor(
285+
message: String = EXPECTATION_FAILED.message,
286+
details: Map<String, String> = mapOf()
287+
) : HttpResponseException(EXPECTATION_FAILED, message, details)
288+
289+
open class ImATeapotResponse @JvmOverloads constructor(
290+
message: String = IM_A_TEAPOT.message,
291+
details: Map<String, String> = mapOf()
292+
) : HttpResponseException(IM_A_TEAPOT, message, details)
293+
294+
open class EnhanceYourCalmResponse @JvmOverloads constructor(
295+
message: String = ENHANCE_YOUR_CALM.message,
296+
details: Map<String, String> = mapOf()
297+
) : HttpResponseException(ENHANCE_YOUR_CALM, message, details)
298+
299+
open class MisdirectedRequestResponse @JvmOverloads constructor(
300+
message: String = MISDIRECTED_REQUEST.message,
301+
details: Map<String, String> = mapOf()
302+
) : HttpResponseException(MISDIRECTED_REQUEST, message, details)
303+
304+
open class UnprocessableContentResponse @JvmOverloads constructor(
305+
message: String = UNPROCESSABLE_CONTENT.message,
306+
details: Map<String, String> = mapOf()
307+
) : HttpResponseException(UNPROCESSABLE_CONTENT, message, details)
308+
309+
open class LockedResponse @JvmOverloads constructor(
310+
message: String = LOCKED.message,
311+
details: Map<String, String> = mapOf()
312+
) : HttpResponseException(LOCKED, message, details)
313+
314+
open class FailedDependencyResponse @JvmOverloads constructor(
315+
message: String = FAILED_DEPENDENCY.message,
316+
details: Map<String, String> = mapOf()
317+
) : HttpResponseException(FAILED_DEPENDENCY, message, details)
318+
319+
open class TooEarlyResponse @JvmOverloads constructor(
320+
message: String = TOO_EARLY.message,
321+
details: Map<String, String> = mapOf()
322+
) : HttpResponseException(TOO_EARLY, message, details)
323+
324+
open class UpgradeRequiredResponse @JvmOverloads constructor(
325+
message: String = UPGRADE_REQUIRED.message,
326+
details: Map<String, String> = mapOf()
327+
) : HttpResponseException(UPGRADE_REQUIRED, message, details)
328+
329+
open class PreconditionRequiredResponse @JvmOverloads constructor(
330+
message: String = PRECONDITION_REQUIRED.message,
331+
details: Map<String, String> = mapOf()
332+
) : HttpResponseException(PRECONDITION_REQUIRED, message, details)
333+
334+
open class TooManyRequestsResponse @JvmOverloads constructor(
335+
message: String = TOO_MANY_REQUESTS.message,
336+
details: Map<String, String> = mapOf()
337+
) : HttpResponseException(TOO_MANY_REQUESTS, message, details)
338+
339+
open class RequestHeaderFieldsTooLargeResponse @JvmOverloads constructor(
340+
message: String = REQUEST_HEADER_FIELDS_TOO_LARGE.message,
341+
details: Map<String, String> = mapOf()
342+
) : HttpResponseException(REQUEST_HEADER_FIELDS_TOO_LARGE, message, details)
343+
344+
open class UnavailableForLegalReasonsResponse @JvmOverloads constructor(
345+
message: String = UNAVAILABLE_FOR_LEGAL_REASONS.message,
346+
details: Map<String, String> = mapOf()
347+
) : HttpResponseException(UNAVAILABLE_FOR_LEGAL_REASONS, message, details)
348+
75349
open class InternalServerErrorResponse @JvmOverloads constructor(
76350
message: String = INTERNAL_SERVER_ERROR.message,
77351
details: Map<String, String> = mapOf()
78352
) : HttpResponseException(INTERNAL_SERVER_ERROR, message, details)
79353

354+
open class NotImplementedResponse @JvmOverloads constructor(
355+
message: String = NOT_IMPLEMENTED.message,
356+
details: Map<String, String> = mapOf()
357+
) : HttpResponseException(NOT_IMPLEMENTED, message, details)
358+
80359
open class BadGatewayResponse @JvmOverloads constructor(
81360
message: String = BAD_GATEWAY.message,
82361
details: Map<String, String> = mapOf()
@@ -91,3 +370,23 @@ open class GatewayTimeoutResponse @JvmOverloads constructor(
91370
message: String = GATEWAY_TIMEOUT.message,
92371
details: Map<String, String> = mapOf()
93372
) : HttpResponseException(GATEWAY_TIMEOUT, message, details)
373+
374+
open class HttpVersionNotSupportedResponse @JvmOverloads constructor(
375+
message: String = HTTP_VERSION_NOT_SUPPORTED.message,
376+
details: Map<String, String> = mapOf()
377+
) : HttpResponseException(HTTP_VERSION_NOT_SUPPORTED, message, details)
378+
379+
open class InsufficientStorageResponse @JvmOverloads constructor(
380+
message: String = INSUFFICIENT_STORAGE.message,
381+
details: Map<String, String> = mapOf()
382+
) : HttpResponseException(INSUFFICIENT_STORAGE, message, details)
383+
384+
open class LoopDetectedResponse @JvmOverloads constructor(
385+
message: String = LOOP_DETECTED.message,
386+
details: Map<String, String> = mapOf()
387+
) : HttpResponseException(LOOP_DETECTED, message, details)
388+
389+
open class NetworkAuthenticationRequiredResponse @JvmOverloads constructor(
390+
message: String = NETWORK_AUTHENTICATION_REQUIRED.message,
391+
details: Map<String, String> = mapOf()
392+
) : HttpResponseException(NETWORK_AUTHENTICATION_REQUIRED, message, details)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.javalin.http
2+
3+
import java.util.Locale
4+
import org.junit.jupiter.api.Test
5+
import org.junit.jupiter.api.assertDoesNotThrow
6+
7+
class HttpResponseExceptionTest {
8+
9+
@Test
10+
fun `all HttpStatus values should be covered by an Exception class`() {
11+
for (httpStatus in HttpStatus.values()) {
12+
if (httpStatus == HttpStatus.NOT_EXTENDED || httpStatus == HttpStatus.UNKNOWN) {
13+
continue
14+
}
15+
val convertedEnumName = httpStatus.name.splitToSequence("_").map { word ->
16+
word.lowercase().replaceFirstChar {
17+
if (it.isLowerCase()) it.titlecase(
18+
Locale.getDefault()
19+
) else it.toString()
20+
}
21+
}.joinToString("")
22+
val expectedClassName = "io.javalin.http.${convertedEnumName}Response"
23+
assertDoesNotThrow("$expectedClassName does not exist") {
24+
Class.forName(expectedClassName)
25+
}
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)