1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef __mod_h2__h2__
18 #define __mod_h2__h2__
21 * The magic PRIamble of RFC 7540 that is always sent when starting
24 extern const char *H2_MAGIC_TOKEN;
26 #define H2_ERR_NO_ERROR (0x00)
27 #define H2_ERR_PROTOCOL_ERROR (0x01)
28 #define H2_ERR_INTERNAL_ERROR (0x02)
29 #define H2_ERR_FLOW_CONTROL_ERROR (0x03)
30 #define H2_ERR_SETTINGS_TIMEOUT (0x04)
31 #define H2_ERR_STREAM_CLOSED (0x05)
32 #define H2_ERR_FRAME_SIZE_ERROR (0x06)
33 #define H2_ERR_REFUSED_STREAM (0x07)
34 #define H2_ERR_CANCEL (0x08)
35 #define H2_ERR_COMPRESSION_ERROR (0x09)
36 #define H2_ERR_CONNECT_ERROR (0x0a)
37 #define H2_ERR_ENHANCE_YOUR_CALM (0x0b)
38 #define H2_ERR_INADEQUATE_SECURITY (0x0c)
39 #define H2_ERR_HTTP_1_1_REQUIRED (0x0d)
41 #define H2_HEADER_METHOD ":method"
42 #define H2_HEADER_METHOD_LEN 7
43 #define H2_HEADER_SCHEME ":scheme"
44 #define H2_HEADER_SCHEME_LEN 7
45 #define H2_HEADER_AUTH ":authority"
46 #define H2_HEADER_AUTH_LEN 10
47 #define H2_HEADER_PATH ":path"
48 #define H2_HEADER_PATH_LEN 5
49 #define H2_CRLF "\r\n"
51 /* Size of the frame header itself in HTTP/2 */
52 #define H2_FRAME_HDR_LEN 9
54 /* Max data size to write so it fits inside a TLS record */
55 #define H2_DATA_CHUNK_SIZE ((16*1024) - 100 - H2_FRAME_HDR_LEN)
57 /* Maximum number of padding bytes in a frame, rfc7540 */
58 #define H2_MAX_PADLEN 256
59 /* Initial default window size, RFC 7540 ch. 6.5.2 */
60 #define H2_INITIAL_WINDOW_SIZE ((64*1024)-1)
62 #define H2_STREAM_CLIENT_INITIATED(id) (id&0x01)
64 #define H2_ALEN(a) (sizeof(a)/sizeof((a)[0]))
66 #define H2MAX(x,y) ((x) > (y) ? (x) : (y))
67 #define H2MIN(x,y) ((x) < (y) ? (x) : (y))
71 H2_DEPENDANT_INTERLEAVED,
75 typedef struct h2_priority {
76 h2_dependency dependency;
88 H2_SESSION_ST_INIT, /* send initial SETTINGS, etc. */
89 H2_SESSION_ST_DONE, /* finished, connection close */
90 H2_SESSION_ST_IDLE, /* nothing to write, expecting data inc */
91 H2_SESSION_ST_BUSY, /* read/write without stop */
92 H2_SESSION_ST_WAIT, /* waiting for tasks reporting back */
93 H2_SESSION_ST_CLEANUP, /* pool is being cleaned up */
96 typedef struct h2_session_props {
97 int accepted_max; /* the highest remote stream id was/will be handled */
98 int completed_max; /* the highest remote stream completed */
99 int emitted_count; /* the number of local streams sent */
100 int emitted_max; /* the highest local stream id sent */
101 int error; /* the last session error encountered */
102 unsigned int accepting : 1; /* if the session is accepting new streams */
103 unsigned int shutdown : 1; /* if the final GOAWAY has been sent */
106 typedef enum h2_stream_state_t {
123 H2_SEV_IN_DATA_PENDING,
127 /* h2_request is the transformer of HTTP2 streams into HTTP/1.1 internal
128 * format that will be fed to various httpd input filters to finally
129 * become a request_rec to be handled by soemone.
131 typedef struct h2_request h2_request;
134 const char *method; /* pseudo header values, see ch. 8.1.2.3 */
136 const char *authority;
138 apr_table_t *headers;
140 apr_time_t request_time;
141 unsigned int chunked : 1; /* iff requst body needs to be forwarded as chunked */
142 unsigned int serialize : 1; /* iff this request is written in HTTP/1.1 serialization */
143 apr_off_t raw_bytes; /* RAW network bytes that generated this request - if known. */
146 typedef struct h2_headers h2_headers;
150 apr_table_t *headers;
152 apr_off_t raw_bytes; /* RAW network bytes that generated this request - if known. */
155 typedef apr_status_t h2_io_data_cb(void *ctx, const char *data, apr_off_t len);
157 typedef int h2_stream_pri_cmp(int stream_id1, int stream_id2, void *ctx);
159 /* Note key to attach connection task id to conn_rec/request_rec instances */
161 #define H2_TASK_ID_NOTE "http2-task-id"
162 #define H2_FILTER_DEBUG_NOTE "http2-debug"
163 #define H2_HDR_CONFORMANCE "http2-hdr-conformance"
164 #define H2_HDR_CONFORMANCE_UNSAFE "unsafe"
165 #define H2_PUSH_MODE_NOTE "http2-push-mode"
167 #endif /* defined(__mod_h2__h2__) */