한선씨 HTTP 서버 견고화 — 성경서버 패턴 네트워크.한선 승격 (세션3-웹 1단계)
개요
세션3(웹 풀스택) 첫 단계 "HTTP 서버 견고화"를 완료했다. 핵심 HTTP 함정 3종(부분수신·대형응답 손상·대형응답 지연)을 라이브러리(
네트워크.한선)에서 해결하고, 라이브
성경서버.한선의 요청 라우팅 패턴을 라이브러리로 승격했다. 전 과정 직접·왕복검증(curl).
무엇을 했는지
1. 기존 견고화 헬퍼 왕복검증 (이미 06-17 추가돼 있었으나 미검증)
HTTP헤더읽기(소켓): 헤더끝(\r\n\r\n)까지 TCP 청크 누적 → 6000B 요청헤더가 단일읽기 4095B 캡을 넘겨 끝까지 수신(received_bytes=6094) 확인.
HTTP분할전송(소켓,헤더,본문): 본문 30KB 청크 분할 → 48KB 응답 무손상(Content-Length 일치, 줄길이 일관) 확인.
- VM 사실:
TCP_READ 버퍼 4096B(1회 최대 4095B) → 헤더 누적 루프 필수. TCP읽기 arity=2([fd,최대])인데 라이브 성경서버는 1-arg 사용(함정, 그래도 동작).
2. 성경서버 라우팅 헬퍼 → 네트워크.한선 승격
각 서버가 중복 정의하던 것을 라이브러리로:
경로추출 방식추출 본문추출 경로시작 경로쿼리값 CORS응답
- 응답 헬퍼
JSON응답 HTML전송 에러전송 (HTTP분할전송 기반 + Content-Length, 원본은 누락이었음)
3. 대형응답 지연 4.1s → 0.004s (크기 적응 프레이밍)
- 발견:
바이트수()가 Content-Length 계산에 문자당 글자() 호출(O(n)) → 48KB 응답 4.1초 + GC없는 VM 핸들 누적. --max-time 6 curl 타임아웃이 크래시처럼 보임(서버는 생존).
- 폐기한 우회:
버퍼길이(문자열버퍼(s)) C레벨 O(1) 바이트수 — 단독은 정상이나 HTTP헤더읽기+HTTP분할전송과 함께 쓰면 buf_alloc/버퍼해제가 문자열 풀 핸들을 별칭 무효화 → 응답 0바이트(http 000). 버퍼로 바이트수 금지.
- 채택:
적응전송 — 소형(글자수≤2048)=Content-Length 포함, 대형=Content-Length 생략 + Connection:close + TCP닫기 EOF 프레이밍. 글자수는 C레벨이라 임계판정 무료. 결과 48KB 0.004s, /big×12 전부 200 생존.
관련 파일
- 라이브러리:
/Users/ef/CrownyOS/crownyc/pkg/libs/네트워크.한선 (승격 헬퍼 + 적응전송 + 바이트수 주석)
- 정본 예제:
/Users/ef/CrownyOS/crownyc/apps/예제_HTTP서버_견고.한선 (왕복검증 완료)
- 회귀 테스트:
/Users/ef/CrownyOS/crownyc/tests/네트워크_HTTP견고화.한선 (15/15 PASS)
- 브리프:
/Users/ef/CrownyDoc/projects/세션브리프/세션3-웹.md
- 메모리:
feedback_hanseon_http_content_length(갱신), feedback_hanseon_http_server_traps
회귀/안전성
- 네트워크.한선 단독 컴파일 OK, 라이브 성경서버 컴파일 OK(영향 없음).
- 소비자 HTTP서버.한선/HTTP2.한선은 사전존재 결함(RPN/3layer 조각 혼입, 내 변경 무관)으로 컴파일 실패 — 별도 정리 필요.
- 함수명 충돌 없음(승격 헬퍼명 vs 소비자 자체정의 검사).
잔여 이슈 / 다음 단계
- (선택) 라이브 성경서버.한선을 승격 헬퍼 사용하도록 리팩터(현재 자체 헬퍼로 동작 중, 무중단 위해 보류).
- (VM 레인) 근본해법은
바이트길이 O(1) 빌트인(str_len 노출) — crownyc 리빌드는 컴파일러/VM 세션 협의.
- 사전존재 결함 HTTP서버.한선/HTTP2.한선 정리.
- 세션3 2단계: 브라우저 WASM DOM 바인딩(crowny-wasm + DOM opcode 790~).