2016-10-27 2 views
2

db에서 스트리밍되는 많은 양의 데이터를 리턴하는 엔드 포인트가있는 http 서버가 있습니다. 응답이 청크 (< Transfer-Encoding: chunked)입니다. 하지만 나는 공황을 원하지 않는net/http를 사용하여 chunked를 깨는 방법?

curl: (18) transfer closed with outstanding read data remaining 

- 난 그냥 간단한 로그 메시지를 원하는 : 그리고 오류로 실행하면 DB를 충돌처럼, 나는 공황을 사용할 수 있습니다 & 컬이 문제가 나에게 경고합니다 . 그리고 내가 recover() 인 경우 컬에 오류가 없으므로 무언가가 깨지는 징후가 없습니다.

공황없이 청크 분할 된 HTTP 응답을 깨는 방법이 있습니까?

답변

3

웹 서버가 공황 상태를 보았을 때 연결이 즉시 닫혀 있기 때문에 오류가 발생합니다. 연결을 강제하기 위해이 panic없이 폐쇄에, 당신은 그것을 공중 납치해야합니다 :

// inside the http handler 
// func(w http.ResponseWriter, r *http.Request) { 

// to abort an HTTP/1.1 response 
if w, ok := w.(http.Hijacker); ok { 
    c, _, err := w.Hijack() 
    if err != nil { 
     log.Println("cannot close connection:", err) 
     return 
    } 
    c.Close() 
    return 
} 
1

이동 1.7 년 (JimB의 대답에 제안 된) 납치 아마 가장 좋은 솔루션입니다. 불행히도 HTTP/1.1에서만 작동합니다. HTTP/2에서는 유용하지 않습니다.

Go 1.8은 새로운 값 ErrAbortHandler을 도입했으며 HTTP 응답 중간 스트림을 방해하는 공식적인 방법은 panic(http.ErrAbortHandler)입니다. 이는 HTTP/1.1 및 HTTP.2 모두에서 작동합니다. 자세한 내용은 issue 17790에 설명되어 있습니다.