Chromium 的 http 实现
这里简单提一下,其实封装的很完备,可以参考: Here
简单实现
我就不贴代码了,因为一些保密的原因
这里我使用 Electron 的源码进行验证,主要是手头只有 Electron 代码,不想在拉别的东西
- 修改 Electron net 层
- 暴露
registerSDKProtocol
接口作为功能入口 - 使用
class RustSDKProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler
实现请求 handler - 使用
net::URLRequestJob* request_job = net::URLRequestHttpJob::Factory(request, network_delegate, "https");
重定向不关心请求 - 实现
net::URLRequestSimpleJob
内处理 Rust SDK 逻辑 - 请求 url 带特殊 host,host 作为触发特殊请求的表示,例:https://native-sdk.zjurl.cn/${imagePath}
- 多个 host 解决并发量问题
PS: 处理请求的时候可能在别的线程,那么就需要建立一个新的
base::TaskRunner
base::WeakPtrFactory<RustSDKRequestJob> weak_factory_;
scoped_refptr<base::TaskRunner> task_runner_ = base::CreateTaskRunnerWithTraits({base::TaskPriority::USER_VISIBLE});
当需要跑的时候,就
PostTask
,最后一个参数是当前 Job 的指针
task_runner_->PostTask(FROM_HERE, base::BindOnce(&dosk::NativeSDKRequestJob::WorkerThread, weak_factory_.GetWeakPtr()));
等任务结束之后,需要再通过这种方式 Post 回
content::BrowserThread::UI
测试
- 这里会有一个并发量的限制,是 Chromium 本身的,不太想过多干预
- 如果实在是想干预,那么就通过伪造 host 的方式实现,因为也是通过 host 来实现并发量限制的
- 图中上面的请求体现出了并发限制,比较奇怪的是后面的请求时间,其实并不是 4s,只是我们的实现对于 timeline 显示效果有影响,体验上是一致的