48 lines
2.3 KiB
Java
48 lines
2.3 KiB
Java
package dev.relism.http;
|
|
|
|
import lombok.Getter;
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
@Getter
|
|
public enum HttpMethod {
|
|
GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD, TRACE, CONNECT, PURGE;
|
|
|
|
private static final HttpMethod[] VALUES = values();
|
|
private final byte[] bytes;
|
|
|
|
HttpMethod() {
|
|
this.bytes = this.name().getBytes(StandardCharsets.UTF_8);
|
|
}
|
|
|
|
/**
|
|
* Resolves the HttpMethod from a byte buffer segment using O(1) dispatch.
|
|
* Extremely fast, zero allocations, branch-prediction friendly.
|
|
*/
|
|
public static HttpMethod fromBytes(byte[] buf, int off, int len) {
|
|
if (len == 0) return null;
|
|
|
|
return switch (buf[off]) {
|
|
case 'G' -> (len == 3 && buf[off + 1] == 'E' && buf[off + 2] == 'T') ? GET : null;
|
|
case 'P' -> {
|
|
if (len == 3 && buf[off + 1] == 'U' && buf[off + 2] == 'T') yield PUT;
|
|
if (len == 4 && buf[off + 1] == 'O' && buf[off + 2] == 'S' && buf[off + 3] == 'T') yield POST;
|
|
if (len == 5 && buf[off + 1] == 'A' && buf[off + 2] == 'T' && buf[off + 3] == 'C' && buf[off + 4] == 'H') yield PATCH;
|
|
if (len == 5 && buf[off + 1] == 'U' && buf[off + 2] == 'R' && buf[off + 3] == 'G' && buf[off + 4] == 'E') yield PURGE;
|
|
yield null;
|
|
}
|
|
case 'D' -> (len == 6 && buf[off + 1] == 'E' && buf[off + 2] == 'L' && buf[off + 3] == 'E' && buf[off + 4] == 'T' && buf[off + 5] == 'E') ? DELETE : null;
|
|
case 'O' -> (len == 7 && buf[off + 1] == 'P' && buf[off + 2] == 'T' && buf[off + 3] == 'I' && buf[off + 4] == 'O' && buf[off + 5] == 'N' && buf[off + 6] == 'S') ? OPTIONS : null;
|
|
case 'H' -> (len == 4 && buf[off + 1] == 'E' && buf[off + 2] == 'A' && buf[off + 3] == 'D') ? HEAD : null;
|
|
case 'T' -> (len == 5 && buf[off + 1] == 'R' && buf[off + 2] == 'A' && buf[off + 3] == 'C' && buf[off + 4] == 'E') ? TRACE : null;
|
|
case 'C' -> (len == 7 && buf[off + 1] == 'O' && buf[off + 2] == 'N' && buf[off + 3] == 'N' && buf[off + 4] == 'E' && buf[off + 5] == 'C' && buf[off + 6] == 'T') ? CONNECT : null;
|
|
default -> null;
|
|
};
|
|
}
|
|
|
|
//Only to be used for debugging/logging purposes, never in the hot path.
|
|
@Override
|
|
public String toString() {
|
|
return new String(bytes, StandardCharsets.UTF_8);
|
|
}
|
|
}
|