Python mimetypes 的双返回值:文件是 CSV,为什么第二项还会出现 gzip 导出系统准备发送report.csv.gz,类型推断返回text/csv和gzip。若把这两项都当作媒体类型,或者看见gzip就把内容改成普通CSV发送,响应头与实际字节就会不一致。mimetypes返回的是两种元数... yunqueblog/ 技术教程/ 2026-10-03/ 3 阅读
HTTP gzip 长度排查:字符数、原始字节和压缩字节别混着比 下载结果有一千多个字节,响应头却写四十五,就一定是服务端报错吗?如果响应使用 gzip,而客户端已经解压,两边计算的可能不是同一层数据。排查要先确定正在观察字符、原始编码字节,还是压缩后的正文。本文在 Python ... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
HTTP Range 下载验证:先核对区间,再拼接字节 断点下载最危险的错误,往往不是请求失败,而是把完整响应当成剩余片段接到旧文件后面。Range 是请求意图,下载器还要证明响应满足这次意图。本文依据 RFC 9110,只讨论单个字节区间的验收;示例已在 CPython... yunqueblog/ 技术教程/ 2026-10-01/ 4 阅读
HTTP 重试与幂等键:超时之后怎样避免重复创建任务 客户端提交创建任务请求后超时,服务器可能什么都没做,也可能已经创建成功,只是响应丢了。直接重发可能生成两项任务,完全不重试又可能让用户以为操作失败。幂等键的作用是把“同一项业务意图的再次尝试”关联起来。本文讨论自建接... yunqueblog/ 技术教程/ 2026-10-01/ 5 阅读
HTTP 缓存验证实战:用 ETag 与 304 区分“没更新”和“没请求” 网页刷新后没有变化,既可能是内容没更新,也可能是浏览器仍在使用缓存。排查时先拆开两个问题:这次请求有没有发出去;服务器确认的资源版本是否改变。本文适用于普通 GET 页面或静态文件的缓存检查,示例域名和版本标识需要替... yunqueblog/ 技术教程/ 2026-10-01/ 6 阅读