Golang net/http包 client浅尝(一)

背景

了解一下,Go的client是怎么使用TCP链接的。

client 包 一次完整请求

client使用


http.Client{
		Transport: &http.Transport{
			DialContext: (&net.Dialer{
				Timeout:   30 * time.Second, //连接超时时间
				KeepAlive: 30 * time.Second, //连接保持超时时间
				DualStack: true, //
			}).DialContext,
			MaxIdleConnsPerHost:   2,//每个host 最大空闲链接数
			MaxIdleConns:          100, //client对与所有host最大空闲连接数总和
			IdleConnTimeout:       90 * time.Second, //空闲连接在连接池中的超时时间
			TLSHandshakeTimeout:   10 * time.Second, //TLS安全连接握手超时时间
			ExpectContinueTimeout: 1 * time.Second, //发送完请求到接收到响应头的超时时间
		},
		//总的超时时间
		Timeout: serv.GetTotalTimeout(),
	}.Do(req)

发起流程

Do

func (c *Client) Do(req *Request) (*Response, error) {
	//...
	for {
        //首次不会进入,如果需要重定向,会进入
		if len(reqs) > 0 {
			//...
		}

		reqs = append(reqs, req)
		var err error
		var didTimeout func() bool
		
		// 调用send
		if resp, didTimeout, err = c.send(req, deadline); err != nil {
			if !deadline.IsZero() && didTimeout() {
				err = &httpError{
					err:     err.Error() + " (Client.Timeout exceeded while awaiting headers)",
					timeout: true,
				}
			}
			return nil, uerr(err)
		}

		//检查是否需要重定向,如果不需要直接返回
		var shouldRedirect bool
		redirectMethod, shouldRedirect, includeBody = redirectBehavior(req.Method, resp, reqs[0])
		if !shouldRedirect {
			return resp, n
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值