chromium/net/third_party/quiche/src/quiche/http2/http2_structures.h

// Copyright 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_HTTP2_HTTP2_STRUCTURES_H_
#define QUICHE_HTTP2_HTTP2_STRUCTURES_H_

// Defines structs for various fixed sized structures in HTTP/2.
//
// Those structs with multiple fields have constructors that take arguments in
// the same order as their encoding (which may be different from their order
// in the struct). For single field structs, use aggregate initialization if
// desired, e.g.:
//
//   Http2RstStreamFields var{Http2ErrorCode::ENHANCE_YOUR_CALM};
// or:
//   SomeFunc(Http2RstStreamFields{Http2ErrorCode::ENHANCE_YOUR_CALM});
//
// Each struct includes a static method EncodedSize which returns the number
// of bytes of the encoding.
//
// With the exception of Http2FrameHeader, all the types are named
// Http2<X>Fields, where X is the title-case form of the frame which always
// includes the fields; the "always" is to cover the case of the PRIORITY frame;
// its fields optionally appear in the HEADERS frame, but the struct is called
// Http2PriorityFields.

#include <stddef.h>

#include <cstdint>
#include <ostream>
#include <string>

#include "quiche/http2/http2_constants.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/platform/api/quiche_logging.h"

namespace http2 {

struct QUICHE_EXPORT Http2FrameHeader {};

QUICHE_EXPORT bool operator==(const Http2FrameHeader& a,
                              const Http2FrameHeader& b);
QUICHE_EXPORT inline bool operator!=(const Http2FrameHeader& a,
                                     const Http2FrameHeader& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2FrameHeader& v);

// Http2PriorityFields:

struct QUICHE_EXPORT Http2PriorityFields {};

QUICHE_EXPORT bool operator==(const Http2PriorityFields& a,
                              const Http2PriorityFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2PriorityFields& a,
                                     const Http2PriorityFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2PriorityFields& v);

// Http2RstStreamFields:

struct QUICHE_EXPORT Http2RstStreamFields {};

QUICHE_EXPORT bool operator==(const Http2RstStreamFields& a,
                              const Http2RstStreamFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2RstStreamFields& a,
                                     const Http2RstStreamFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2RstStreamFields& v);

// Http2SettingFields:

struct QUICHE_EXPORT Http2SettingFields {};

QUICHE_EXPORT bool operator==(const Http2SettingFields& a,
                              const Http2SettingFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2SettingFields& a,
                                     const Http2SettingFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2SettingFields& v);

// Http2PushPromiseFields:

struct QUICHE_EXPORT Http2PushPromiseFields {};

QUICHE_EXPORT bool operator==(const Http2PushPromiseFields& a,
                              const Http2PushPromiseFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2PushPromiseFields& a,
                                     const Http2PushPromiseFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2PushPromiseFields& v);

// Http2PingFields:

struct QUICHE_EXPORT Http2PingFields {};

QUICHE_EXPORT bool operator==(const Http2PingFields& a,
                              const Http2PingFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2PingFields& a,
                                     const Http2PingFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2PingFields& v);

// Http2GoAwayFields:

struct QUICHE_EXPORT Http2GoAwayFields {};

QUICHE_EXPORT bool operator==(const Http2GoAwayFields& a,
                              const Http2GoAwayFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2GoAwayFields& a,
                                     const Http2GoAwayFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2GoAwayFields& v);

// Http2WindowUpdateFields:

struct QUICHE_EXPORT Http2WindowUpdateFields {};

QUICHE_EXPORT bool operator==(const Http2WindowUpdateFields& a,
                              const Http2WindowUpdateFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2WindowUpdateFields& a,
                                     const Http2WindowUpdateFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2WindowUpdateFields& v);

// Http2AltSvcFields:

struct QUICHE_EXPORT Http2AltSvcFields {};

QUICHE_EXPORT bool operator==(const Http2AltSvcFields& a,
                              const Http2AltSvcFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2AltSvcFields& a,
                                     const Http2AltSvcFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2AltSvcFields& v);

// Http2PriorityUpdateFields:

struct QUICHE_EXPORT Http2PriorityUpdateFields {};

QUICHE_EXPORT bool operator==(const Http2PriorityUpdateFields& a,
                              const Http2PriorityUpdateFields& b);
QUICHE_EXPORT inline bool operator!=(const Http2PriorityUpdateFields& a,
                                     const Http2PriorityUpdateFields& b) {}
QUICHE_EXPORT std::ostream& operator<<(std::ostream& out,
                                       const Http2PriorityUpdateFields& v);

}  // namespace http2

#endif  // QUICHE_HTTP2_HTTP2_STRUCTURES_H_