2017-12-22 42 views
0

golang의 net/http 패키지가 청크 분할 전송 인코딩으로 요청을 지원합니까? 지금까지 나는 Hijacker 인터페이스 (https://golang.org/src/net/http/server.go?s=6173:6875#L156)를 사용하여 적어도 연결을 닫지 않고 전체 청크 요청을 수신 할 수 있었지만 아직 청크를 구문 분석하지 않았으므로 잘못된 경로를 따라갈 수 있습니다.청크 분할 전송 코드로 처리 요청

https://golang.org/src/net/http/httputil/httputil.go?s=688:732#L10에서 청크가있는 독자가 있지만 내부 용으로 보입니다.

본질적으로 '청크 분할'전송 인코딩으로 HTTP PUT을 수락하고 '즉시'백엔드 서버로 전송하려고합니다 (즉, golang에서 전체 요청을 버퍼링하지 않고). 나는 업스트림 요청에 대한 제어권이 없다. 그러한 요청을 처리하는 데 권장되는 방법이 있습니까, 아니면 Hijacker가이를 수행하는 방법입니까?

답변

3

net/http 클라이언트와 서버는 청크 분할 본을 투명하게 읽고 씁니다.

청크 요청을 받아 들여 다른 HTTP 서버로 보내려면 서버 요청 본문을 클라이언트 요청 본문으로 전달하십시오. 여기에 PUT으로 다른 서버로 몸을 전달하는 지금의 :

func handler(w http.ResponseWriter, r *http.Request) { 
    creq, err := http.NewRequest("PUT", url, r.Body) 
    if err != nil { 
     // handle error 
    } 
    if ct := r.Header.Get("Content-Type"); ct != "" { 
     creq.Header.Set("Content-Type", ct) 
    } 
    cresp, err := http.DefaultClient.Do(creq) 
    if err != nil { 
     // handle error 
    } 
    ... do something with cresp. 
} 

파일로 복사 할 경우, io.Copy 파일에 요청 본문.

func handler(w http.ResponseWriter, r *http.Request) { 
    f, err := os.Create("fname") 
    if err != nil { 
     // handle error 
    } 
    _, err := io.Copy(f, r.Body) 
    if err != nil { 
      // handle error 
    } 
    ... 
    } 

이 스 니펫은 본문을 즉시 복사합니다.

+0

와우, 이것은 훨씬 간단합니다. - 감사합니다! 그리고 처음에 파일에 쓰고 싶다면? –