blob: 9d98578827ccbeea12103c3248817e8f8f4d46b5 [file] [log] [blame]
/** @file
*
* A brief file description
*
* @section license License
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "tscore/ink_platform.h"
#include <memory>
enum class Http3StreamType : uint8_t {
CONTROL = 0x00, ///< HTTP/3
PUSH = 0x01, ///< HTTP/3
QPACK_ENCODER = 0x02, ///< QPACK : encoder -> decoder
QPACK_DECODER = 0x03, ///< QPACK : decoder -> encoder
RESERVED = 0x21,
UNKNOWN = 0xFF,
};
enum class Http3SettingsId : uint64_t {
HEADER_TABLE_SIZE = 0x01, ///< QPACK Settings
RESERVED_1 = 0x02, ///< HTTP/3 Settings
RESERVED_2 = 0x03, ///< HTTP/3 Settings
RESERVED_3 = 0x04, ///< HTTP/3 Settings
RESERVED_4 = 0x05, ///< HTTP/3 Settings
MAX_FIELD_SECTION_SIZE = 0x06, ///< HTTP/3 Settings
QPACK_BLOCKED_STREAMS = 0x07, ///< QPACK Settings
NUM_PLACEHOLDERS = 0x09, ///< HTTP/3 Settings
UNKNOWN = 0x0A0A,
};
// Update Http3Frame::type(const uint8_t *) too when you modify this list
enum class Http3FrameType : uint64_t {
DATA = 0x00,
HEADERS = 0x01,
X_RESERVED_1 = 0x02,
CANCEL_PUSH = 0x03,
SETTINGS = 0x04,
PUSH_PROMISE = 0x05,
X_RESERVED_2 = 0x06,
GOAWAY = 0x07,
X_RESERVED_3 = 0x08,
X_RESERVED_4 = 0x09,
MAX_PUSH_ID = 0x0D,
X_MAX_DEFINED = 0x0D,
UNKNOWN = 0x0E,
};
enum class Http3ErrorClass {
UNDEFINED,
CONNECTION,
STREAM,
};
// Actual error code of QPACK is not decided yet on qpack-05. It will be changed.
enum class Http3ErrorCode : uint16_t {
H3_NO_ERROR = 0x0100,
H3_GENERAL_PROTOCOL_ERROR = 0x0101,
H3_INTERNAL_ERROR = 0x0102,
H3_STREAM_CREATION_ERROR = 0x0103,
H3_CLOSED_CRITICAL_STREAM = 0x0104,
H3_FRAME_UNEXPECTED = 0x0105,
H3_FRAME_ERROR = 0x0106,
H3_EXCESSIVE_LOAD = 0x0107,
H3_ID_ERROR = 0x0108,
H3_SETTINGS_ERROR = 0x0109,
H3_MISSING_SETTINGS = 0x010a,
H3_REQUEST_REJECTED = 0x010b,
H3_REQUEST_CANCELLED = 0x010c,
H3_REQUEST_INCOMPLETE = 0x010d,
H3_MESSAGE_ERROR = 0x010e,
H3_CONNECT_ERROR = 0x010f,
H3_VERSION_FALLBACK = 0x0110,
QPACK_DECOMPRESSION_FAILED = 0x200,
QPACK_ENCODER_STREAM_ERROR = 0x201,
QPACK_DECODER_STREAM_ERROR = 0x202,
};
class Http3Error
{
public:
virtual ~Http3Error() {}
Http3ErrorClass cls = Http3ErrorClass::UNDEFINED;
Http3ErrorCode code = Http3ErrorCode::H3_NO_ERROR;
const char *msg = nullptr;
uint16_t
get_code()
{
return static_cast<uint16_t>(code);
}
Http3Error() : code(Http3ErrorCode::H3_NO_ERROR){};
Http3Error(const Http3ErrorClass error_cls, const Http3ErrorCode error_code, const char *error_msg = nullptr)
: cls(error_cls), code(error_code), msg(error_msg){};
};
class Http3Stream
{
public:
static Http3StreamType type(const uint8_t *buf);
};
using Http3ErrorUPtr = std::unique_ptr<Http3Error>;