개요
지난 글을 읽은 것을 전제로 하고 있습니다. 지난 글를 읽고 와 주시면 감사하겠습니다. ASGI 서버는 애플리케이션을 실행하는 역할만 하므로, 모든 헤더 처리를 위임해도 괜찮을 것 같지만 일부 헤더는 ASGI 서버에서 처리가 필요합니다. 그렇다면 어떤 헤더를 처리해야 할까요?
어떤 헤더를 처리할까?
ASGI 서버의 목적
- 애플리케이션 서빙
- 컨텐츠를 다룰 필요는 없음
- 표준화된 형태로 요청/응답 직렬화/역직렬화
- 소켓 관리 및 흐름 제어(필요하다면) 어떤 헤더를 처리할지 정하기 전에 ASGI 서버의 목적부터 다시 생각해보겠습니다. ASGI 서버는 비즈니스 로직을 실행하지 않고, 클라이언트와 연결을 수립하고 데이터를 역직렬화해서 애플리케이션에 전달하고, 애플리케이션의 실행 결과를 받아서 직렬화한 후 전달하는 역할을 합니다. 그 이외의 헤더는 애플리케이션의 책임입니다.
처리할 헤더
그렇다면 결론적으로 다음과 같은 헤더 처리가 필요합니다.
- 연결 관련 헤더 : 직접 소켓 연결을 처리하기 때문에 필요합니다.
Connection
헤더와Keep-Alive
헤더 처리가 필요합니다. - 길이 헤더 : 소켓에서 정확한 만큼만 읽고 쓰기 위해 필요합니다.
Content-Length
헤더가 되겠습니다. - 스트리밍 헤더 : ASGI가 도입된 가장 큰 이유 중 하나입니다. (구체적인 설명이 필요하다면 이 글을 참조해주세요) ASGI 스펙 상에서
Recieve
콜백 응답 중more_body
항목이 직접적으로 연관되어 있습니다.Transfer-Encoding
헤더가 되겠습니다. - 프로토콜 전환 : 프로토콜에 따라서 인코딩/디코딩 방식이 달라지기 때문에 인코딩/디코딩 방식을 결정하기 위해 필요합니다.
Upgrade
헤더가 되겠습니다. - Host :
Scope
에서 직접적으로 필요로 하기 때문에 필요합니다. HTTP/1.1의 유일한 필수 헤더이기도 합니다.
처리하지 않는 헤더
아래 헤더들은 처리해야 하는 것으로 보일 수 있지만 아닙니다.
Content-Type
: 직렬화/역직렬화 이야기 때문에 필요해보일 수 있지만, 페이로드 직렬화/역직렬화Python
bytes
나str
의 직렬화/역직렬화만 필요합니다. 스펙에 그렇게 정의되어 있기 때문입니다.- Charset 관련 정보 : 헤더 이름의 인코딩 방식은 정해져 있습니다(ascii). 모든 헤더 값 인코딩 방식은 정해지진 않았지만, 저희가 처리할 위 헤더들은 정해져 있습니다.
결론 : 최종적으로 처리할 헤더
최종적으로 다음과 같은 헤더 처리가 필요합니다.
Connection
Keep-Alive
Host
Content-Length
Transfer-Encoding
Upgrade
참조
마무리
프로젝트는 여기서 개발되고 있습니다. 관심 있으신 분들은 이슈나 PR 주시면 감사하겠습니다.