Go의 net/http Celient 구조 옵션

12704 단어 Gohttpclienttech

Celient 구조

  • 네트워크/http에서 요청을 생성할 때 Celient 구조 사용
  • https://pkg.go.dev/net/http#Client
  • 이 구조체에 전달해야 하는 옵션은 다음과 같다.
  • Transport
  • CheckRedirect
  • Jar
  • Timeout
  • type Client struct {
    	Transport RoundTripper
    	CheckRedirect func(req *Request, via []*Request) error
    	Jar CookieJar
    	Timeout time.Duration
    }
    

    Transport

  • 이 필드는 RoundTripper interface
  • 입니다.
  • 사실 RoundTrip 방법만 설치하면 전달할 수 있다
  • type RoundTripper interface {
    	RoundTrip(*Request) (*Response, error)
    }
    

    default의 Transport

  • 예: http.Get의 경우
  • DefaultClient 사용
  • 최종 Do가 호출되고send에DefaultTransport 설정
  • https://pkg.go.dev/net/http#RoundTripper
  • https://cs.opensource.google/go/go/+/master:src/net/http/transport.go
  • var DefaultTransport RoundTripper = &Transport{
    	Proxy: ProxyFromEnvironment,
    	DialContext: (&net.Dialer{
    		Timeout:   30 * time.Second,
    		KeepAlive: 30 * time.Second,
    	}).DialContext,
    	ForceAttemptHTTP2:     true,
    	MaxIdleConns:          100,
    	IdleConnTimeout:       90 * time.Second,
    	TLSHandshakeTimeout:   10 * time.Second,
    	ExpectContinueTimeout: 1 * time.Second,
    }
    

    Proxy

  • ProxyFromEnvironment에서 설정
  • func ProxyFromEnvironment(req *Request) (*url.URL, error) {
    	return envProxyFunc()(req.URL)
    }
    
  • 환경 변수의 HTTPPROXY에서 획득
  • func FromEnvironment() *Config {
    	return &Config{
    		HTTPProxy:  getEnvAny("HTTP_PROXY", "http_proxy"),
    		HTTPSProxy: getEnvAny("HTTPS_PROXY", "https_proxy"),
    		NoProxy:    getEnvAny("NO_PROXY", "no_proxy"),
    		CGI:        os.Getenv("REQUEST_METHOD") != "",
    	}
    }
    

    DialContext

  • Dialer에서 DialContext 생성
  • Timeout 및 Keeplive 설정용
  • type Dialer struct {
    	Timeout time.Duration
    	Deadline time.Time
    	LocalAddr Addr
    	DualStack bool
    	FallbackDelay time.Duration
    	KeepAlive time.Duration
    	Resolver *Resolver
    	Cancel <-chan struct{}
    	Control func(network, address string, c syscall.RawConn) error
    }
    
    func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error) 
    
    type Conn interface {
    	Read(b []byte) (n int, err error)
    	Write(b []byte) (n int, err error)
    	Close() error
    	LocalAddr() Addr
    	RemoteAddr() Addr
    	SetDeadline(t time.Time) error
    	SetReadDeadline(t time.Time) error
    	SetWriteDeadline(t time.Time) error
    }
    

    ForceAttemptHTTP2

  • http2를 사용하는 표지
  • Default에서 사실이기 때문에 유효화
  • MaxIdleConns

  • IdleConnection 기본 설정 100
  • 접속 풀 최대
  • IdleConnTimeout

  • 90초 풀의 연결 Timeout
  • 90 * time.Second
  • TLSHandshakeTimeout

  • https://engineers.fenrir-inc.com/entry/2018/11/12/153859
  • TLS 핸드셰이크의 Timeout 설정
  • 10초
  • 로 설정

    ExpectContinueTimeout

  • https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Expect
  • Expect 제목 설정을 통해 서버 측에 선택의 여지 제공
  • 우리는 수신자 클라이언트에게 이 요청으로 (대규모일 수도 있음) 편지의 본문을 보낼 것을 통지하고 100 (Continue) 임시 응답을 받기를 희망합니다.

    좋은 웹페이지 즐겨찾기