上一次說到怎么樣開始把任務發送出去,也就是調用函數
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
收到網頁的數據后,又是怎么樣處理的呢?下一次再來分析這個問題。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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