| // 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 "services/network/throttling/throttling_upload_data_stream.h" |
| |
| #include "base/bind.h" |
| #include "net/base/net_errors.h" |
| |
| namespace network { |
| |
| ThrottlingUploadDataStream::ThrottlingUploadDataStream( |
| net::UploadDataStream* upload_data_stream) |
| : net::UploadDataStream(upload_data_stream->is_chunked(), |
| upload_data_stream->identifier()), |
| throttle_callback_( |
| base::Bind(&ThrottlingUploadDataStream::ThrottleCallback, |
| base::Unretained(this))), |
| throttled_byte_count_(0), |
| upload_data_stream_(upload_data_stream) {} |
| |
| ThrottlingUploadDataStream::~ThrottlingUploadDataStream() { |
| if (interceptor_) |
| interceptor_->StopThrottle(throttle_callback_); |
| } |
| |
| void ThrottlingUploadDataStream::SetInterceptor( |
| ThrottlingNetworkInterceptor* interceptor) { |
| DCHECK(!interceptor_); |
| if (interceptor) |
| interceptor_ = interceptor->GetWeakPtr(); |
| } |
| |
| bool ThrottlingUploadDataStream::IsInMemory() const { |
| return false; |
| } |
| |
| int ThrottlingUploadDataStream::InitInternal( |
| const net::NetLogWithSource& net_log) { |
| throttled_byte_count_ = 0; |
| int result = upload_data_stream_->Init( |
| base::BindOnce(&ThrottlingUploadDataStream::StreamInitCallback, |
| base::Unretained(this)), |
| net_log); |
| if (result == net::OK && !is_chunked()) |
| SetSize(upload_data_stream_->size()); |
| return result; |
| } |
| |
| void ThrottlingUploadDataStream::StreamInitCallback(int result) { |
| if (!is_chunked()) |
| SetSize(upload_data_stream_->size()); |
| OnInitCompleted(result); |
| } |
| |
| int ThrottlingUploadDataStream::ReadInternal(net::IOBuffer* buf, int buf_len) { |
| int result = upload_data_stream_->Read( |
| buf, buf_len, |
| base::BindOnce(&ThrottlingUploadDataStream::StreamReadCallback, |
| base::Unretained(this))); |
| return ThrottleRead(result); |
| } |
| |
| void ThrottlingUploadDataStream::StreamReadCallback(int result) { |
| result = ThrottleRead(result); |
| if (result != net::ERR_IO_PENDING) |
| OnReadCompleted(result); |
| } |
| |
| int ThrottlingUploadDataStream::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 ThrottlingUploadDataStream::ThrottleCallback(int result, int64_t bytes) { |
| throttled_byte_count_ = bytes; |
| OnReadCompleted(result); |
| } |
| |
| void ThrottlingUploadDataStream::ResetInternal() { |
| upload_data_stream_->Reset(); |
| throttled_byte_count_ = 0; |
| if (interceptor_) |
| interceptor_->StopThrottle(throttle_callback_); |
| } |
| |
| } // namespace network |