1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#ifndef NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/basictypes.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/timer.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/completion_callback.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_network_session.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace net {
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass HttpStream;
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass IOBuffer;
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass HttpResponseBodyDrainer {
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The size in bytes of the buffer we use to drain the response body that
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // we want to throw away.  The response body is typically a small page just a
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // few hundred bytes long.  We set a limit to prevent it from taking too long,
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // since we may as well just create a new socket then.
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const int kDrainBodyBufferSize = 16384;
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const int kTimeoutInSeconds = 5;
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  explicit HttpResponseBodyDrainer(HttpStream* stream);
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ~HttpResponseBodyDrainer();
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Starts reading the body until completion, or we hit the buffer limit, or we
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // timeout.  After Start(), |this| will eventually delete itself.  If it
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // doesn't complete immediately, it will add itself to |session|.
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void Start(HttpNetworkSession* session);
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  enum State {
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    STATE_DRAIN_RESPONSE_BODY,
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    STATE_DRAIN_RESPONSE_BODY_COMPLETE,
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    STATE_NONE,
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int DoLoop(int result);
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int DoDrainResponseBody();
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int DoDrainResponseBodyComplete(int result);
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void OnIOComplete(int result);
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void OnTimerFired();
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void Finish(int result);
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<IOBuffer> read_buf_;
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const scoped_ptr<HttpStream> stream_;
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  State next_state_;
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int total_read_;
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CompletionCallbackImpl<HttpResponseBodyDrainer> io_callback_;
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CompletionCallback* user_callback_;
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::OneShotTimer<HttpResponseBodyDrainer> timer_;
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  HttpNetworkSession* session_;
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(HttpResponseBodyDrainer);
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace net
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif // NET_HTTP_HTTP_RESPONSE_BODY_DRAINER_H_
69