|
|
|
@ -25,17 +25,13 @@ |
|
|
|
|
#include "absl/status/status.h" |
|
|
|
|
#include "absl/status/statusor.h" |
|
|
|
|
|
|
|
|
|
#include <grpc/event_engine/memory_allocator.h> |
|
|
|
|
#include <grpc/slice.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
|
|
|
|
|
#include "src/core/lib/gprpp/bitset.h" |
|
|
|
|
#include "src/core/lib/gprpp/no_destruct.h" |
|
|
|
|
#include "src/core/lib/gprpp/ref_counted_ptr.h" |
|
|
|
|
#include "src/core/lib/gprpp/status_helper.h" |
|
|
|
|
#include "src/core/lib/resource_quota/arena.h" |
|
|
|
|
#include "src/core/lib/resource_quota/memory_quota.h" |
|
|
|
|
#include "src/core/lib/resource_quota/resource_quota.h" |
|
|
|
|
#include "src/core/lib/slice/slice.h" |
|
|
|
|
#include "src/core/lib/slice/slice_buffer.h" |
|
|
|
|
|
|
|
|
@ -117,13 +113,10 @@ class FrameDeserializer { |
|
|
|
|
template <typename Metadata> |
|
|
|
|
absl::StatusOr<Arena::PoolPtr<Metadata>> ReadMetadata( |
|
|
|
|
HPackParser* parser, absl::StatusOr<SliceBuffer> maybe_slices, |
|
|
|
|
uint32_t stream_id, bool is_header, bool is_client) { |
|
|
|
|
uint32_t stream_id, bool is_header, bool is_client, |
|
|
|
|
std::shared_ptr<Arena> arena) { |
|
|
|
|
if (!maybe_slices.ok()) return maybe_slices.status(); |
|
|
|
|
auto& slices = *maybe_slices; |
|
|
|
|
MemoryAllocator memory_allocator = MemoryAllocator( |
|
|
|
|
ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator( |
|
|
|
|
"read_metadata")); |
|
|
|
|
auto arena = MakeScopedArena(1024, &memory_allocator); |
|
|
|
|
Arena::PoolPtr<Metadata> metadata = arena->MakePooled<Metadata>(arena.get()); |
|
|
|
|
parser->BeginFrame( |
|
|
|
|
metadata.get(), std::numeric_limits<uint32_t>::max(), |
|
|
|
@ -175,7 +168,7 @@ absl::Status ClientFragmentFrame::Deserialize(HPackParser* parser, |
|
|
|
|
FrameDeserializer deserializer(header, slice_buffer); |
|
|
|
|
if (header.flags.is_set(0)) { |
|
|
|
|
auto r = ReadMetadata<ClientMetadata>(parser, deserializer.ReceiveHeaders(), |
|
|
|
|
header.stream_id, true, true); |
|
|
|
|
header.stream_id, true, true, arena_); |
|
|
|
|
if (!r.ok()) return r.status(); |
|
|
|
|
} |
|
|
|
|
if (header.flags.is_set(1)) { |
|
|
|
@ -213,15 +206,17 @@ absl::Status ServerFragmentFrame::Deserialize(HPackParser* parser, |
|
|
|
|
} |
|
|
|
|
FrameDeserializer deserializer(header, slice_buffer); |
|
|
|
|
if (header.flags.is_set(0)) { |
|
|
|
|
auto r = ReadMetadata<ServerMetadata>(parser, deserializer.ReceiveHeaders(), |
|
|
|
|
header.stream_id, true, false); |
|
|
|
|
auto r = |
|
|
|
|
ReadMetadata<ServerMetadata>(parser, deserializer.ReceiveHeaders(), |
|
|
|
|
header.stream_id, true, false, arena_); |
|
|
|
|
if (!r.ok()) return r.status(); |
|
|
|
|
GPR_ASSERT(r.value() != nullptr); |
|
|
|
|
headers = std::move(r.value()); |
|
|
|
|
} |
|
|
|
|
if (header.flags.is_set(1)) { |
|
|
|
|
auto r = ReadMetadata<ServerMetadata>( |
|
|
|
|
parser, deserializer.ReceiveTrailers(), header.stream_id, false, false); |
|
|
|
|
auto r = |
|
|
|
|
ReadMetadata<ServerMetadata>(parser, deserializer.ReceiveTrailers(), |
|
|
|
|
header.stream_id, false, false, arena_); |
|
|
|
|
if (!r.ok()) return r.status(); |
|
|
|
|
GPR_ASSERT(r.value() != nullptr); |
|
|
|
|
trailers = std::move(r.value()); |
|
|
|
|