Chromium 网络栈之NetworkDelegate

发布于 2021-11-04


    网络请求的在不同的时机会调用到NetworkDelegate对象,它也提供了很多虚函数,供子类去重写,从而达到控制、修改、监控网络请求的作用。

    比如在真正开始网络请求之前,会调用NetworkDelegate::OnBeforeURLRequest,子类可以重写OnBeforeURLRequest,改变参数new_url的值,从而修改网络请求的地址:

    int SimpleNetworkDelegate::OnBeforeURLRequest(
        net::URLRequest* request,
        net::CompletionOnceCallback callback,
        GURL* new_url) {
       static bool is_change = false;
       if (!is_change) {
        *new_url = GURL("https://www.baidu.com/");
        is_change = true;
      }
    
      return net::OK;
    }
    

    很多接口都提供了一个net::CompletionOnceCallback的参数。如果接口返回net::OK则流程继续。如果返回net::ERR_IO_PENDING则流程中止,后续通过CompletionOnceCallback异步执行:

    void PendingStart(net::CompletionOnceCallback callback) {
      std::move(callback).Run(net::OK);
    }
    
    int SimpleNetworkDelegate::OnBeforeURLRequest(
        net::URLRequest* request,
        net::CompletionOnceCallback callback,
        GURL* new_url) {
    
      network_task_runner_->PostDelayedTask(
        FROM_HERE, base::BindOnce(PendingStart, std::move(callback)),
        base::TimeDelta::FromSeconds(3));
      return net::ERR_IO_PENDING;
    }