HttpExchange
HttpExchange (HTTP 요청·응답 교환)
한 번의 교환에서 수신된 HTTP 요청과 생성될 응답을 함께 캡슐화하는 추상 클래스입니다. 클라이언트의 요청을 검사하고 응답을 구성·전송하는 메서드를 제공해요. AutoCloseable과 Request를 구현합니다.
본문
com.sun.net.httpserver에서 HTTP 요청 하나를 처리하는 핵심 객체입니다. 전형적인 생명주기는 다음과 같습니다.
getRequestMethod()로 명령을 확인한다.getRequestHeaders()로 요청 헤더를 검사한다(필요할 때).getRequestBody()가 요청 본문을 읽을InputStream을 반환하면, 본문을 읽은 뒤 그 스트림을 닫는다.getResponseHeaders()로 content-length를 제외한 응답 헤더를 설정한다.sendResponseHeaders(int, long)로 응답 헤더를 전송한다. 다음 단계 전에 반드시 호출해야 한다.getResponseBody()로 응답 본문을 보낼OutputStream을 얻고, 본문을 쓴 뒤 스트림을 닫아 교환을 종료한다.
교환 종료
교환은 요청 InputStream과 응답 OutputStream이 모두 닫힐 때 종료됩니다. OutputStream을 닫으면(아직 닫히지 않았다면) InputStream도 묵시적으로 닫혀요. 다만 InputStream을 닫기 전에 모든 데이터를 소비하는 것이 권장됩니다. 편의 메서드 close()가 이러한 작업을 모두 수행합니다. 요청 본문을 모두 소비하지 않고 교환을 닫는 것은 오류가 아니지만, 이후 교환에서 기본 TCP 연결을 사용하지 못하게 만들 수 있어요. 교환을 종료하지 못하면 결과가 정의되어 있지 않지만, 보통 리소스가 해제·재사용되지 못하는 결과가 발생합니다.
주요 메서드
- 요청 검사:
getRequestMethod(),getRequestURI(),getRequestHeaders()(불변Headers),getRequestBody(),getProtocol()(protocol/major.minor 형식),getRemoteAddress(),getLocalAddress(),getHttpContext(),getPrincipal()(소유 컨텍스트에 인증기가 설정된 경우 인증된 사용자를 나타내는HttpPrincipal반환). - 응답 전송:
getResponseHeaders(),sendResponseHeaders(int rCode, long responseLength),getResponseBody(),getResponseCode(). - 기타:
getAttribute(String)/setAttribute(String, Object)(필터 모듈끼리의 대역외 통신용),setStreams(InputStream, OutputStream),close().