RFC 2324 구현으로 배우는 HTTP 스택과 테스트 전략

by DD
3개월 전
조회수 20

1998년 4월 1일에 발표된 HTCPCP(Hyper Text Coffee Pot Control Protocol)는 커피 포트를 네트워크로 제어하는 프로토콜로, HTTP를 확장

BREW, WHEN, PROPFIND 등의 새로운 HTTP 메서드와 Accept-Additions 헤더, coffee:// URI 스킴을 정의하며, 418 I'm a teapot와 같은 독특한 에러 코드를 포함

418 에러 코드는 개발자 커뮤니티에서 널리 사용되며, IANA 레지스트리에서 삭제하려는 시도에 대한 반발이 있었을 정도로 개발자들에게 상징적인 의미를 가짐

저자는 HTCPCP를 실제로 구현하며, HTTP 스택의 동작 방식, 상태 머신 모델링, 테스트 전략 등 다양한 기술적 교훈을 얻었다고 설명

HTCPCP의 핵심: HTTP 메서드와 헤더

HTCPCP는 기존 HTTP를 확장하여 커피 포트 제어를 위한 새로운 메서드와 헤더를 정의한다.

BREW(POST): 커피를 내리는 행위를 트리거하며, Accept-Additions 헤더를 통해 우유, 시럽, 술 등의 추가 옵션을 지정

WHEN: 우유 붓기를 중단하는 요청으로, 클라이언트가 언제 중단할지 서버에 알림

PROPFIND: 사용 가능한 추가 옵션을 나열

Accept-Additions 헤더는 다양한 추가 옵션을 지원하지만, 디카페인 옵션은 의도적으로 제외되었다. 이러한 설계는 RFC 2324의 유머러스한 특징을 보여준다.

FastAPI와 Raw TCP 서버의 선택

저자는 HTCPCP 구현을 위해 FastAPI와 raw asyncio TCP 서버를 모두 사용했다. uvicorn은 IANA에 등록되지 않은 메서드를 거부하므로, BREW, WHEN, PROPFIND를 처리하기 위해 raw TCP 서버가 필요했다.

FastAPI: 테스트 스위트(Test Suite) 구축에 활용, TestClient를 통해 HTTP transport layer를 우회하여 커스텀 메서드 테스트

Raw TCP 서버: HTCPCP의 고유한 프로토콜을 구현하기 위한 핵심, HTTP/1.1 파서(Parser)를 직접 구현하여 모든 유효한 RFC 7230 토큰을 메서드로 허용

결과적으로 FastAPI는 유효성 검사 및 스키마 이점을 제공하고, raw TCP 서버는 HTCPCP 프로토콜의 본질을 구현하는 데 기여한다.

상태 머신(State Machine) 기반의 아키텍처

HTCPCP는 커피 포트의 상태를 모델링하기 위해 상태 머신(State Machine)을 사용한다. IDLE, BREWING, POURING_MILK, READY 상태를 정의하고, 각 상태 간의 전환을 명확하게 관리한다.

PotType(Enum): COFFEE와 TEAPOT을 정의하여, TEAPOT의 경우 418 에러 반환

PotStatus(Enum): IDLE, BREWING, POURING_MILK, READY 상태를 정의

CoffeePot(Dataclass): id, pot_type, capacity, level, status, varieties, brew_history를 포함

WHEN 메서드는 클라이언트가 우유 붓기를 중단하도록 요청하는 기능으로, 상태 머신의 중요한 부분이다.

Accept-Additions 헤더 파싱 및 유효성 검사

Accept-Additions 헤더는 커피에 추가할 수 있는 옵션을 지정하며, 파싱 및 유효성 검사를 통해 잘못된 요청을 처리한다.

parse_accept_additions 함수: 헤더 문자열을 파싱하여 딕셔너리 형태로 변환

validate_additions 함수: 디카페인 옵션(decaf)이 포함된 경우 406 에러 반환, 지원되지 않는 추가 옵션에 대한 유효성 검사 수행

이러한 유효성 검사는 RFC 2324의 요구 사항을 준수하며, 잘못된 요청을 방지하고 서버의 안정성을 높인다.

HTCPCP의 테스트 전략

HTCPCP 구현은 다양한 테스트 케이스를 통해 검증된다. 특히, 418 에러, 디카페인 옵션 거부, WHEN 메서드 동작 등, 엣지 케이스(Edge Case)에 대한 테스트가 중요하다.

test_teapot_cannot_brew: TEAPOT에 BREW 요청 시 418 에러 반환 확인

test_decaf_is_not_acceptable: 디카페인 옵션 사용 시 406 에러 반환 확인

test_when_stops_milk: WHEN 메서드 호출 시 우유 붓기 중단 확인

이러한 테스트는 HTCPCP의 정확한 동작을 보장하고, 시스템의 안정성을 높이는 데 기여한다.

Stop Ignoring RFC 2324. It's the Most Important Protocol You've Never Implemented.

댓글 0

첫 번째 댓글을 남겨보세요!