All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sam.server.http.context.HttpLauncher Maven / Gradle / Ivy

package org.sam.server.http.context;

import org.sam.server.constant.HttpMethod;
import org.sam.server.context.HandlerInfo;
import org.sam.server.exception.HandlerNotFoundException;
import org.sam.server.http.web.HttpRequest;
import org.sam.server.http.web.HttpResponse;
import org.sam.server.http.web.Request;
import org.sam.server.http.web.Response;

import java.io.IOException;
import java.net.Socket;

/**
 * Request, Response 인스턴스를 만들고 HTTP 요청을 분기합니다.
 *
 * @author hypernova1
 * @see Request
 * @see Response
 */
public class HttpLauncher {

    /**
     * 소켓을 받아 Request, Response 인스턴스를 만든 후 핸들러 혹은 정적 자원을 찾습니다.
     * 
     * @param connect 소켓
     * */
    public static void execute(Socket connect) {
        try {
            Request request = HttpRequest.from(connect.getInputStream());
            if (request == null) {
                return;
            }
            Response response = HttpResponse.of(connect.getOutputStream(), request.getUrl(), request.getMethod());
            findHandler(request, response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 요청 URL을 읽어 핸들러를 찾을지 정적 자원을 찾을지 분기합니다.
     * 
     * @param request 요청 인스턴스
     * @param response 응답 인스턴스
     * */
    private static void findHandler(Request request, Response response) {
        if (isFaviconRequest(request)) {
            response.favicon();
            return;
        }
        if (isResourceRequest(request)) {
            response.staticResources();
            return;
        }

        if (isIndexRequest(request)) {
            response.indexFile();
            return;
        }

        if (isOptionsRequest(request)) {
            response.allowedMethods();
            return;
        }

        try {
            HandlerFinder handlerFinder = HandlerFinder.of(request, response);
            HandlerInfo handlerInfo = handlerFinder.createHandlerInfo();
            HandlerExecutor handlerExecutor = HandlerExecutor.of(request, response);
            handlerExecutor.execute(handlerInfo);
        } catch (HandlerNotFoundException e) {
            response.notFound();
        }
    }

    /**
     * 인덱스 페이지 요청인지에 대한 여부를 반환한다.
     *
     * @param request 요청 정보
     * @return 인덱스 페이지 여부
     * */
    private static boolean isIndexRequest(Request request) {
        return request.getUrl().equals("/") && request.getMethod().equals(HttpMethod.GET);
    }

    /**
     * 파비콘 요청인지에 대한 여부를 반환한다.
     *
     * @param request 요청 정보
     * @return 파비콘 요청 여부
     * */
    private static boolean isFaviconRequest(Request request) {
        return request.getUrl().equals("/favicon.ico");
    }

    /**
     * 정적 자원 요청인지에 대한 여부를 반환한다.
     *
     * @param request 요청 정보
     * @return 정적 자원 요청 여부
     * */
    private static boolean isResourceRequest(Request request) {
        return request.getUrl().startsWith("/resources");
    }

    /**
     * OPTION 요청인지에 대한 여부를 반환한다.
     *
     * @param request 요청 정보
     * @return OPTION 요청 여부
     * */
    private static boolean isOptionsRequest(Request request) {
        return request.getMethod().equals(HttpMethod.OPTIONS);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy