欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

谷歌瀏覽器的源碼分析(27)

系統 1955 0
?

上一次說到怎么樣開始把任務發送出去,也就是調用函數 BeginRequestInternal 來把 URL 請求發送,它的代碼如下:

#001 ? void ResourceDispatcherHost::BeginRequestInternal(URLRequest* request,

#002 ??????????????????????????????????????????????????? bool mixed_content) {

?

獲取請求信息。

#003 ??? ExtraRequestInfo* info = ExtraInfoForRequest(request);

?

生成全局 ID ,然后保存到正在下載請求隊列里。

#004 ??? GlobalRequestID global_id(info->render_process_host_id, info->request_id);

#005 ??? pending_requests_[global_id] = request;

#006 ??? if (mixed_content) {

#007 ????? // We don't start the request in that case. ? The SSLManager will potentially

#008 ????? // change the request (potentially to indicate its content should be

#009 ????? // filtered) and start it itself.

#010 ????? SSLManager::OnMixedContentRequest(this, request, ui_loop_);

#011 ????? return;

#012 ??? }

?

這里開始處理請求。

#013 ??? request->Start();

#014 ?

?

啟動上傳狀態更新定時器。

#015 ??? // Make sure we have the load state monitor running

#016 ??? if (!update_load_states_timer_.IsRunning()) {

#017 ????? update_load_states_timer_.Start(

#018 ????????? TimeDelta::FromMilliseconds(kUpdateLoadStatesIntervalMsec),

#019 ????????? this, &ResourceDispatcherHost::UpdateLoadStates);

#020 ??? }

#021 ? }

?

通過上面的函數可以看到主要調用 URLRequest::Start() 來處理下載的請求,它的代碼如下:

#001 ? void URLRequest::Start() {

#002 ??? DCHECK(!is_pending_);

#003 ??? DCHECK(!job_);

#004 ?

?

創建一個下載的工作任務。

#005 ??? job_ = GetJobManager()->CreateJob(this);

#006 ??? job_->SetExtraRequestHeaders(extra_request_headers_);

#007 ?

?

判斷是否有數據需要上傳。

#008 ??? if (upload_.get())

#009 ????? job_->SetUpload(upload_.get());

#010 ?

?

設置請下開始下載的時間,以便后面檢查超時的狀態。

#011 ??? is_pending_ = true;

#012 ??? response_info_.request_time = Time::Now();

#013 ?

#014 ??? // Don't allow errors to be sent from within Start().

#015 ??? // TODO(brettw) this may cause NotifyDone to be sent synchronously,

#016 ??? // we probably don't want this: they should be sent asynchronously so

#017 ??? // the caller does not get reentered.

?

這里把工作任務啟動運行。

#018 ??? job_->Start();

#019 ? }

?

由于這里是對 URL HTTP 請求下載數據,所以這里的 job_ 是類 URLRequestHttpJob 的實例,也就是調用函數 URLRequestHttpJob::Start() ,在函數 URLRequestHttpJob::Start() 的處理過程序如下:

1. ?????? URLRequestHttpJob::StartTransaction()

2. ?????? net::HttpCache::Transaction::Start

3. ?????? net::HttpCache::Transaction::BeginNetworkRequest()

4. ?????? net::HttpTransactionWinHttp::Start

5. ?????? net::HttpTransactionWinHttp::DidResolveProxy()

6. ?????? net::HttpTransactionWinHttp::OpenRequest

7. ?????? net::HttpTransactionWinHttp::SendRequest()

8. ?????? net::WinHttpRequestThrottle::SubmitRequest

9. ?????? net::WinHttpRequestThrottle::SendRequest

通過上面 9 個函數的調用處理,然后就會通過 Windows HTTP API 進行發送請求和下載數據。我們來分析一下最后的函數 WinHttpRequestThrottle::SendRequest ,看看怎么樣調用 Windows HTTP API 函數來獲取數據的,它的代碼如下:

#001 ? BOOL WinHttpRequestThrottle::SendRequest(HINTERNET request_handle,

#002 ?????????????????????????????????????????? DWORD total_size,

#003 ?????????????????????????????????????????? DWORD_PTR context,

#004 ?????????????????????????????????????????? bool report_async_error) {

?

下面就是調用 Windows API 函數 WinHttpSendRequest 來發送請求,當然在調用這個函數之前,需要調用函數 WinHttpOpenRequest 先打開一個 TCP 連接。

#005 ??? BOOL ok = WinHttpSendRequest(request_handle,

#006 ???????????????????????????????? WINHTTP_NO_ADDITIONAL_HEADERS,

#007 ???????????????????????????????? 0,

#008 ???????????????????????????????? WINHTTP_NO_REQUEST_DATA,

#009 ???????????????????????????????? 0,

#010 ???????????????????????????????? total_size,

#011 ???????????????????????????????? context);

#012 ??? if (!ok && report_async_error) {

#013 ????? WINHTTP_ASYNC_RESULT async_result = { API_SEND_REQUEST, GetLastError() };

?

出錯處理,就調用外面的回調函數。

#014 ????? HttpTransactionWinHttp::StatusCallback(

#015 ????????? request_handle, context,

#016 ????????? WINHTTP_CALLBACK_STATUS_REQUEST_ERROR,

#017 ????????? &async_result, sizeof(async_result));

#018 ??? }

#019 ??? return ok;

#020 ? }

?

通過前面一系列的分析學會 chrome 瀏覽器怎么樣輸入 URL 地址,以及怎么樣進行 URL 自動完成,然后把 URL 發送到渲染進程去處理,最后渲染進程又把資源下載請求發送到資源下載進程里處理,最后資源下載進程通過 Windows HTTP API 函數進行 TCP 連接,以及 HTTP 數據的上傳和下載。瀏覽器向網站發送請求的過程已經分析完成了,那么 HTTP API 收到網頁的數據后,又是怎么樣處理的呢?下一次再來分析這個問題。

?

谷歌瀏覽器的源碼分析(27)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产专区在线视频 | 91免费版在线观看 | 国产午夜免费一区二区三区 | 国产黄在线观看免费观看软件视频 | 在线91| 99久久精品国产片久人 | 精品人人视屏 | 奇米网色 | 91茄子国产线观看免费 | 国产精品国产三级国产aⅴ无密码 | 无码观看AAAAAAAA片 | 九九热精 | 男人的天堂在线视频 | 亚洲午夜精品久久久久久app | 欧美成人免费高清二区三区 | 亚洲区欧美中文字幕久久 | 国产成人一区二区三区 | 日韩精品手机在线 | 草久在线视频 | 九九毛片 | 成人午夜AV亚洲精品无码网站 | 国产一国产一有一级毛片 | 91丨九色丨国产 | 国产精品日韩欧美在线第3页 | 国产免费中文字幕 | 日韩欧美在线中文字幕 | 色综合天天综一个色天天综合网 | 久久亚洲欧美日韩精品专区 | 免费一二区| 日韩成人影院 | 免费观看欧美一级片 | 天干夜天天夜天干天国产电影 | 色网站综合 | 激情综合五月亚洲婷婷 | 婷婷色综合 | www视频免费观看 | 亚洲一区二区视频 | 精品国产一区三区 | 亚洲AV久久无码精品九九九小说 | 国产精品免费一区二区三区都可以 | 精品国精品国产自在久国产应用 |