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