#include <grpc/support/port_platform.h>
#include <inttypes.h>
#include <string.h>
#include <initializer_list>
#include <string>
#include <utility>
#include "absl/base/attributes.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
#include <grpc/slice.h>
#include <grpc/support/log.h>
#include "src/core/ext/transport/chttp2/transport/flow_control.h"
#include "src/core/ext/transport/chttp2/transport/frame.h"
#include "src/core/ext/transport/chttp2/transport/frame_data.h"
#include "src/core/ext/transport/chttp2/transport/frame_goaway.h"
#include "src/core/ext/transport/chttp2/transport/frame_ping.h"
#include "src/core/ext/transport/chttp2/transport/frame_rst_stream.h"
#include "src/core/ext/transport/chttp2/transport/frame_settings.h"
#include "src/core/ext/transport/chttp2/transport/frame_window_update.h"
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
#include "src/core/ext/transport/chttp2/transport/hpack_parser_table.h"
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
#include "src/core/ext/transport/chttp2/transport/http_trace.h"
#include "src/core/ext/transport/chttp2/transport/internal.h"
#include "src/core/ext/transport/chttp2/transport/stream_map.h"
#include "src/core/lib/channel/channelz.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/status_helper.h"
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/combiner.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/slice/slice.h"
#include "src/core/lib/transport/bdp_estimator.h"
#include "src/core/lib/transport/error_utils.h"
#include "src/core/lib/transport/http2_errors.h"
#include "src/core/lib/transport/metadata_batch.h"
#include "src/core/lib/transport/transport.h"
HPackParser;
static grpc_error_handle init_frame_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
int is_continuation);
static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_rst_stream_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_window_update_frame_parser(
grpc_chttp2_transport* t);
static grpc_error_handle init_ping_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_goaway_parser(grpc_chttp2_transport* t);
static grpc_error_handle init_non_header_skip_frame_parser(
grpc_chttp2_transport* t);
static grpc_error_handle parse_frame_slice(grpc_chttp2_transport* t,
const grpc_slice& slice,
int is_last);
static char get_utf8_safe_char(char c) { … }
uint32_t grpc_chttp2_min_read_progress_size(grpc_chttp2_transport* t) { … }
namespace {
struct KnownFlag { … };
std::string MakeFrameTypeString(absl::string_view frame_type, uint8_t flags,
std::initializer_list<KnownFlag> known_flags) { … }
std::string FrameTypeString(uint8_t frame_type, uint8_t flags) { … }
}
grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport* t,
const grpc_slice& slice) { … }
static grpc_error_handle init_frame_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle skip_parser(void* ,
grpc_chttp2_transport* ,
grpc_chttp2_stream* ,
const grpc_slice& ,
int ) { … }
static HPackParser::Boundary hpack_boundary_type(grpc_chttp2_transport* t,
bool is_eoh) { … }
static HPackParser::LogInfo hpack_parser_log_info(
grpc_chttp2_transport* t, HPackParser::LogInfo::Type type) { … }
static grpc_error_handle init_header_skip_frame_parser(
grpc_chttp2_transport* t, HPackParser::Priority priority_type) { … }
static grpc_error_handle init_non_header_skip_frame_parser(
grpc_chttp2_transport* t) { … }
void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
int is_continuation) { … }
static grpc_error_handle init_window_update_frame_parser(
grpc_chttp2_transport* t) { … }
static grpc_error_handle init_ping_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle init_rst_stream_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle init_goaway_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t) { … }
static grpc_error_handle parse_frame_slice(grpc_chttp2_transport* t,
const grpc_slice& slice,
int is_last) { … }
maybe_complete_func_type;
static const maybe_complete_func_type maybe_complete_funcs[] = …;
static void force_client_rst_stream(void* sp, grpc_error_handle ) { … }
grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
grpc_chttp2_transport* t,
grpc_chttp2_stream* s,
const grpc_slice& slice,
int is_last) { … }