1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ 6 #define NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ 7 #pragma once 8 9 #include "base/basictypes.h" 10 #include "base/memory/ref_counted.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/timer.h" 13 #include "net/base/completion_callback.h" 14 #include "net/http/http_network_session.h" 15 16 namespace net { 17 18 class HttpStream; 19 class IOBuffer; 20 21 class HttpResponseBodyDrainer { 22 public: 23 // The size in bytes of the buffer we use to drain the response body that 24 // we want to throw away. The response body is typically a small page just a 25 // few hundred bytes long. We set a limit to prevent it from taking too long, 26 // since we may as well just create a new socket then. 27 static const int kDrainBodyBufferSize = 16384; 28 static const int kTimeoutInSeconds = 5; 29 30 explicit HttpResponseBodyDrainer(HttpStream* stream); 31 ~HttpResponseBodyDrainer(); 32 33 // Starts reading the body until completion, or we hit the buffer limit, or we 34 // timeout. After Start(), |this| will eventually delete itself. If it 35 // doesn't complete immediately, it will add itself to |session|. 36 void Start(HttpNetworkSession* session); 37 38 private: 39 enum State { 40 STATE_DRAIN_RESPONSE_BODY, 41 STATE_DRAIN_RESPONSE_BODY_COMPLETE, 42 STATE_NONE, 43 }; 44 45 int DoLoop(int result); 46 47 int DoDrainResponseBody(); 48 int DoDrainResponseBodyComplete(int result); 49 50 void OnIOComplete(int result); 51 void OnTimerFired(); 52 void Finish(int result); 53 54 scoped_refptr<IOBuffer> read_buf_; 55 const scoped_ptr<HttpStream> stream_; 56 State next_state_; 57 int total_read_; 58 CompletionCallbackImpl<HttpResponseBodyDrainer> io_callback_; 59 CompletionCallback* user_callback_; 60 base::OneShotTimer<HttpResponseBodyDrainer> timer_; 61 HttpNetworkSession* session_; 62 63 DISALLOW_COPY_AND_ASSIGN(HttpResponseBodyDrainer); 64 }; 65 66 } // namespace net 67 68 #endif // NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ 69