devtools_network_transaction.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/devtools/devtools_network_transaction.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/devtools/devtools_network_controller.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/base/net_errors.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/base/upload_progress.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/http/http_network_transaction.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/http/http_request_info.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DevToolsNetworkTransaction::DevToolsNetworkTransaction( 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DevToolsNetworkController* controller, 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<net::HttpTransaction> network_transaction) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : controller_(controller), 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_(network_transaction.Pass()), 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_(NULL), 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) failed_(false), 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))) { 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(controller); 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) controller->AddTransaction(this); 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) controller_->RemoveTransaction(this); 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::OnCallback(int rv) { 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (failed_) 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!callback_.is_null()); 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::CompletionCallback callback = callback_; 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_.Reset(); 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback.Run(rv); 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::Fail() { 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(request_); 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!failed_); 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) failed_ = true; 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->SetBeforeNetworkStartCallback( 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BeforeNetworkStartCallback()); 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (callback_.is_null()) 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::CompletionCallback callback = callback_; 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_.Reset(); 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback.Run(net::ERR_INTERNET_DISCONNECTED); 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DevToolsNetworkTransaction::Start( 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::HttpRequestInfo* request, 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::CompletionCallback& callback, 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::BoundNetLog& net_log) { 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(request); 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_ = request; 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (controller_->ShouldFail(request_)) { 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) failed_ = true; 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->SetBeforeNetworkStartCallback( 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BeforeNetworkStartCallback()); 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return net::ERR_INTERNET_DISCONNECTED; 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int rv = network_transaction_->Start(request, proxy_callback_, net_log); 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (rv == net::ERR_IO_PENDING) 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_ = callback; 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return rv; 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DevToolsNetworkTransaction::RestartIgnoringLastError( 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::CompletionCallback& callback) { 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (failed_) 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return net::ERR_INTERNET_DISCONNECTED; 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (rv == net::ERR_IO_PENDING) 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_ = callback; 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return rv; 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DevToolsNetworkTransaction::RestartWithCertificate( 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::X509Certificate* client_cert, 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::CompletionCallback& callback) { 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (failed_) 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return net::ERR_INTERNET_DISCONNECTED; 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int rv = network_transaction_->RestartWithCertificate( 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) client_cert, proxy_callback_); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (rv == net::ERR_IO_PENDING) 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_ = callback; 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return rv; 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DevToolsNetworkTransaction::RestartWithAuth( 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::AuthCredentials& credentials, 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::CompletionCallback& callback) { 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (failed_) 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return net::ERR_INTERNET_DISCONNECTED; 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_); 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (rv == net::ERR_IO_PENDING) 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_ = callback; 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return rv; 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() { 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->IsReadyToRestartForAuth(); 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DevToolsNetworkTransaction::Read( 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::IOBuffer* buf, 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int buf_len, 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const net::CompletionCallback& callback) { 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (failed_) 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return net::ERR_INTERNET_DISCONNECTED; 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int rv = network_transaction_->Read(buf, buf_len, proxy_callback_); 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (rv == net::ERR_IO_PENDING) 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) callback_ = callback; 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return rv; 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::StopCaching() { 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->StopCaching(); 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool DevToolsNetworkTransaction::GetFullRequestHeaders( 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::HttpRequestHeaders* headers) const { 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->GetFullRequestHeaders(headers); 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int64 DevToolsNetworkTransaction::GetTotalReceivedBytes() const { 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->GetTotalReceivedBytes(); 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::DoneReading() { 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->DoneReading(); 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const net::HttpResponseInfo* 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)DevToolsNetworkTransaction::GetResponseInfo() const { 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->GetResponseInfo(); 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)net::LoadState DevToolsNetworkTransaction::GetLoadState() const { 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->GetLoadState(); 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)net::UploadProgress DevToolsNetworkTransaction::GetUploadProgress() const { 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->GetUploadProgress(); 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::SetQuicServerInfo( 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::QuicServerInfo* quic_server_info) { 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->SetQuicServerInfo(quic_server_info); 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool DevToolsNetworkTransaction::GetLoadTimingInfo( 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::LoadTimingInfo* load_timing_info) const { 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->GetLoadTimingInfo(load_timing_info); 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::SetPriority(net::RequestPriority priority) { 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->SetPriority(priority); 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper( 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::WebSocketHandshakeStreamBase::CreateHelper* create_helper) { 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->SetWebSocketHandshakeStreamCreateHelper(create_helper); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback( 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const BeforeNetworkStartCallback& callback) { 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) network_transaction_->SetBeforeNetworkStartCallback(callback); 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int DevToolsNetworkTransaction::ResumeNetworkStart() { 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (failed_) 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return net::ERR_INTERNET_DISCONNECTED; 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return network_transaction_->ResumeNetworkStart(); 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 179