78 lines
2.8 KiB
Java
78 lines
2.8 KiB
Java
package dev.relism.http;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
/**
|
|
* Pre-compiled byte representations of standard HTTP status lines.
|
|
* Uses a direct-access array for O(1) lookup with zero allocation.
|
|
*/
|
|
public enum HttpStatus {
|
|
|
|
// 1xx
|
|
CONTINUE (100, "Continue"),
|
|
SWITCHING_PROTOCOLS (101, "Switching Protocols"),
|
|
|
|
// 2xx
|
|
OK (200, "OK"),
|
|
CREATED (201, "Created"),
|
|
ACCEPTED (202, "Accepted"),
|
|
NO_CONTENT (204, "No Content"),
|
|
PARTIAL_CONTENT (206, "Partial Content"),
|
|
|
|
// 3xx
|
|
MOVED_PERMANENTLY (301, "Moved Permanently"),
|
|
FOUND (302, "Found"),
|
|
NOT_MODIFIED (304, "Not Modified"),
|
|
TEMPORARY_REDIRECT (307, "Temporary Redirect"),
|
|
PERMANENT_REDIRECT (308, "Permanent Redirect"),
|
|
|
|
// 4xx
|
|
BAD_REQUEST (400, "Bad Request"),
|
|
UNAUTHORIZED (401, "Unauthorized"),
|
|
FORBIDDEN (403, "Forbidden"),
|
|
NOT_FOUND (404, "Not Found"),
|
|
METHOD_NOT_ALLOWED (405, "Method Not Allowed"),
|
|
NOT_ACCEPTABLE (406, "Not Acceptable"),
|
|
CONFLICT (409, "Conflict"),
|
|
GONE (410, "Gone"),
|
|
LENGTH_REQUIRED (411, "Length Required"),
|
|
PAYLOAD_TOO_LARGE (413, "Payload Too Large"),
|
|
URI_TOO_LONG (414, "URI Too Long"),
|
|
UNSUPPORTED_MEDIA_TYPE (415, "Unsupported Media Type"),
|
|
UNPROCESSABLE_ENTITY (422, "Unprocessable Entity"),
|
|
TOO_MANY_REQUESTS (429, "Too Many Requests"),
|
|
|
|
// 5xx
|
|
INTERNAL_SERVER_ERROR (500, "Internal Server Error"),
|
|
NOT_IMPLEMENTED (501, "Not Implemented"),
|
|
BAD_GATEWAY (502, "Bad Gateway"),
|
|
SERVICE_UNAVAILABLE (503, "Service Unavailable"),
|
|
GATEWAY_TIMEOUT (504, "Gateway Timeout");
|
|
|
|
private static final int MAX_STATUS_CODE = 504;
|
|
private static final byte[][] INDEX = new byte[MAX_STATUS_CODE + 1][];
|
|
|
|
static {
|
|
for (HttpStatus s : values()) {
|
|
INDEX[s.code] = s.bytes;
|
|
}
|
|
}
|
|
|
|
private final int code;
|
|
private final byte[] bytes;
|
|
|
|
HttpStatus(int code, String reason) {
|
|
this.code = code;
|
|
this.bytes = (code + " " + reason).getBytes(StandardCharsets.UTF_8);
|
|
}
|
|
|
|
/** * Returns pre-compiled status bytes for the given code.
|
|
* Access is O(1) and generates zero garbage.
|
|
*/
|
|
public static byte[] bytesForCode(int code) {
|
|
if (code >= 0 && code <= MAX_STATUS_CODE) {
|
|
return INDEX[code];
|
|
}
|
|
return null;
|
|
}
|
|
} |