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_error *(* grpc_chttp2_hpack_parser_state)(grpc_chttp2_hpack_parser *p, const uint8_t *beg, const uint8_t *end)
Definition: hpack_parser.h:32
void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p)
Definition: hpack_parser.cc:1606
void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p)
Definition: hpack_parser.cc:1634
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_error * grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p, const grpc_slice &slice)
Definition: hpack_parser.cc:1648
void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p)
Definition: hpack_parser.cc:1639
Definition: hpack_parser.h:35
grpc_slice referenced
Definition: hpack_parser.h:38
uint32_t length
Definition: hpack_parser.h:41
uint32_t capacity
Definition: hpack_parser.h:42
char * str
Definition: hpack_parser.h:40
bool copied
Definition: hpack_parser.h:36
Definition: hpack_parser.h:47
union grpc_chttp2_hpack_parser::@9 parsing
uint32_t strgot
Definition: hpack_parser.h:83
uint32_t * value
Definition: hpack_parser.h:64
uint8_t is_eof
Definition: hpack_parser.h:95
uint8_t binary
Definition: hpack_parser.h:87
grpc_chttp2_hpack_parser_string key
Definition: hpack_parser.h:68
grpc_chttp2_hpack_parser_string * str
Definition: hpack_parser.h:65
grpc_error * last_error
Definition: hpack_parser.h:52
grpc_chttp2_hpack_parser_string value
Definition: hpack_parser.h:69
uint8_t dynamic_table_update_allowed
Definition: hpack_parser.h:91
grpc_chttp2_hpack_parser_state state
Definition: hpack_parser.h:55
const grpc_chttp2_hpack_parser_state * next_state
Definition: hpack_parser.h:57
uint8_t huff
Definition: hpack_parser.h:89
void * on_header_user_data
Definition: hpack_parser.h:50
grpc_chttp2_hptbl table
Definition: hpack_parser.h:99
grpc_mdelem md_for_index
Definition: hpack_parser.h:76
uint32_t base64_buffer
Definition: hpack_parser.h:96
uint32_t strlen
Definition: hpack_parser.h:81
int64_t precomputed_md_index
Definition: hpack_parser.h:78
uint32_t index
Definition: hpack_parser.h:71
grpc_chttp2_hpack_parser_state after_prioritization
Definition: hpack_parser.h:59
uint8_t is_boundary
Definition: hpack_parser.h:94
int16_t huff_state
Definition: hpack_parser.h:85
grpc_slice_refcount * current_slice_refcount
Definition: hpack_parser.h:61
Definition: hpack_table.h:50
Definition: internal.h:508
Definition: internal.h:290
Definition: error_internal.h:39
Definition: metadata.h:98
Definition: slice_internal.h:100
A grpc_slice s, if initialized, represents the byte range s.bytes[0..s.length-1].
Definition: slice.h:60