blob: 5ba92fa0be15ab84757ddae96f4b244efe75a32e [file] [log] [blame]
// 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_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/timer/timer.h"
#include "net/base/net_export.h"
namespace net {
class HttpNetworkSession;
class HttpStream;
class IOBuffer;
class NET_EXPORT_PRIVATE 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(const HttpResponseBodyDrainer&) = delete;
HttpResponseBodyDrainer& operator=(const HttpResponseBodyDrainer&) = delete;
~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 std::unique_ptr<HttpStream> stream_;
State next_state_ = STATE_NONE;
int total_read_ = 0;
base::OneShotTimer timer_;
raw_ptr<HttpNetworkSession> session_ = nullptr;
};
} // namespace net
#endif // NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_