Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

curl 오류 18? 재시도·재개 전에 누락 바이트를 증명하세요

CURLE_PARTIAL_FILE은 실제 전송 크기가 상대가 먼저 알린 크기와 달랐다는 뜻입니다. 부분 파일, 응답 헤더, 추적을 보존하고 프레이밍·프로토콜·중간 경로를 분리한 뒤 새 전송 또는 검증자 기반 재개를 선택하세요.

중단된 전송 터미널과 네트워크 장비를 보여 주는 원본 편집 이미지.
원본 일러스트: 재시도나 프로토콜을 바꾸기 전에 부분 파일과 첫 추적을 보존하세요. Watch at Ease

curl 오류 18은 전송 크기 불일치의 증거이지 하나의 네트워크 원인을 확정하는 진단명이 아닙니다. curl 프로젝트는 CURLE_PARTIAL_FILE을 미리 보고된 크기보다 짧거나 긴 전송으로 정의합니다.

첫 부분 파일을 덮어쓰거나 자동 재시도를 켜지 마세요. 응답 프레이밍, 수신 바이트, 표현의 정체성을 기록한 뒤 서버, 프록시, 프로토콜, 클라이언트 경로를 하나씩 시험합니다.

1. 첫 실패 증거를 고정하세요

부분 출력을 고유한 증거 파일로 옮기고 바이트 수와 해시를 기록합니다. curl 버전과 기능, 비밀을 제거한 명령, 시작·종료 시각, 종료 코드, URL, 프록시 경로, 래퍼나 CI 사용 여부도 저장합니다.

새 출력으로 한 번만 증거를 수집하고 응답 헤더와 시간 표시 추적을 따로 보관합니다. Authorization, Cookie, 서명 쿼리, 인증서는 반드시 가립니다.

2. 네트워크보다 프레이밍을 먼저 읽으세요

HTTP/1.1의 최종 Transfer-Encoding이 chunked라면 0 크기 종료 청크가 필요합니다. Transfer-Encoding이 없고 Content-Length가 유효하면 그 값이 기대 본문 바이트 수이며, 도달 전 연결 종료는 RFC 9112상 불완전합니다.

gzip·br는 콘텐츠 인코딩이고 chunked는 전송 프레이밍입니다. Accept-Encoding이나 HTTP 버전 변경은 분기를 비교할 수 있지만 잘못된 길이, 원본 프로세스 중단, 중간 장비 고장을 자체 해결하지 않습니다.

3. 한 번에 경계 하나만 바꾸세요

매번 새 출력에 기록하면서 원본 직결과 CDN, IPv4와 IPv6, HTTP/1.1과 HTTP/2·3, 압축과 identity 중 하나만 바꿉니다. 상태, 최종 URL, 프로토콜, 선언 길이, 수신량, 종료 코드, 해시를 남깁니다.

한 경로의 성공은 다른 경로의 안전을 증명하지 않습니다. 원본은 성공하고 프록시만 잘린다면 두 추적을 보존하고, 모두 같은 바이트에서 멈추면 앱, 상류 시간 제한, Content-Length 생성, 저장소 읽기를 점검합니다.

4. 부분 바이트를 사용할 수 있는지 결정하세요

200 상태만으로 승인하지 마세요. curl 종료 0, 프레이밍 또는 기대 바이트 완료, 게시자 체크섬·서명·압축 검사·응용 파서 같은 무결성 신호가 모두 필요합니다.

API는 부작용도 확인합니다. 비멱등 POST는 서버에서 처리된 뒤 응답만 잘릴 수 있습니다. 재전송 전에 멱등 키, 거래 ID 또는 상태 API를 확인하세요.

5. 계약이 증명될 때만 재개하세요

서버가 필요한 byte range를 지원하고 ETag 또는 Last-Modified로 같은 표현임을 확인할 때만 재개합니다. 예상 부분 상태와 범위가 오는지도 확인합니다.

검증자가 없거나 약하거나 바뀌면 새 대상에서 다시 시작하고 맹목적으로 이어 쓰지 마세요. 종료 코드, 프레이밍, 바이트 수, 무결성이 통과하고 실패 경로도 수정 또는 제외되어야 종료입니다.

HTTP 헤더, 바이트 수와 체크섬을 비교하는 엔지니어의 원본 편집 이미지.
원본 일러스트: 승인 또는 재개 전에 프레이밍, 수신량과 표현 정체성을 확인하세요. Watch at Ease