xref: /lighttpd1.4/src/h2.h (revision 06df2716)
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 void h2_send_100_continue (request_st *r, connection *con);
106 
107 void h2_send_headers (request_st *r, connection *con);
108 
109 void h2_send_cqdata (request_st *r, connection *con, struct chunkqueue *cq, uint32_t dlen);
110 
111 void h2_send_end_stream (request_st *r, connection *con);
112 
113 void h2_retire_stream (request_st *r, connection *con);
114 
115 void h2_retire_con (request_st *h2r, connection *con);
116 
117 __attribute_cold__
118 __attribute_noinline__
119 int h2_check_con_upgrade_h2c (request_st *r);
120 
121 #endif
122