// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/devtools/devtools_network_upload_data_stream.h" #include "net/base/net_errors.h" DevToolsNetworkUploadDataStream::DevToolsNetworkUploadDataStream( net::UploadDataStream* upload_data_stream) : net::UploadDataStream(upload_data_stream->is_chunked(), upload_data_stream->identifier()), throttle_callback_( base::Bind(&DevToolsNetworkUploadDataStream::ThrottleCallback, base::Unretained(this))), throttled_byte_count_(0), upload_data_stream_(upload_data_stream) { } DevToolsNetworkUploadDataStream::~DevToolsNetworkUploadDataStream() { if (interceptor_) interceptor_->StopThrottle(throttle_callback_); } void DevToolsNetworkUploadDataStream::SetInterceptor( DevToolsNetworkInterceptor* interceptor) { DCHECK(!interceptor_); if (interceptor) interceptor_ = interceptor->GetWeakPtr(); } bool DevToolsNetworkUploadDataStream::IsInMemory() const { return false; } int DevToolsNetworkUploadDataStream::InitInternal() { throttled_byte_count_ = 0; int result = upload_data_stream_->Init( base::Bind(&DevToolsNetworkUploadDataStream::StreamInitCallback, base::Unretained(this))); if (result == net::OK && !is_chunked()) SetSize(upload_data_stream_->size()); return result; } void DevToolsNetworkUploadDataStream::StreamInitCallback(int result) { if (!is_chunked()) SetSize(upload_data_stream_->size()); OnInitCompleted(result); } int DevToolsNetworkUploadDataStream::ReadInternal( net::IOBuffer* buf, int buf_len) { int result = upload_data_stream_->Read(buf, buf_len, base::Bind(&DevToolsNetworkUploadDataStream::StreamReadCallback, base::Unretained(this))); return ThrottleRead(result); } void DevToolsNetworkUploadDataStream::StreamReadCallback(int result) { result = ThrottleRead(result); if (result != net::ERR_IO_PENDING) OnReadCompleted(result); } int DevToolsNetworkUploadDataStream::ThrottleRead(int result) { if (is_chunked() && upload_data_stream_->IsEOF()) SetIsFinalChunk(); if (!interceptor_ || result < 0) return result; if (result > 0) throttled_byte_count_ += result; return interceptor_->StartThrottle(result, throttled_byte_count_, base::TimeTicks(), false, true, throttle_callback_); } void DevToolsNetworkUploadDataStream::ThrottleCallback( int result, int64_t bytes) { throttled_byte_count_ = bytes; OnReadCompleted(result); } void DevToolsNetworkUploadDataStream::ResetInternal() { upload_data_stream_->Reset(); throttled_byte_count_ = 0; if (interceptor_) interceptor_->StopThrottle(throttle_callback_); }