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 22 #include <grpc/support/port_platform.h> 23 24 #include <stddef.h> 25 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" 29 30 typedef struct grpc_chttp2_hpack_parser grpc_chttp2_hpack_parser; 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 struct grpc_chttp2_hpack_parser_string { 36 bool copied; 37 struct { 38 grpc_slice referenced; 39 struct { 40 char* str; 41 uint32_t length; 42 uint32_t capacity; 43 } copied; 44 } data; 45 }; 46 struct grpc_chttp2_hpack_parser { 47 /* user specified callback for each header output */ 48 grpc_error* (*on_header)(void* user_data, grpc_mdelem md); 49 void* on_header_user_data; 50 51 grpc_error* last_error; 52 53 /* current parse state - or a function that implements it */ 54 grpc_chttp2_hpack_parser_state state; 55 /* future states dependent on the opening op code */ 56 const grpc_chttp2_hpack_parser_state* next_state; 57 /* what to do after skipping prioritization data */ 58 grpc_chttp2_hpack_parser_state after_prioritization; 59 /* the refcount of the slice that we're currently parsing */ 60 grpc_slice_refcount* current_slice_refcount; 61 /* the value we're currently parsing */ 62 union { 63 uint32_t* value; 64 grpc_chttp2_hpack_parser_string* str; 65 } parsing; 66 /* string parameters for each chunk */ 67 grpc_chttp2_hpack_parser_string key; 68 grpc_chttp2_hpack_parser_string value; 69 /* parsed index */ 70 uint32_t index; 71 /* When we parse a value string, we determine the metadata element for a 72 specific index, which we need again when we're finishing up with that 73 header. To avoid calculating the metadata element for that index a second 74 time at that stage, we cache (and invalidate) the element here. */ 75 grpc_mdelem md_for_index; 76 #ifndef NDEBUG 77 int64_t precomputed_md_index; 78 #endif 79 /* length of source bytes for the currently parsing string */ 80 uint32_t strlen; 81 /* number of source bytes read for the currently parsing string */ 82 uint32_t strgot; 83 /* huffman decoding state */ 84 int16_t huff_state; 85 /* is the string being decoded binary? */ 86 uint8_t binary; 87 /* is the current string huffman encoded? */ 88 uint8_t huff; 89 /* is a dynamic table update allowed? */ 90 uint8_t dynamic_table_update_allowed; 91 /* set by higher layers, used by grpc_chttp2_header_parser_parse to signal 92 it should append a metadata boundary at the end of frame */ 93 uint8_t is_boundary; 94 uint8_t is_eof; 95 uint32_t base64_buffer; 96 97 /* hpack table */ 98 grpc_chttp2_hptbl table; 99 }; 100 101 void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p); 102 void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p); 103 104 void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser* p); 105 106 grpc_error* grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p, 107 const grpc_slice& slice); 108 109 /* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for 110 the transport */ 111 grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser, 112 grpc_chttp2_transport* t, 113 grpc_chttp2_stream* s, 114 const grpc_slice& slice, 115 int is_last); 116 117 #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H */ 118