3 * Copyright 2015 gRPC authors.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H
20 #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H
22 #include <grpc/support/port_platform.h>
26 #include "src/core/ext/transport/chttp2/transport/frame.h"
27 #include "src/core/ext/transport/chttp2/transport/hpack_table.h"
28 #include "src/core/lib/transport/metadata.h"
30 typedef struct grpc_chttp2_hpack_parser grpc_chttp2_hpack_parser;
32 typedef grpc_error* (*grpc_chttp2_hpack_parser_state)(
33 grpc_chttp2_hpack_parser* p, const uint8_t* beg, const uint8_t* end);
38 grpc_slice referenced;
45 } grpc_chttp2_hpack_parser_string;
47 struct grpc_chttp2_hpack_parser {
48 /* user specified callback for each header output */
49 grpc_error* (*on_header)(void* user_data, grpc_mdelem md);
50 void* on_header_user_data;
52 grpc_error* last_error;
54 /* current parse state - or a function that implements it */
55 grpc_chttp2_hpack_parser_state state;
56 /* future states dependent on the opening op code */
57 const grpc_chttp2_hpack_parser_state* next_state;
58 /* what to do after skipping prioritization data */
59 grpc_chttp2_hpack_parser_state after_prioritization;
60 /* the refcount of the slice that we're currently parsing */
61 grpc_slice_refcount* current_slice_refcount;
62 /* the value we're currently parsing */
65 grpc_chttp2_hpack_parser_string* str;
67 /* string parameters for each chunk */
68 grpc_chttp2_hpack_parser_string key;
69 grpc_chttp2_hpack_parser_string value;
72 /* When we parse a value string, we determine the metadata element for a
73 specific index, which we need again when we're finishing up with that
74 header. To avoid calculating the metadata element for that index a second
75 time at that stage, we cache (and invalidate) the element here. */
76 grpc_mdelem md_for_index;
78 int64_t precomputed_md_index;
80 /* length of source bytes for the currently parsing string */
82 /* number of source bytes read for the currently parsing string */
84 /* huffman decoding state */
86 /* is the string being decoded binary? */
88 /* is the current string huffman encoded? */
90 /* is a dynamic table update allowed? */
91 uint8_t dynamic_table_update_allowed;
92 /* set by higher layers, used by grpc_chttp2_header_parser_parse to signal
93 it should append a metadata boundary at the end of frame */
96 uint32_t base64_buffer;
99 grpc_chttp2_hptbl table;
102 void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p);
103 void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p);
105 void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser* p);
107 grpc_error* grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
108 const grpc_slice& slice);
110 /* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for
112 grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
113 grpc_chttp2_transport* t,
114 grpc_chttp2_stream* s,
115 const grpc_slice& slice,
118 #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H */