ApiCatcher支持抓包HTTP传输大文件的实现原理分享

我试用过很多iOS端的HTTP抓包工具,都不支持捕获静态资源文件,或者说请求或响应Body大于某个阈值时请求就会被丢弃了。有时候想排查一个文件上传无权限问题,想抓包查看请求的完整url,看看用的哪个域名,找出对应的项目,但这都做不到。

我们在做ApiCatcher的过程中才了解,原来iOS操作系统会限制网络扩展进程的内存,从一些资料看,系统限制网络扩展进程最大只能使用50MB内存,超过的话进程会被系统kill掉。不过这个阈值可能跟操作系统版本有关,实际测试发现在用到80MB内存时,进程仍在正常工作。

因为存在内存限制,所以很多抓包工具都做了限制,都实现了各自的丢包策略,当请求Body或响应Body超过多大时就把请求丢掉了。

ApiCatcher是如何解决这个问题的呢?

考虑到一般静态资源文件都不会有重写请求/响应Body、以及执行脚本修改请求/响应Body的需求, 所以对于静态资源文件,没必要将请求/响应Body缓存到内存中, 我们用文件来存储请求/响应Body,只要是静态资源的请求或响应都把Body存到文件中。 将从NIO接收缓冲区读取到的字节数据直接写入文件,并转发出去,不做内存暂存。

因为一个大的HTTP数据包,到TCP层是会被拆包的,假设一个HTTP请求传输的文件是1MB, 但一个TCP数据包可能只有64KB,所以一个请求通过边读边写文件的方式,只会占用64KB的内存,而不是1MB。 当请求发送完毕,或响应接收完毕后,往数据库存入请求记录时,将这个文件的路径作为Body字段存储即可。

使用这个方案需要确保用户在删除请求记录时,找出请求/响应Body对应的文件删除,需要自己解决数据一致性问题。 这也是为什么ApiCatcher删除数据会慢一些,因为是一条条记录遍历删除的。 这也是一种取舍,但我们认为这种取舍是值得的,因为删除功能并不经常使用,一次删除的数据也不会很多,一万条数据5秒就能完成。

在支持捕获图片、视频、音频等文件之后,为了快速识别请求传输的内容, ApiCatcher支持图片、视频、音频的渲染,可以直接点击播放, 我们也专门为预览图片、视频、音频做了预览和批量导出页面, 方便提取导出测试素材文件。

我们在iOS、Windows & macOS三端上都应用了相同的实现原理,即便桌面端没有内存限制,更这样能获得更好的性能。

原文链接:ApiCatcher支持抓包HTTP传输大文件的实现原理

相关推荐
BreezeJiang2 分钟前
父组件一更新,子组件就必须跟着更新吗?从 memo 走到 useCallback
前端·javascript
胡萝卜术3 分钟前
复用与并行:从自定义 Hooks 封装状态逻辑,到 Web Worker 的多线程计算
前端·javascript·面试
circuitsosk3 分钟前
长文本与高并发下的Token“瘦身”策略:Prompt压缩与上下文窗口优化
java·前端·python·prompt·上下文窗口·token优化
触底反弹3 分钟前
🏗️ 写完 Todos 之后,大型 React 项目的 7 个架构真相
前端·react.js·前端框架
huabuyu4 分钟前
CLS 总是修不好?因为你只盯着分数,从没拆开看过它
前端·javascript
倾颜5 分钟前
会 Vue / React,上手 Electron 真没那么难:前端开发者需要补齐的核心知识
前端
kisshyshy6 分钟前
从多页面到SPA:React Router 路由进阶完全指南
前端·javascript·react.js
JakeJiang6 分钟前
抓到接口还不够:用 AIProxy 改返回、Mock 数据、切测试环境
前端·后端
倾颜8 分钟前
从 Web 到桌面:AI Mind Electron Desktop Host 的安全边界设计
前端
Csvn9 分钟前
📡 前端错误监控从零搭建:window.onerror 与 unhandledrejection 的完整实践
前端