00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __HTTP2_H__
00025 #define __HTTP2_H__
00026
00027 #include "ink_defs.h"
00028 #include "ink_memory.h"
00029
00030 typedef unsigned Http2StreamId;
00031
00032
00033
00034 typedef int32_t Http2WindowSize;
00035
00036 extern const char * const HTTP2_CONNECTION_PREFACE;
00037 const size_t HTTP2_CONNECTION_PREFACE_LEN = 24;
00038
00039 const size_t HTTP2_FRAME_HEADER_LEN = 8;
00040 const size_t HTTP2_GOAWAY_LEN = 8;
00041 const size_t HTTP2_SETTINGS_PARAMETER_LEN = 5;
00042
00043
00044 const size_t HTTP2_MAX_FRAME_PAYLOAD = 16383;
00045
00046 enum Http2ErrorCode
00047 {
00048 HTTP2_ERROR_NO_ERROR = 0,
00049 HTTP2_ERROR_PROTOCOL_ERROR = 1,
00050 HTTP2_ERROR_INTERNAL_ERROR = 2,
00051 HTTP2_ERROR_FLOW_CONTROL_ERROR = 3,
00052 HTTP2_ERROR_SETTINGS_TIMEOUT = 4,
00053 HTTP2_ERROR_STREAM_CLOSED = 5,
00054 HTTP2_ERROR_FRAME_SIZE_ERROR = 6,
00055 HTTP2_ERROR_REFUSED_STREAM = 7,
00056 HTTP2_ERROR_CANCEL = 8,
00057 HTTP2_ERROR_COMPRESSION_ERROR = 9,
00058 HTTP2_ERROR_CONNECT_ERROR = 10,
00059 HTTP2_ERROR_ENHANCE_YOUR_CALM = 11,
00060 HTTP2_ERROR_INADEQUATE_SECURITY = 12,
00061
00062 HTTP2_ERROR_MAX,
00063 };
00064
00065 enum Http2FrameType
00066 {
00067 HTTP2_FRAME_TYPE_DATA = 0,
00068 HTTP2_FRAME_TYPE_HEADERS = 1,
00069 HTTP2_FRAME_TYPE_PRIORITY = 2,
00070 HTTP2_FRAME_TYPE_RST_STREAM = 3,
00071 HTTP2_FRAME_TYPE_SETTINGS = 4,
00072 HTTP2_FRAME_TYPE_PUSH_PROMISE = 5,
00073 HTTP2_FRAME_TYPE_PING = 6,
00074 HTTP2_FRAME_TYPE_GOAWAY = 7,
00075 HTTP2_FRAME_TYPE_WINDOW_UPDATE = 8,
00076 HTTP2_FRAME_TYPE_CONTINUATION = 9,
00077 HTTP2_FRAME_TYPE_ALTSVC = 10,
00078 HTTP2_FRAME_TYPE_BLOCKED = 11,
00079
00080 HTTP2_FRAME_TYPE_MAX,
00081 };
00082
00083
00084 enum Http2FrameFlagsData
00085 {
00086 HTTP2_FLAGS_DATA_END_STREAM = 0x01,
00087 HTTP2_FLAGS_DATA_END_SEGMENT = 0x02,
00088 HTTP2_FLAGS_DATA_PAD_LOW = 0x08,
00089 HTTP2_FLAGS_DATA_PAD_HIGH = 0x10,
00090 HTTP2_FLAGS_DATA_COMPRESSESD = 0x20,
00091
00092 HTTP2_FLAGS_DATA_MASK = 0x2B,
00093 };
00094
00095
00096 enum Http2FrameFlagsHeaders
00097 {
00098 HTTP2_FLAGS_HEADERS_END_STREAM = 0x01,
00099 HTTP2_FLAGS_HEADERS_END_SEGMENT = 0x02,
00100 HTTP2_FLAGS_HEADERS_PAD_LOW = 0x08,
00101 HTTP2_FLAGS_HEADERS_PAD_HIGH = 0x10,
00102 HTTP2_FLAGS_HEADERS_PRIORITY = 0x20,
00103
00104 HTTP2_FLAGS_HEADERS_MASK = 0x2B,
00105 };
00106
00107
00108 enum Http2FrameFlagsPriority
00109 {
00110 HTTP2_FLAGS_PRIORITY_MASK = 0x00
00111 };
00112
00113
00114 enum Http2FrameFlagsRstStream
00115 {
00116 HTTP2_FLAGS_RST_STREAM_MASK = 0x00
00117 };
00118
00119
00120 enum Http2FrameFlagsSettings
00121 {
00122 HTTP2_FLAGS_SETTINGS_ACK = 0x01,
00123
00124 HTTP2_FLAGS_SETTINGS_MASK = 0x01
00125 };
00126
00127
00128 enum Http2FrameFlagsPushPromise
00129 {
00130 HTTP2_FLAGS_PUSH_PROMISE_END_HEADERS = 0x04,
00131 HTTP2_FLAGS_PUSH_PROMISE_PAD_LOW = 0x08,
00132 HTTP2_FLAGS_PUSH_PROMISE_PAD_HIGH = 0x10,
00133
00134 HTTP2_FLAGS_PUSH_PROMISE_MASK = 0x1C,
00135 };
00136
00137
00138 enum Http2FrameFlagsPing
00139 {
00140 HTTP2_FLAGS_PING_ACK = 0x01,
00141
00142 HTTP2_FLAGS_PING_MASK = 0x01
00143 };
00144
00145
00146 enum Http2FrameFlagsGoaway
00147 {
00148 HTTP2_FLAGS_GOAWAY_MASK = 0x00
00149 };
00150
00151
00152 enum Http2FrameFlagsWindowUpdate
00153 {
00154 HTTP2_FLAGS_WINDOW_UPDATE_MASK = 0x00
00155 };
00156
00157
00158 enum Http2FrameFlagsContinuation
00159 {
00160 HTTP2_FLAGS_CONTINUATION_END_HEADERS = 0x04,
00161 HTTP2_FLAGS_CONTINUATION_PAD_LOW = 0x08,
00162 HTTP2_FLAGS_CONTINUATION_PAD_HIGH = 0x10,
00163
00164 HTTP2_FLAGS_CONTINUATION_MASK = 0x1C,
00165 };
00166
00167
00168 enum Http2FrameFlagsAltsvc
00169 {
00170 HTTP2_FLAGS_ALTSVC_MASK = 0x00
00171 };
00172
00173
00174 enum Http2FrameFlagsBlocked
00175 {
00176 HTTP2_FLAGS_BLOCKED_MASK = 0x00
00177 };
00178
00179
00180 enum Http2SettingsIdentifier
00181 {
00182 HTTP2_SETTINGS_HEADER_TABLE_SIZE = 1,
00183 HTTP2_SETTINGS_ENABLE_PUSH = 2,
00184 HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS = 3,
00185 HTTP2_SETTINGS_INITIAL_WINDOW_SIZE = 4,
00186 HTTP2_SETTINGS_COMPRESS_DATA = 5,
00187
00188 HTTP2_SETTINGS_MAX
00189 };
00190
00191
00192 struct Http2FrameHeader
00193 {
00194 uint16_t length;
00195 uint8_t type;
00196 uint8_t flags;
00197 Http2StreamId streamid;
00198 };
00199
00200
00201 struct Http2SettingsParameter
00202 {
00203 uint8_t id;
00204 uint32_t value;
00205 };
00206
00207
00208 struct Http2Goaway
00209 {
00210 Http2StreamId last_streamid;
00211 uint32_t error_code;
00212
00213
00214
00215
00216 };
00217
00218
00219 static const Http2WindowSize HTTP2_MAX_WINDOW_SIZE = 0x7FFFFFFF;
00220
00221
00222 static const Http2WindowSize HTTP2_INITIAL_WINDOW_SIZE = 0x0000FFFF;
00223
00224 static inline bool
00225 http2_is_client_streamid(Http2StreamId streamid) {
00226 return (streamid & 0x1u) == 0x1u;
00227 }
00228
00229 static inline bool
00230 http2_is_server_streamid(Http2StreamId streamid) {
00231 return (streamid & 0x1u) == 0x0u;
00232 }
00233
00234 bool
00235 http2_parse_frame_header(IOVec, Http2FrameHeader&);
00236
00237 bool
00238 http2_write_frame_header(const Http2FrameHeader&, IOVec);
00239
00240 bool
00241 http2_write_goaway(const Http2Goaway&, IOVec);
00242
00243 bool
00244 http2_frame_header_is_valid(const Http2FrameHeader&);
00245
00246 bool
00247 http2_settings_parameter_is_valid(const Http2SettingsParameter&);
00248
00249 bool
00250 http2_parse_settings_parameter(IOVec, Http2SettingsParameter&);
00251
00252 #endif