> 백엔드 개발 > Golang > `json.NewDecoder().Decode()`가 HTTP 컨텍스트 기한을 준수하지 않는 이유는 무엇입니까?

`json.NewDecoder().Decode()`가 HTTP 컨텍스트 기한을 준수하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-29 09:34:29
원래의
739명이 탐색했습니다.

Why doesn't `json.NewDecoder().Decode()` respect HTTP Context Deadlines?

json.NewDecoder().Decode()

질문:

에서 HTTP 컨텍스트 마감 기한을 무시했습니다. 🎜>context.WithTimeout을 사용하여 HTTP 요청에 대한 시간 제한을 설정할 때 ioutil.ReadAll 메서드는 요청을 중단하고 시간 초과가 초과되면 적절한 오류를 반환합니다. 그러나 json.NewDecoder(resp.Body).Decode는 마감일을 무시하고 context.DeadlineExceeded 대신 nil 오류를 반환하는 것으로 보입니다. 이것은 버그입니까?

답변:

아니요, 이것은 버그가 아닙니다. net/http 패키지는 요청을 처리하기 위해 버퍼를 활용하므로 프로그램이 응답 본문을 읽기 전에 응답 본문의 일부 또는 전체를 버퍼로 읽을 가능성이 있습니다. 결과적으로 만료되는 컨텍스트로 인해 프로그램이 읽기 작업을 완료하는 것이 반드시 방해되는 것은 아닙니다.

예:

의도적으로 응답을 지연시키는 수정된 HTTP 테스트 서버를 고려해 보세요. readDoesntFail을 사용하는 경우 서버는 부분 응답(10바이트)을 보내고 플러시한 후 나머지를 보내기 전에 6초를 기다립니다.

ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    s := []byte(`{"ip":"12.34.56.78"}`)
    w.Write(s[:10])
    if f, ok := w.(http.Flusher); ok {
        f.Flush()
    }
    time.Sleep(time.Second * 6)
    w.Write(s[10:])}))
defer ts.Close()
로그인 후 복사
이 시나리오에서 json.Decoder.Decode()는 읽기를 시도합니다. 데이터가 아직 버퍼링되지 않았기 때문에 연결에서 발생합니다. 컨텍스트가 만료되면 연결에서 추가로 읽으면 context.DeadlineExceeded 오류가 트리거됩니다.

결론:

json.Decoder.Decode()는 다음과 같은 경우 컨텍스트 최종 기한을 준수합니다. 데이터가 아직 버퍼링되지 않았습니다. 그러나 데이터가 부분적으로 또는 완전히 버퍼링된 경우 컨텍스트 최종 기한으로 인해 프로그램이 읽기 작업을 완료하지 못할 수 있습니다. 컨텍스트 기한에 따라 보다 일관된 동작을 위해 ioutil.ReadAll 또는 유사한 접근 방식을 사용하는 것이 좋습니다.

위 내용은 `json.NewDecoder().Decode()`가 HTTP 컨텍스트 기한을 준수하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿