-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathHttpStatusCode.kt
More file actions
195 lines (168 loc) · 9.09 KB
/
Copy pathHttpStatusCode.kt
File metadata and controls
195 lines (168 loc) · 9.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
* Copyright 2014-2021 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/
package io.ktor.http
/**
* Represents an HTTP status code and description.
*
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.http.HttpStatusCode)
*
* @param value is a numeric code.
* @param description is free form description of a status.
*/
@Suppress("unused")
public data class HttpStatusCode(val value: Int, val description: String) : Comparable<HttpStatusCode> {
override fun toString(): String = "$value $description"
override fun equals(other: Any?): Boolean = other is HttpStatusCode && other.value == value
override fun hashCode(): Int = value.hashCode()
/**
* Returns a copy of `this` code with a description changed to [value].
*
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.http.HttpStatusCode.description)
*/
public fun description(value: String): HttpStatusCode = copy(description = value)
override fun compareTo(other: HttpStatusCode): Int = value - other.value
@Suppress("KDocMissingDocumentation", "PublicApiImplicitType")
public companion object {
// =============================================================================================================
// Disclaimer
// Adding a new status code here please remember [allStatusCodes] as well
//
public val Continue: HttpStatusCode = HttpStatusCode(100, "Continue")
public val SwitchingProtocols: HttpStatusCode = HttpStatusCode(101, "Switching Protocols")
public val Processing: HttpStatusCode = HttpStatusCode(102, "Processing")
public val OK: HttpStatusCode = HttpStatusCode(200, "OK")
public val Created: HttpStatusCode = HttpStatusCode(201, "Created")
public val Accepted: HttpStatusCode = HttpStatusCode(202, "Accepted")
public val NonAuthoritativeInformation: HttpStatusCode =
HttpStatusCode(203, "Non-Authoritative Information")
public val NoContent: HttpStatusCode = HttpStatusCode(204, "No Content")
public val ResetContent: HttpStatusCode = HttpStatusCode(205, "Reset Content")
public val PartialContent: HttpStatusCode = HttpStatusCode(206, "Partial Content")
public val MultiStatus: HttpStatusCode = HttpStatusCode(207, "Multi-Status")
public val MultipleChoices: HttpStatusCode = HttpStatusCode(300, "Multiple Choices")
public val MovedPermanently: HttpStatusCode = HttpStatusCode(301, "Moved Permanently")
public val Found: HttpStatusCode = HttpStatusCode(302, "Found")
public val SeeOther: HttpStatusCode = HttpStatusCode(303, "See Other")
public val NotModified: HttpStatusCode = HttpStatusCode(304, "Not Modified")
public val UseProxy: HttpStatusCode = HttpStatusCode(305, "Use Proxy")
public val SwitchProxy: HttpStatusCode = HttpStatusCode(306, "Switch Proxy")
public val TemporaryRedirect: HttpStatusCode = HttpStatusCode(307, "Temporary Redirect")
public val PermanentRedirect: HttpStatusCode = HttpStatusCode(308, "Permanent Redirect")
public val BadRequest: HttpStatusCode = HttpStatusCode(400, "Bad Request")
public val Unauthorized: HttpStatusCode = HttpStatusCode(401, "Unauthorized")
public val PaymentRequired: HttpStatusCode = HttpStatusCode(402, "Payment Required")
public val Forbidden: HttpStatusCode = HttpStatusCode(403, "Forbidden")
public val NotFound: HttpStatusCode = HttpStatusCode(404, "Not Found")
public val MethodNotAllowed: HttpStatusCode = HttpStatusCode(405, "Method Not Allowed")
public val NotAcceptable: HttpStatusCode = HttpStatusCode(406, "Not Acceptable")
public val ProxyAuthenticationRequired: HttpStatusCode =
HttpStatusCode(407, "Proxy Authentication Required")
public val RequestTimeout: HttpStatusCode = HttpStatusCode(408, "Request Timeout")
public val Conflict: HttpStatusCode = HttpStatusCode(409, "Conflict")
public val Gone: HttpStatusCode = HttpStatusCode(410, "Gone")
public val LengthRequired: HttpStatusCode = HttpStatusCode(411, "Length Required")
public val PreconditionFailed: HttpStatusCode = HttpStatusCode(412, "Precondition Failed")
public val PayloadTooLarge: HttpStatusCode = HttpStatusCode(413, "Payload Too Large")
public val RequestURITooLong: HttpStatusCode = HttpStatusCode(414, "Request-URI Too Long")
public val UnsupportedMediaType: HttpStatusCode = HttpStatusCode(415, "Unsupported Media Type")
public val RequestedRangeNotSatisfiable: HttpStatusCode =
HttpStatusCode(416, "Requested Range Not Satisfiable")
public val ExpectationFailed: HttpStatusCode = HttpStatusCode(417, "Expectation Failed")
public val UnprocessableEntity: HttpStatusCode = HttpStatusCode(422, "Unprocessable Entity")
public val Locked: HttpStatusCode = HttpStatusCode(423, "Locked")
public val FailedDependency: HttpStatusCode = HttpStatusCode(424, "Failed Dependency")
public val TooEarly: HttpStatusCode = HttpStatusCode(425, "Too Early")
public val UpgradeRequired: HttpStatusCode = HttpStatusCode(426, "Upgrade Required")
public val TooManyRequests: HttpStatusCode = HttpStatusCode(429, "Too Many Requests")
public val RequestHeaderFieldTooLarge: HttpStatusCode =
HttpStatusCode(431, "Request Header Fields Too Large")
public val InternalServerError: HttpStatusCode = HttpStatusCode(500, "Internal Server Error")
public val NotImplemented: HttpStatusCode = HttpStatusCode(501, "Not Implemented")
public val BadGateway: HttpStatusCode = HttpStatusCode(502, "Bad Gateway")
public val ServiceUnavailable: HttpStatusCode = HttpStatusCode(503, "Service Unavailable")
public val GatewayTimeout: HttpStatusCode = HttpStatusCode(504, "Gateway Timeout")
public val VersionNotSupported: HttpStatusCode =
HttpStatusCode(505, "HTTP Version Not Supported")
public val VariantAlsoNegotiates: HttpStatusCode = HttpStatusCode(506, "Variant Also Negotiates")
public val InsufficientStorage: HttpStatusCode = HttpStatusCode(507, "Insufficient Storage")
/**
* All known status codes
*
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.http.HttpStatusCode.Companion.allStatusCodes)
*/
public val allStatusCodes: List<HttpStatusCode> = allStatusCodes()
private val statusCodesMap: Map<Int, HttpStatusCode> = allStatusCodes.associateBy { it.value }
/**
* Creates an instance of [HttpStatusCode] with the given numeric value.
*
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.http.HttpStatusCode.Companion.fromValue)
*/
public fun fromValue(value: Int): HttpStatusCode {
return statusCodesMap[value] ?: HttpStatusCode(value, "Unknown Status Code")
}
}
}
internal fun allStatusCodes(): List<HttpStatusCode> = listOf(
HttpStatusCode.Continue,
HttpStatusCode.SwitchingProtocols,
HttpStatusCode.Processing,
HttpStatusCode.OK,
HttpStatusCode.Created,
HttpStatusCode.Accepted,
HttpStatusCode.NonAuthoritativeInformation,
HttpStatusCode.NoContent,
HttpStatusCode.ResetContent,
HttpStatusCode.PartialContent,
HttpStatusCode.MultiStatus,
HttpStatusCode.MultipleChoices,
HttpStatusCode.MovedPermanently,
HttpStatusCode.Found,
HttpStatusCode.SeeOther,
HttpStatusCode.NotModified,
HttpStatusCode.UseProxy,
HttpStatusCode.SwitchProxy,
HttpStatusCode.TemporaryRedirect,
HttpStatusCode.PermanentRedirect,
HttpStatusCode.BadRequest,
HttpStatusCode.Unauthorized,
HttpStatusCode.PaymentRequired,
HttpStatusCode.Forbidden,
HttpStatusCode.NotFound,
HttpStatusCode.MethodNotAllowed,
HttpStatusCode.NotAcceptable,
HttpStatusCode.ProxyAuthenticationRequired,
HttpStatusCode.RequestTimeout,
HttpStatusCode.Conflict,
HttpStatusCode.Gone,
HttpStatusCode.LengthRequired,
HttpStatusCode.PreconditionFailed,
HttpStatusCode.PayloadTooLarge,
HttpStatusCode.RequestURITooLong,
HttpStatusCode.UnsupportedMediaType,
HttpStatusCode.RequestedRangeNotSatisfiable,
HttpStatusCode.ExpectationFailed,
HttpStatusCode.UnprocessableEntity,
HttpStatusCode.Locked,
HttpStatusCode.FailedDependency,
HttpStatusCode.TooEarly,
HttpStatusCode.UpgradeRequired,
HttpStatusCode.TooManyRequests,
HttpStatusCode.RequestHeaderFieldTooLarge,
HttpStatusCode.InternalServerError,
HttpStatusCode.NotImplemented,
HttpStatusCode.BadGateway,
HttpStatusCode.ServiceUnavailable,
HttpStatusCode.GatewayTimeout,
HttpStatusCode.VersionNotSupported,
HttpStatusCode.VariantAlsoNegotiates,
HttpStatusCode.InsufficientStorage
)
/**
* Checks if a given status code is a success code according to HTTP standards.
*
* Codes from 200 to 299 are considered to be successful.
*
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.http.isSuccess)
*/
public fun HttpStatusCode.isSuccess(): Boolean = value in (200 until 300)