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
8#include "base/basictypes.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/timer/timer.h"
12#include "net/base/completion_callback.h"
13#include "net/base/net_export.h"
14#include "net/http/http_network_session.h"
15
16namespace net {
17
18class HttpStreamBase;
19class IOBuffer;
20
21class NET_EXPORT_PRIVATE 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(HttpStreamBase* 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<HttpStreamBase> stream_;
56  State next_state_;
57  int total_read_;
58  CompletionCallback user_callback_;
59  base::OneShotTimer<HttpResponseBodyDrainer> timer_;
60  HttpNetworkSession* session_;
61
62  DISALLOW_COPY_AND_ASSIGN(HttpResponseBodyDrainer);
63};
64
65}  // namespace net
66
67#endif // NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_
68