// Copyright (c) 2018 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 QUICHE_QUIC_TOOLS_QUIC_SIMPLE_CLIENT_STREAM_H_
#define QUICHE_QUIC_TOOLS_QUIC_SIMPLE_CLIENT_STREAM_H_

#include <functional>
#include <utility>

#include "quiche/quic/core/http/quic_spdy_client_stream.h"

namespace quic {

class QuicSimpleClientStream : public QuicSpdyClientStream {
 public:
  QuicSimpleClientStream(QuicStreamId id, QuicSpdyClientSession* session,
                         StreamType type, bool drop_response_body)
      : QuicSpdyClientStream(id, session, type),
        drop_response_body_(drop_response_body) {}
  void OnBodyAvailable() override;

  void set_on_interim_headers(
      std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers) {
    on_interim_headers_ = std::move(on_interim_headers);
  }

 protected:
  bool ParseAndValidateStatusCode() override;

 private:
  std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers_;
  const bool drop_response_body_;
};

}  // namespace quic

#endif  // QUICHE_QUIC_TOOLS_QUIC_SIMPLE_CLIENT_STREAM_H_
