HttpProtocolDetector.java
package sprout.server.builtins;
import sprout.beans.annotation.Component;
import sprout.server.ProtocolDetector;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Set;
@Component
public class HttpProtocolDetector implements ProtocolDetector {
private static final int HTTP_HEADER_LENGTH = 8;
private static final Set<String> HTTP_METHODS = Set.of(
"GET ", "POST ", "PUT ", "DELETE ", "HEAD ", "OPTIONS ", "PATCH ", "TRACE "
);
@Override
public String detect(ByteBuffer buffer) throws Exception {
// 버퍼의 현재 위치를 기록
buffer.mark();
// 전체 헤더 읽기 (WebSocket 감지를 위해)
byte[] fullHeaderBytes = new byte[buffer.remaining()];
buffer.get(fullHeaderBytes);
// 버퍼의 위치를 원래대로 되돌림
buffer.reset();
String fullHeader = new String(fullHeaderBytes, StandardCharsets.UTF_8);
// HTTP 메서드 체크
if (!HTTP_METHODS.stream().anyMatch(fullHeader::startsWith)) {
return "UNKNOWN";
}
System.out.println("full header is " + fullHeader);
// WebSocket Upgrade 요청은 UNKNOWN 반환 (WebSocketProtocolDetector가 처리하도록)
if (fullHeader.contains("Upgrade: websocket") ||
fullHeader.contains("Upgrade: WebSocket")) {
return "UNKNOWN";
}
return "HTTP/1.1";
}
}