LabHub
배우기 러닝패스 코스

SSE — 서버가 먼저 말하는 법 · 재접속했더니 3분이 비어 있었다 · 실습

명세대로 파서를 만든다

LabHub 에서 이어서 보기

목표

WHATWG HTML 표준의 이벤트 스트림 파싱 규칙을 직접 구현하고, 그 위에
재접속으로 이어 받는 장치를 올립니다.

왜 중요한가

SSE 는 "그냥 HTTP" 라서 라이브러리 없이도 쓸 수 있습니다. 그래서 실무에서는
split("\n\n") 한 줄짜리 파서가 아주 흔하고, 그 파서는 조각으로 나뉘어
도착하는 입력에서 곧바로 무너집니다. TCP 는 여러분이 보낸 단위로 도착하는 것을
보장하지 않기 때문입니다.

이어 받기는 더합니다. id 버퍼가 이벤트마다 초기화되는지 아닌지, 잘린 마지막
이벤트를 내보내는지 아닌지에 따라 재접속 뒤 화면이 비거나 겹칩니다. 규칙은
명세에 다 적혀 있고, 이 실습은 그 규칙을 코드로 옮기는 일입니다.

만들 것

/root/work/resume/client.py 에서 아래를 제공합니다.

| 이름 | 계약 |
|---|---|
| StreamParser | feed(조각) → 이번에 완성된 이벤트 목록. last_event_id · reconnection_time 속성 |
| replay(events, last_event_id) | 서버 쪽 되돌림 창 — 그 id 를 돌려준다 |
| resume_headers(parser) | 재접속 때 실을 헤더 딕셔너리 |

이벤트 하나는 딕셔너리입니다: {"event": ..., "data": ..., "id": ...}.

단계

1. 조각과 줄 끝 — feed 가 아무 데서나 잘려도 같은 결과
2. 필드 규칙 — 주석 · 콜론 없는 줄 · data 이어 붙이기
3. id 버퍼는 초기화되지 않는다
4. retry 는 ASCII 숫자일 때만
5. 되돌림 창 — replay
6. 재접속 헤더 — resume_headers
7. 직접 재서 적기 — /root/work/resume/07-gap.txt
8. 정리 — /root/work/resume/08-notes.md

참고

단계 8개

  1. 조각과 줄 끝
  2. 필드 규칙
  3. id 버퍼와 마지막 id 문자열
  4. retry 는 ASCII 숫자일 때만
  5. 서버 쪽 되돌림 창
  6. 재접속 헤더
  7. 잘린 이벤트를 직접 재 본다
  8. 무엇이 빈 자리를 막았나