由Content-Length请求头引发的惨案

由Content-Length请求头引发的惨案

1、问题描述

​最近生产上频繁收到客户投诉,反馈文件下载响应很慢,而且老是出现等待超时情况,一开始还以为是文件过大或者网络问题导致。经过排查发现问题并非如此简单。
在这里插入图片描述
在这里插入图片描述

2、问题排查定位

​ 首先是根据文件ID查看了文件大小,发现是一张大小约5MB的JPG图片,按道理这么大点图片不会出现一分钟超时。因为文件都是放阿里云OSS的,于是又去排查了一下网络问题,发现也不是。在困扰之际,突然想起来最近对接第三方更改了文件下载接口部分代码,会不会是代码导致,于是翻看了最近改动的代码逻辑,发现出来加了如下代码,并没有其他改动。
在这里插入图片描述
如上图看到只是为了配合上游在请求头加了 “Content-Length”,难道这个会导致客户端无限等待导致超时?怀着疑问去查了相关资料。先看下网上对这个请求头的相关解释。
在这里插入图片描述
看了这个解释后突然明朗了,原来在上传文件的时候会对文件做压缩处理,并且讲上传记录入库,记录文件信息(包含了文件大小,压缩前的)。恰巧代码里添加的Content-Length的文件大小就是从数据库读取的压缩前的文件大小,**这就导致了添加的大小跟实际接口拿到的大小不一致,造成浏览器没法判断响应体已经结束,造成一致pending,直到请求超时。**了解了问题原因,下面就好解决了。

3、问题解决

方法一:

直接去掉Content-Length请求头,简单粗暴。

方法二(推荐):

解决文件大小不一致问题,一是在存储入库的时候就取压缩后的文件大小,而不是取压缩之前。二还可以在不动上传情况下,再添加Content-Length直接从文件中取文件长度,而不是从事先存储的文件大小读取。看下修前前后代码。
在这里插入图片描述

4、总结反馈

至此问题得到解决,总结下还是基础知识不够扎实,还得继续努力。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用`HttpQueryInfo`函数获取HTTP响应头中Content-Length信息,你可以按照以下步骤进行: 1. 确保已经建立了一个有效的HTTP请求并接收到了响应。 2. 创建一个缓冲区来存储Content-Length值。 3. 调用`HttpQueryInfo`函数来获取Content-Length值。 下面是一个使用`HttpQueryInfo`函数获取Content-Length的示例代码: ```cpp #include <windows.h> #include <wininet.h> #include <iostream> #pragma comment(lib, "wininet.lib") int main() { HINTERNET hInternet = InternetOpen(L"HTTPGET", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (hInternet == NULL) { std::cout << "Failed to open internet." << std::endl; return 1; } HINTERNET hConnect = InternetOpenUrl(hInternet, L"http://www.example.com", NULL, 0, INTERNET_FLAG_RELOAD, 0); if (hConnect == NULL) { std::cout << "Failed to open URL." << std::endl; InternetCloseHandle(hInternet); return 1; } DWORD contentLength = 0; DWORD contentLengthSize = sizeof(DWORD); HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &contentLength, &contentLengthSize, NULL); std::cout << "Content Length: " << contentLength << " bytes" << std::endl; InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); return 0; } ``` 在这个示例代码中,我们首先使用`InternetOpen`函数打开一个Internet会话,然后使用`InternetOpenUrl`函数打开指定URL的连接。请将`http://www.example.com`替换为你想要请求的URL。 然后,我们创建了一个DWORD类型的变量`contentLength`和一个DWORD类型的变量`contentLengthSize`来存储Content-Length的值和大小。 接下来,我们调用`HttpQueryInfo`函数来获取Content-Length的值。通过指定`HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER`标志,我们告诉函数我们要获取Content-Length的数值。 最后,我们输出获取到的Content-Length值。 希望这个示例代码可以帮助你使用`HttpQueryInfo`函数获取HTTP响应头中的Content-Length信息。如果有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值