http2: request body larger than specified content length

在使用golang发送POST请求的时候,由于需要发送数据,所以需要使用mime/multipart包,不过在某次测试的时候出现了下面的错误

http2: request body larger than specified content length

很明显可以判断出错误的原因,但是错误在哪并不是很清楚,后来debug了一段时间之后,发现将创建的request返回之后,所得到的req.Body字段和之前有所不同,增加了一段内容,后来发现是因为用来写入body的writer并没有关闭,使得创建的requestContentLength字段和Body中的长度不同导致,在multipart源码中我们可以看到Close函数的源码

func (w *Writer) Close() error {
	if w.lastpart != nil {
		if err := w.lastpart.close(); err != nil {
			return err
		}
		w.lastpart = nil
	}
	_, err := fmt.Fprintf(w.w, "\r\n--%s--\r\n", w.boundary)
	return err
}

在关闭writer之后,还会写入最后的一个boundary,如果在创建Request之前进行调用,那么其中的Request.ContentLength字段会少一段最后写入的内容长度,所以writer必须在NewRequest之前调用,否则会出现上述错误

正确示例

if err := writer.Close(); err != nil{
		return nil, err
	}
	
req, err := http.NewRequest("POST", url, &buff)
if err != nil {
	fmt.Println(err)
	return nil, err
}

错误示例

// 或者在创建Request之后关闭,都会出现错误!!!
defer writer.Close()
req, err := http.NewRequest("POST", url, &buff)
if err != nil {
	fmt.Println(err)
	return nil, err
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值