|
|
|
@ -582,21 +582,30 @@ grpc_mdelem *grpc_mdelem_from_string_and_buffer(const char *key, |
|
|
|
|
grpc_mdstr_from_string(key), grpc_mdstr_from_buffer(value, value_length)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static size_t get_base64_encoded_size(size_t raw_length) { |
|
|
|
|
static const uint8_t tail_xtra[3] = {0, 2, 3}; |
|
|
|
|
return raw_length / 3 * 4 + tail_xtra[raw_length % 3]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t grpc_mdelem_get_size_in_hpack_table(grpc_mdelem *elem) { |
|
|
|
|
size_t overhead_and_key = 32 + GPR_SLICE_LENGTH(elem->key->slice); |
|
|
|
|
size_t value_len = GPR_SLICE_LENGTH(elem->value->slice); |
|
|
|
|
if (is_mdstr_static(elem->value)) { |
|
|
|
|
return overhead_and_key + GPR_SLICE_LENGTH(elem->value->slice); |
|
|
|
|
if (grpc_is_binary_header( |
|
|
|
|
(const char *)GPR_SLICE_START_PTR(elem->key->slice), |
|
|
|
|
GPR_SLICE_LENGTH(elem->key->slice))) { |
|
|
|
|
return overhead_and_key + get_base64_encoded_size(value_len); |
|
|
|
|
} else { |
|
|
|
|
return overhead_and_key + value_len; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
internal_string *is = (internal_string *)elem->value; |
|
|
|
|
size_t value_len = GPR_SLICE_LENGTH(is->slice); |
|
|
|
|
static const uint8_t tail_xtra[3] = {0, 2, 3}; |
|
|
|
|
if (is->has_size_in_decoder_table == 0) { |
|
|
|
|
is->has_size_in_decoder_table = 1; |
|
|
|
|
if (grpc_is_binary_header( |
|
|
|
|
(const char *)GPR_SLICE_START_PTR(elem->key->slice), |
|
|
|
|
GPR_SLICE_LENGTH(elem->key->slice))) { |
|
|
|
|
is->size_in_decoder_table = |
|
|
|
|
value_len / 3 * 4 + tail_xtra[value_len % 3]; |
|
|
|
|
is->size_in_decoder_table = get_base64_encoded_size(value_len); |
|
|
|
|
} else { |
|
|
|
|
is->size_in_decoder_table = value_len; |
|
|
|
|
} |
|
|
|
|