亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2095 0
?

上一次說到怎么樣開始把任務(wù)發(fā)送出去,也就是調(diào)用函數(shù) BeginRequestInternal 來把 URL 請求發(fā)送,它的代碼如下:

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

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

?

獲取請求信息。

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

?

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

#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 ?

?

啟動上傳狀態(tài)更新定時器。

#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 ? }

?

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

#001 ? void URLRequest::Start() {

#002 ??? DCHECK(!is_pending_);

#003 ??? DCHECK(!job_);

#004 ?

?

創(chuàng)建一個下載的工作任務(wù)。

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

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

#007 ?

?

判斷是否有數(shù)據(jù)需要上傳。

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

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

#010 ?

?

設(shè)置請下開始下載的時間,以便后面檢查超時的狀態(tài)。

#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.

?

這里把工作任務(wù)啟動運(yùn)行。

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

#019 ? }

?

由于這里是對 URL HTTP 請求下載數(shù)據(jù),所以這里的 job_ 是類 URLRequestHttpJob 的實(shí)例,也就是調(diào)用函數(shù) URLRequestHttpJob::Start() ,在函數(shù) 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 個函數(shù)的調(diào)用處理,然后就會通過 Windows HTTP API 進(jìn)行發(fā)送請求和下載數(shù)據(jù)。我們來分析一下最后的函數(shù) WinHttpRequestThrottle::SendRequest ,看看怎么樣調(diào)用 Windows HTTP API 函數(shù)來獲取數(shù)據(jù)的,它的代碼如下:

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

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

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

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

?

下面就是調(diào)用 Windows API 函數(shù) WinHttpSendRequest 來發(fā)送請求,當(dāng)然在調(diào)用這個函數(shù)之前,需要調(diào)用函數(shù) 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() };

?

出錯處理,就調(diào)用外面的回調(diào)函數(shù)。

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

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

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

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

#018 ??? }

#019 ??? return ok;

#020 ? }

?

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

?

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美乱妇在线观看 | 成人夜色视频在线观看网站 | 欧美日韩福利视频一区二区三区 | 久久久影院 | 精品久久久久久午夜 | 国产大片在线观看 | 日本视频播放免费线上观看 | 狠狠做狠狠做综合日日 | 欧做爰xxxⅹ性欧美图片 | 99视频在线免费观看 | 免费观看视频成人国产 | 4hu影院永久在线播放 | 国产精品综合一区二区 | 911精品国产亚洲日本美国韩国 | 五月花激情网 | 日韩中文字幕免费观看 | 中文字幕亚洲欧美一区 | 农村妇女又色黄一级毛片 | 日本在线观看永久免费网站 | 黄动漫在线无限看免费 | 在线欧美视频免费观看国产 | aaa特级毛片 | 青青青国产手机免费视频 | 亚洲视频一区二区 | 美女被视频在线看九色 | 手机在线看福利 | 天天插天天操天天射 | 人人舔人人插 | 国产成人黄网址在线视频 | 四虎资源 | 亚洲精品久久久久中文字幕一区 | 农村高清性色生活片 | 国产成在线观看免费视频成本人 | 久久女人| 亚洲欧美精品一中文字幕 | 日本高清不卡一区久久精品 | 伊人网在线播放 | 桃色网站入口 | 亚洲美女视频网站 | 久久精品国产精品亚洲婷婷 | 羞羞视频在线观看视频 |