1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be 33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file. 43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#ifndef NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/basictypes.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/timer.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/completion_callback.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_network_session.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace net { 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass HttpStream; 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass IOBuffer; 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass HttpResponseBodyDrainer { 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public: 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The size in bytes of the buffer we use to drain the response body that 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // we want to throw away. The response body is typically a small page just a 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // few hundred bytes long. We set a limit to prevent it from taking too long, 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // since we may as well just create a new socket then. 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int kDrainBodyBufferSize = 16384; 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int kTimeoutInSeconds = 5; 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick explicit HttpResponseBodyDrainer(HttpStream* stream); 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ~HttpResponseBodyDrainer(); 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Starts reading the body until completion, or we hit the buffer limit, or we 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // timeout. After Start(), |this| will eventually delete itself. If it 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // doesn't complete immediately, it will add itself to |session|. 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Start(HttpNetworkSession* session); 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private: 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick enum State { 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick STATE_DRAIN_RESPONSE_BODY, 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick STATE_DRAIN_RESPONSE_BODY_COMPLETE, 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick STATE_NONE, 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int DoLoop(int result); 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int DoDrainResponseBody(); 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int DoDrainResponseBodyComplete(int result); 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnIOComplete(int result); 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnTimerFired(); 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void Finish(int result); 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<IOBuffer> read_buf_; 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const scoped_ptr<HttpStream> stream_; 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick State next_state_; 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int total_read_; 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CompletionCallbackImpl<HttpResponseBodyDrainer> io_callback_; 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CompletionCallback* user_callback_; 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::OneShotTimer<HttpResponseBodyDrainer> timer_; 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpNetworkSession* session_; 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DISALLOW_COPY_AND_ASSIGN(HttpResponseBodyDrainer); 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace net 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif // NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ 69