diff options
Diffstat (limited to 'net/http/http_response_body_drainer.h')
-rw-r--r-- | net/http/http_response_body_drainer.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/net/http/http_response_body_drainer.h b/net/http/http_response_body_drainer.h new file mode 100644 index 0000000..1aa4e93 --- /dev/null +++ b/net/http/http_response_body_drainer.h @@ -0,0 +1,68 @@ +// Copyright (c) 2010 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. + +#ifndef NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ +#define NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/ref_counted.h" +#include "base/scoped_ptr.h" +#include "base/timer.h" +#include "net/base/completion_callback.h" +#include "net/http/http_network_session.h" + +namespace net { + +class HttpStream; +class IOBuffer; + +class HttpResponseBodyDrainer { + public: + // The size in bytes of the buffer we use to drain the response body that + // we want to throw away. The response body is typically a small page just a + // few hundred bytes long. We set a limit to prevent it from taking too long, + // since we may as well just create a new socket then. + static const int kDrainBodyBufferSize = 16384; + static const int kTimeoutInSeconds = 5; + + explicit HttpResponseBodyDrainer(HttpStream* stream); + ~HttpResponseBodyDrainer(); + + // Starts reading the body until completion, or we hit the buffer limit, or we + // timeout. After Start(), |this| will eventually delete itself. If it + // doesn't complete immediately, it will add itself to |session|. + void Start(HttpNetworkSession* session); + + private: + enum State { + STATE_DRAIN_RESPONSE_BODY, + STATE_DRAIN_RESPONSE_BODY_COMPLETE, + STATE_NONE, + }; + + int DoLoop(int result); + + int DoDrainResponseBody(); + int DoDrainResponseBodyComplete(int result); + + void OnIOComplete(int result); + void OnTimerFired(); + void Finish(int result); + + scoped_refptr<IOBuffer> read_buf_; + const scoped_ptr<HttpStream> stream_; + State next_state_; + int total_read_; + CompletionCallbackImpl<HttpResponseBodyDrainer> io_callback_; + CompletionCallback* user_callback_; + base::OneShotTimer<HttpResponseBodyDrainer> timer_; + HttpNetworkSession* session_; + + DISALLOW_COPY_AND_ASSIGN(HttpResponseBodyDrainer); +}; + +} // namespace net + +#endif // NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_ |