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();

        int readLimit = Math.min(buffer.remaining(), HTTP_HEADER_LENGTH);
        byte[] headerBytes = new byte[readLimit];
        buffer.get(headerBytes);

        // 버퍼의 위치를 원래대로 되돌림
        buffer.reset();

        String prefix = new String(headerBytes, StandardCharsets.UTF_8);

        if (HTTP_METHODS.stream().anyMatch(prefix::startsWith)) {
            return "HTTP/1.1";
        }

        return "UNKNOWN";
    }
}