最近做了个根据url分析图片信息的demo,其中遇到的几个有意思的问题,发出来分享一下
一.“**http请求返回错误**”
1."stream error: stream ID x; INTERNAL_ERROR"
这种情况需要关闭http2.0,没有找到更好的解决办法
2.“**request canceled**”
timeout这点之前笔者没有在意过,设置超时时间都是简单粗暴的:
````
client := &http.Client{
Timeout:5 * time.Second,
}
````
这样虽然简便,这个相当于一个deadline,不管连接上没连接上,不管成功没成功,5秒后都会被判为超时。
这样就有一个问题,如果我请求一张非常大的图片,即使已经请求成功连接上了,也会因为我们设置的超时时间过短不得已中断请求报出**“request canceled”**,那我们想只要有数据流通就不会中断连接应该怎么做呢
```
transport := &http.Transport{IdleConnTimeout: DefaultConnectTimeout}
client := &http.Client{
Transport: transport,
}
```
这样即使下载速度很慢也不会再下载过程中断开请求。
二.“**ioutil.ReadAll 错误**”
1.“**invalid JPEG format: short Huffman data **”
这种一般是图片不全,比如这种,不知道谁上传的腿毛图片
![MzgyNjMwOF9EU0NfMDAwMS5qcGdfMV8yMDE3MDYyNzE2NDE1NTAwMg.jpg](https://static.studygolang.com/181207/dc7c188b59b371e7e163c71666ed0701.jpg)
这种无效图片go的image包解析会报“ short Huffman data”,暂时没有找到好的解决方案
2.“**EOF**”
这种情况下一般是网络波动错误,轻易不会报的,如果特别频繁的话,可能需要检查一下是不是对url做了某些处理,像笔者就是使用了第三方软件导致频繁报EOF
三.**关于泄露的问题**
自己部署好服务跑了跑,过了几天突然开始报一个奇怪的错误 `dial tcp ip:80: connect: cannot assign requested address`,搜了很长时间不知道是什么错误,问了一下大佬,说是看起来像泄露这方面的错误,于是检查自己的代码,看看是不是有的地方没有关闭。
果不其然,仔细查看后发现如下问题
```
resp, err := config.NoProxyHttpClient.Do(req)
if err != nil {
glog.V(4).Infof("url: %s,http err: %s\n", imgUrl, err)
return nil, err
}
if resp.StatusCode != 200 {
glog.V(4).Infof("url: %s,resp.StatusCode: %d\n", imgUrl, resp.StatusCode)
err = errors.New(config.HTTPERRORCODE)
return nil, err
}
defer resp.Body.Close()
```
`resp.Body.Close()`关闭方式不对,应该在判断err后立即执行defer语句
```
resp, err := config.NoProxyHttpClient.Do(req)
if err != nil {
glog.V(4).Infof("url: %s,http err: %s\n", imgUrl, err)
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
glog.V(4).Infof("url: %s,resp.StatusCode: %d\n", imgUrl, resp.StatusCode)
err = errors.New(config.HTTPERRORCODE)
return nil, err
}
```
ps:我尝试过在`resp, err := config.NoProxyHttpClient.Do(req)`后立即执行关闭操作,有时候会报空指针
有疑问加站长微信联系(非本文作者))