1 #ifndef LI_H2_H 2 #define LI_H2_H 3 #include "first.h" 4 5 /* time_t */ 6 #include <sys/types.h> 7 #include <sys/time.h> 8 9 #if defined(__APPLE__) && defined(__MACH__) 10 #if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050 11 #include <time.h> 12 #endif 13 #endif 14 15 #include "base_decls.h" 16 #include "buffer.h" 17 18 #include "ls-hpack/lshpack.h" 19 20 struct chunkqueue; /* declaration */ 21 22 typedef enum { 23 H2_FTYPE_DATA = 0x00, 24 H2_FTYPE_HEADERS = 0x01, 25 H2_FTYPE_PRIORITY = 0x02, 26 H2_FTYPE_RST_STREAM = 0x03, 27 H2_FTYPE_SETTINGS = 0x04, 28 H2_FTYPE_PUSH_PROMISE = 0x05, 29 H2_FTYPE_PING = 0x06, 30 H2_FTYPE_GOAWAY = 0x07, 31 H2_FTYPE_WINDOW_UPDATE = 0x08, 32 H2_FTYPE_CONTINUATION = 0x09 33 } request_h2ftype_t; 34 35 typedef enum { 36 H2_SETTINGS_HEADER_TABLE_SIZE = 0x01, 37 H2_SETTINGS_ENABLE_PUSH = 0x02, 38 H2_SETTINGS_MAX_CONCURRENT_STREAMS = 0x03, 39 H2_SETTINGS_INITIAL_WINDOW_SIZE = 0x04, 40 H2_SETTINGS_MAX_FRAME_SIZE = 0x05, 41 H2_SETTINGS_MAX_HEADER_LIST_SIZE = 0x06 42 } request_h2settings_t; 43 44 typedef enum { 45 H2_FLAG_END_STREAM = 0x01, /* DATA HEADERS */ 46 H2_FLAG_END_HEADERS = 0x04, /* HEADERS PUSH_PROMISE CONTINUATION */ 47 H2_FLAG_PADDED = 0x08, /* DATA HEADERS PUSH_PROMISE */ 48 H2_FLAG_PRIORITY = 0x20, /* HEADERS */ 49 H2_FLAG_ACK = 0x01 /* PING SETTINGS*/ 50 } request_h2flag_t; 51 52 typedef enum { 53 H2_E_NO_ERROR = 0x00, 54 H2_E_PROTOCOL_ERROR = 0x01, 55 H2_E_INTERNAL_ERROR = 0x02, 56 H2_E_FLOW_CONTROL_ERROR = 0x03, 57 H2_E_SETTINGS_TIMEOUT = 0x04, 58 H2_E_STREAM_CLOSED = 0x05, 59 H2_E_FRAME_SIZE_ERROR = 0x06, 60 H2_E_REFUSED_STREAM = 0x07, 61 H2_E_CANCEL = 0x08, 62 H2_E_COMPRESSION_ERROR = 0x09, 63 H2_E_CONNECT_ERROR = 0x0a, 64 H2_E_ENHANCE_YOUR_CALM = 0x0b, 65 H2_E_INADEQUATE_SECURITY = 0x0c, 66 H2_E_HTTP_1_1_REQUIRED = 0x0d 67 } request_h2error_t; 68 69 typedef enum { 70 H2_STATE_IDLE, 71 H2_STATE_RESERVED_LOCAL, 72 H2_STATE_RESERVED_REMOTE, 73 H2_STATE_OPEN, 74 H2_STATE_HALF_CLOSED_LOCAL, 75 H2_STATE_HALF_CLOSED_REMOTE, 76 H2_STATE_CLOSED 77 } request_h2state_t; 78 79 struct h2con { 80 request_st *r[8]; 81 uint32_t rused; 82 83 uint32_t h2_cid; 84 uint32_t h2_sid; 85 int32_t sent_goaway; 86 time_t sent_settings; 87 uint32_t s_header_table_size; /* SETTINGS_HEADER_TABLE_SIZE */ 88 uint32_t s_enable_push; /* SETTINGS_ENABLE_PUSH */ 89 uint32_t s_max_concurrent_streams; /* SETTINGS_MAX_CONCURRENT_STREAMS */ 90 int32_t s_initial_window_size; /* SETTINGS_INITIAL_WINDOW_SIZE */ 91 uint32_t s_max_frame_size; /* SETTINGS_MAX_FRAME_SIZE */ 92 uint32_t s_max_header_list_size; /* SETTINGS_MAX_HEADER_LIST_SIZE */ 93 struct lshpack_dec decoder; 94 struct lshpack_enc encoder; 95 }; 96 97 void h2_send_goaway (connection *con, request_h2error_t e); 98 99 int h2_parse_frames (connection *con); 100 101 int h2_want_read (connection *con); 102 103 void h2_init_con (request_st * restrict h2r, connection * restrict con, const buffer * restrict http2_settings); 104 105 int h2_send_1xx (request_st *r, connection *con); 106 107 void h2_send_100_continue (request_st *r, connection *con); 108 109 void h2_send_headers (request_st *r, connection *con); 110 111 void h2_send_cqdata (request_st *r, connection *con, struct chunkqueue *cq, uint32_t dlen); 112 113 void h2_send_end_stream (request_st *r, connection *con); 114 115 void h2_retire_stream (request_st *r, connection *con); 116 117 void h2_retire_con (request_st *h2r, connection *con); 118 119 __attribute_cold__ 120 __attribute_noinline__ 121 int h2_check_con_upgrade_h2c (request_st *r); 122 123 #endif 124