GRPC Core  9.0.0
hpack_parser.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
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
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  */
18 
19 #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H
20 #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H
21 
23 
24 #include <stddef.h>
25 
29 
31 
32 typedef grpc_error* (*grpc_chttp2_hpack_parser_state)(
33  grpc_chttp2_hpack_parser* p, const uint8_t* beg, const uint8_t* end);
34 
35 typedef struct {
36  bool copied;
37  struct {
39  struct {
40  char* str;
41  uint32_t length;
42  uint32_t capacity;
43  } copied;
44  } data;
46 
48  /* user specified callback for each header output */
49  grpc_error* (*on_header)(void* user_data, grpc_mdelem md);
51 
53 
54  /* current parse state - or a function that implements it */
56  /* future states dependent on the opening op code */
58  /* what to do after skipping prioritization data */
60  /* the refcount of the slice that we're currently parsing */
62  /* the value we're currently parsing */
63  union {
64  uint32_t* value;
67  /* string parameters for each chunk */
70  /* parsed index */
71  uint32_t index;
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. */
77 #ifndef NDEBUG
79 #endif
80  /* length of source bytes for the currently parsing string */
81  uint32_t strlen;
82  /* number of source bytes read for the currently parsing string */
83  uint32_t strgot;
84  /* huffman decoding state */
85  int16_t huff_state;
86  /* is the string being decoded binary? */
87  uint8_t binary;
88  /* is the current string huffman encoded? */
89  uint8_t huff;
90  /* is a 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 */
94  uint8_t is_boundary;
95  uint8_t is_eof;
96  uint32_t base64_buffer;
97 
98  /* hpack table */
100 };
101 
104 
106 
108  const grpc_slice& slice);
109 
110 /* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for
111  the transport */
112 grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
115  const grpc_slice& slice,
116  int is_last);
117 
118 #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H */
grpc_chttp2_hpack_parser_string::copied
bool copied
Definition: hpack_parser.h:36
grpc_chttp2_hpack_parser::strlen
uint32_t strlen
Definition: hpack_parser.h:81
grpc_chttp2_hpack_parser::strgot
uint32_t strgot
Definition: hpack_parser.h:83
grpc_chttp2_hpack_parser
Definition: hpack_parser.h:47
grpc_chttp2_hpack_parser::parsing
union grpc_chttp2_hpack_parser::@9 parsing
grpc_chttp2_hpack_parser::huff
uint8_t huff
Definition: hpack_parser.h:89
grpc_chttp2_hpack_parser::precomputed_md_index
int64_t precomputed_md_index
Definition: hpack_parser.h:78
grpc_chttp2_hpack_parser::next_state
const grpc_chttp2_hpack_parser_state * next_state
Definition: hpack_parser.h:57
grpc_chttp2_hpack_parser::index
uint32_t index
Definition: hpack_parser.h:71
grpc_chttp2_hpack_parser_destroy
void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p)
Definition: hpack_parser.cc:1639
grpc_chttp2_stream
Definition: internal.h:508
grpc_chttp2_hpack_parser::value
grpc_chttp2_hpack_parser_string value
Definition: hpack_parser.h:69
grpc_chttp2_hpack_parser::base64_buffer
uint32_t base64_buffer
Definition: hpack_parser.h:96
grpc_chttp2_hpack_parser::key
grpc_chttp2_hpack_parser_string key
Definition: hpack_parser.h:68
grpc_chttp2_hpack_parser::str
grpc_chttp2_hpack_parser_string * str
Definition: hpack_parser.h:65
grpc_slice_refcount
Definition: slice_internal.h:100
grpc_chttp2_hpack_parser::on_header_user_data
void * on_header_user_data
Definition: hpack_parser.h:50
grpc_chttp2_hpack_parser_init
void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p)
Definition: hpack_parser.cc:1606
grpc_slice
A grpc_slice s, if initialized, represents the byte range s.bytes[0..s.length-1].
Definition: slice.h:60
grpc_chttp2_hpack_parser_string::str
char * str
Definition: hpack_parser.h:40
grpc_chttp2_header_parser_parse
grpc_error * grpc_chttp2_header_parser_parse(void *hpack_parser, grpc_chttp2_transport *t, grpc_chttp2_stream *s, const grpc_slice &slice, int is_last)
Definition: hpack_parser.cc:1702
grpc_chttp2_hpack_parser_set_has_priority
void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p)
Definition: hpack_parser.cc:1634
grpc_chttp2_hpack_parser::last_error
grpc_error * last_error
Definition: hpack_parser.h:52
grpc_chttp2_hpack_parser::current_slice_refcount
grpc_slice_refcount * current_slice_refcount
Definition: hpack_parser.h:61
grpc_chttp2_hpack_parser::md_for_index
grpc_mdelem md_for_index
Definition: hpack_parser.h:76
frame.h
hpack_table.h
grpc_mdelem
Definition: metadata.h:98
grpc_chttp2_hpack_parser_parse
grpc_error * grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p, const grpc_slice &slice)
Definition: hpack_parser.cc:1648
grpc_chttp2_hpack_parser::dynamic_table_update_allowed
uint8_t dynamic_table_update_allowed
Definition: hpack_parser.h:91
grpc_chttp2_hpack_parser::value
uint32_t * value
Definition: hpack_parser.h:64
grpc_chttp2_hpack_parser_string::referenced
grpc_slice referenced
Definition: hpack_parser.h:38
grpc_chttp2_hpack_parser_string
Definition: hpack_parser.h:35
grpc_chttp2_hpack_parser_string::capacity
uint32_t capacity
Definition: hpack_parser.h:42
grpc_chttp2_hptbl
Definition: hpack_table.h:50
grpc_chttp2_hpack_parser::state
grpc_chttp2_hpack_parser_state state
Definition: hpack_parser.h:55
metadata.h
grpc_chttp2_hpack_parser::after_prioritization
grpc_chttp2_hpack_parser_state after_prioritization
Definition: hpack_parser.h:59
grpc_chttp2_transport
Definition: internal.h:290
grpc_chttp2_hpack_parser::is_eof
uint8_t is_eof
Definition: hpack_parser.h:95
grpc_chttp2_hpack_parser::binary
uint8_t binary
Definition: hpack_parser.h:87
grpc_chttp2_hpack_parser::huff_state
int16_t huff_state
Definition: hpack_parser.h:85
grpc_chttp2_hpack_parser::is_boundary
uint8_t is_boundary
Definition: hpack_parser.h:94
grpc_error
Definition: error_internal.h:39
grpc_chttp2_hpack_parser_string::length
uint32_t length
Definition: hpack_parser.h:41
grpc_chttp2_hpack_parser_state
grpc_error *(* grpc_chttp2_hpack_parser_state)(grpc_chttp2_hpack_parser *p, const uint8_t *beg, const uint8_t *end)
Definition: hpack_parser.h:32
port_platform.h
grpc_chttp2_hpack_parser::table
grpc_chttp2_hptbl table
Definition: hpack_parser.h:99