// Copyright (c) 2016 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_CORE_FRAMES_QUIC_CONNECTION_CLOSE_FRAME_H_
#define QUICHE_QUIC_CORE_FRAMES_QUIC_CONNECTION_CLOSE_FRAME_H_

#include <ostream>
#include <string>

#include "quic/core/quic_error_codes.h"
#include "quic/core/quic_types.h"
#include "quic/core/quic_versions.h"
#include "quic/platform/api/quic_export.h"

namespace quic {

struct QUIC_EXPORT_PRIVATE QuicConnectionCloseFrame {
  QuicConnectionCloseFrame() = default;

  // Builds a connection close frame based on the transport version
  // and the mapping of error_code. THIS IS THE PREFERRED C'TOR
  // TO USE IF YOU NEED TO CREATE A CONNECTION-CLOSE-FRAME AND
  // HAVE IT BE CORRECT FOR THE VERSION AND CODE MAPPINGS.
  // |ietf_error| may optionally be be used to directly specify the wire
  // error code. Otherwise if |ietf_error| is NO_IETF_QUIC_ERROR, the
  // QuicErrorCodeToTransportErrorCode mapping of |error_code| will be used.
  QuicConnectionCloseFrame(QuicTransportVersion transport_version,
                           QuicErrorCode error_code,
                           QuicIetfTransportErrorCodes ietf_error,
                           std::string error_phrase,
                           uint64_t transport_close_frame_type);

  friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
      std::ostream& os,
      const QuicConnectionCloseFrame& c);

  // Indicates whether the the frame is a Google QUIC CONNECTION_CLOSE frame,
  // an IETF QUIC CONNECTION_CLOSE frame with transport error code,
  // or an IETF QUIC CONNECTION_CLOSE frame with application error code.
  QuicConnectionCloseType close_type = GOOGLE_QUIC_CONNECTION_CLOSE;

  // The error code on the wire.  For Google QUIC frames, this has the same
  // value as |quic_error_code|.
  uint64_t wire_error_code = QUIC_NO_ERROR;

  // The underlying error.  For Google QUIC frames, this has the same value as
  // |wire_error_code|.  For sent IETF QUIC frames, this is the error that
  // triggered the closure of the connection.  For received IETF QUIC frames,
  // this is parsed from the Reason Phrase field of the CONNECTION_CLOSE frame,
  // or QUIC_IETF_GQUIC_ERROR_MISSING.
  QuicErrorCode quic_error_code = QUIC_NO_ERROR;

  // String with additional error details. |quic_error_code| and a colon will be
  // prepended to the error details when sending IETF QUIC frames, and parsed
  // into |quic_error_code| upon receipt, when present.
  std::string error_details;

  // The frame type present in the IETF transport connection close frame.
  // Not populated for the Google QUIC or application connection close frames.
  // Contains the type of frame that triggered the connection close. Made a
  // uint64, as opposed to the QuicIetfFrameType, to support possible
  // extensions as well as reporting invalid frame types received from the peer.
  uint64_t transport_close_frame_type = 0;
};

}  // namespace quic

#endif  // QUICHE_QUIC_CORE_FRAMES_QUIC_CONNECTION_CLOSE_FRAME_H_
