38 "Input type should be auto-generated FlatBuffers table type"
42 "Return type should be auto-generated FlatBuffers table type"
46 HttpHandlerFlatbufBase(
47 const components::ComponentConfig& config,
48 const components::ComponentContext& component_context
53 virtual typename ReturnType::NativeTableType HandleRequestFlatbufThrow(
54 const http::HttpRequest& request,
55 const typename InputType::NativeTableType& input,
56 request::RequestContext& context
72 const http::HttpRequest& request,
73 request::RequestContext& context,
74 const std::string& request_body
79 const http::HttpRequest& request,
80 request::RequestContext& context,
81 const std::string& response_data
84 void ParseRequestData(
const http::HttpRequest& request, request::RequestContext& context)
const final;
98 ReturnType>::
HandleRequestThrow(
const http::HttpRequest& request, request::RequestContext& context)
const {
99 const auto& input = context.GetData<
const typename InputType::NativeTableType&>(impl::kFlatbufRequestDataName);
103 .SetData(std::string{impl::kFlatbufResponseDataName}, HandleRequestFlatbufThrow(request, input, context));
105 flatbuffers::FlatBufferBuilder fbb;
106 auto ret_fbb = ReturnType::Pack(fbb, &ret);
108 return {
reinterpret_cast<
const char*>(fbb.GetBufferPointer()), fbb.GetSize()};
127 const http::HttpRequest&,
128 request::RequestContext&,
129 const std::string& request_body
131 const size_t limit = GetConfig().request_body_size_log_limit;
132 return utils::log::ToLimitedHex(request_body, limit);
137 const http::HttpRequest&,
138 request::RequestContext&,
139 const std::string& response_data
141 const size_t limit = GetConfig().response_data_size_log_limit;
142 return utils::log::ToLimitedHex(response_data, limit);
148 ReturnType>::
ParseRequestData(
const http::HttpRequest& request, request::RequestContext& context)
const {
149 const auto& body = request.RequestBody();
150 const auto* input_fbb = flatbuffers::GetRoot<InputType>(body.data());
151 flatbuffers::Verifier verifier(
reinterpret_cast<
const uint8_t*>(body.data()), body.size());
152 if (!input_fbb->Verify(verifier)) {
153 throw ClientError(InternalMessage{
"Invalid FlatBuffers format in request body"});
156 typename InputType::NativeTableType input;
157 input_fbb->UnPackTo(&input);
159 context.SetData(std::string{impl::kFlatbufRequestDataName}, std::move(input));