欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 国产精品久久久久久日本 | 色宅男看片午夜大片免费看 | 欧美成人一区二区 | 天天夜夜人人 | jizz日本护士 | 欧美一区二区三区免费观看视频 | 欧美精品一区二区在线电影 | 人人干视频在线观看 | 黄色片免费在线 | 天天视频国产 | 日本在线视| 乳欲人妻办公室奶水在线电影国产 | 亚洲欧美精品一中文字幕 | 深爱五月综合网 | 欧美经典剧情系列h版在线观看 | 日本高清免费在线视频 | 日韩精品一区在线 | 免费欧美黄色网址 | 日韩精品一区二区三区中文 | 国产视频成人 | 国产精品啪一品二区三区粉嫩 | 一区二区三区四区国产精品视频 | jizz国产精品免费麻豆 | 日本一区二区三区免费观看 | 伊人导航 | 四虎天海翼 | 欧美成视频无需播放器 | 国产高清视频在线 | 草久影视 | 啪啪免费观看 | 亚洲精品国产第一综合99久久 | 男女做www免费高清视频 | 在线看片h站 | 亚州av在线| 51国产午夜精品免费视频 | 国产在线综合网 | 91网站在线观看视频 | 一级欧美日韩 | 欧美18av| 成人性爱视频在线观看 | 免费毛片在线播放 |