Put infer_length_after_decode in bin_decoder

pull/14433/head
Muxi Yan 7 years ago
parent 09bd5c0b1b
commit 9ef1f359ca
  1. 18
      src/core/ext/transport/chttp2/transport/bin_decoder.cc
  2. 3
      src/core/ext/transport/chttp2/transport/bin_decoder.h
  3. 22
      src/core/ext/transport/cronet/transport/cronet_transport.cc

@ -75,6 +75,24 @@ static bool input_is_valid(uint8_t* input_ptr, size_t length) {
#define COMPOSE_OUTPUT_BYTE_2(input_ptr) \
(uint8_t)((decode_table[input_ptr[2]] << 6) | decode_table[input_ptr[3]])
size_t grpc_base64_infer_length_after_decode(const grpc_slice& slice) {
size_t len = GRPC_SLICE_LENGTH(slice);
const uint8_t* bytes = GRPC_SLICE_START_PTR(slice);
while (len > 0 && bytes[len - 1] == '=') {
len--;
}
size_t tuples = len / 4;
size_t tail_case = len % 4;
if (tail_case == 1) {
gpr_log(GPR_ERROR,
"Base64 decoding failed. Input has a length of %zu (without"
" padding), which is invalid.\n",
len);
tail_case = 0;
}
return tuples * 3 + tail_xtra[tail_case];
}
bool grpc_base64_decode_partial(struct grpc_base64_decode_context* ctx) {
size_t input_tail;

@ -48,4 +48,7 @@ grpc_slice grpc_chttp2_base64_decode(grpc_slice input);
grpc_slice grpc_chttp2_base64_decode_with_length(grpc_slice input,
size_t output_length);
/* Infer the length of decoded data from encoded data. */
size_t grpc_base64_infer_length_after_decode(const grpc_slice& slice);
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_BIN_DECODER_H */

@ -216,26 +216,6 @@ void grpc_cronet_stream_unref(stream_obj* s) { grpc_stream_unref(s->refcount); }
static enum e_op_result execute_stream_op(struct op_and_state* oas);
static const size_t tail_xtra[4] = {0, 0, 1, 2};
static size_t infer_length_after_decode(const grpc_slice& slice) {
size_t len = GRPC_SLICE_LENGTH(slice);
const uint8_t* bytes = GRPC_SLICE_START_PTR(slice);
while (len > 0 && bytes[len - 1] == '=') {
len--;
}
size_t tuples = len / 4;
size_t tail_case = len % 4;
if (tail_case == 1) {
gpr_log(GPR_ERROR,
"Base64 decoding failed. Input has a length of %zu (without"
" padding), which is invalid.\n",
len);
tail_case = 0;
}
return tuples * 3 + tail_xtra[tail_case];
}
/*
Utility function to translate enum into string for printing
*/
@ -427,7 +407,7 @@ static void convert_cronet_array_to_metadata(
if (grpc_is_binary_header(key)) {
value = grpc_slice_from_static_string(header_array->headers[i].value);
value = grpc_slice_intern(grpc_chttp2_base64_decode_with_length(
value, infer_length_after_decode(value)));
value, grpc_base64_infer_length_after_decode(value)));
} else {
value = grpc_slice_intern(
grpc_slice_from_static_string(header_array->headers[i].value));

Loading…
Cancel
Save