// Copyright (c) 2011 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/memory/ref_counted.h"
#include "base/memory/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_