개요

지난 글을 읽은 것을 전제로 하고 있습니다. 지난 글를 읽고 와 주시면 감사하겠습니다. 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 bytesstr의 직렬화/역직렬화만 필요합니다. 스펙에 그렇게 정의되어 있기 때문입니다.
  • Charset 관련 정보 : 헤더 이름의 인코딩 방식은 정해져 있습니다(ascii). 모든 헤더 값 인코딩 방식은 정해지진 않았지만, 저희가 처리할 위 헤더들은 정해져 있습니다.

결론 : 최종적으로 처리할 헤더

최종적으로 다음과 같은 헤더 처리가 필요합니다.

  • Connection
  • Keep-Alive
  • Host
  • Content-Length
  • Transfer-Encoding
  • Upgrade

참조

마무리

프로젝트는 여기서 개발되고 있습니다. 관심 있으신 분들은 이슈나 PR 주시면 감사하겠습니다.