Skip to content

Commit 8cc807b

Browse files
tanvi-jagtapcopybara-github
authored andcommitted
[PH2][Transport] Grpc Header Read and Write (grpc#38984)
[PH2][Transport] 1. Grpc Header Read and Write 2. Adding some build dependencies that we need for the next Pull Request. Adding this in the other workflow will cause multiple build issues because of copybara. Closes grpc#38984 COPYBARA_INTEGRATE_REVIEW=grpc#38984 from tanvi-jagtap:ph2_trivial_build 0ad2529 PiperOrigin-RevId: 737890700
1 parent db33f7c commit 8cc807b

17 files changed

+82
-0
lines changed

CMakeLists.txt

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Makefile

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build_autogenerated.yaml

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config.m4

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config.w32

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gRPC-Core.podspec

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

grpc.gemspec

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.xml

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/core/BUILD

+4
Original file line numberDiff line numberDiff line change
@@ -7532,6 +7532,8 @@ grpc_cc_library(
75327532
"http2_transport",
75337533
"loop",
75347534
"map",
7535+
"message",
7536+
"metadata",
75357537
"mpsc",
75367538
"sync",
75377539
":match_promise",
@@ -7576,6 +7578,8 @@ grpc_cc_library(
75767578
"http2_settings",
75777579
"loop",
75787580
"map",
7581+
"message",
7582+
"metadata",
75797583
"mpsc",
75807584
"ref_counted",
75817585
"sync",

src/core/ext/transport/chttp2/transport/frame.cc

+18
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "absl/log/check.h"
2424
#include "absl/status/status.h"
2525
#include "absl/strings/str_cat.h"
26+
#include "src/core/lib/slice/slice_buffer.h"
2627
#include "src/core/util/crash.h"
2728

2829
namespace grpc_core {
@@ -525,4 +526,21 @@ absl::StatusOr<Http2Frame> ParseFramePayload(const Http2FrameHeader& hdr,
525526
}
526527
}
527528

529+
GrpcMessageHeader ExtractGrpcHeader(SliceBuffer& payload) {
530+
CHECK_GE(payload.Length(), kGrpcHeaderSizeInBytes);
531+
uint8_t buffer[kGrpcHeaderSizeInBytes];
532+
payload.MoveFirstNBytesIntoBuffer(kGrpcHeaderSizeInBytes, buffer);
533+
GrpcMessageHeader header;
534+
header.flags = buffer[0];
535+
header.length = Read4b(buffer + 1);
536+
return header;
537+
}
538+
539+
void AppendGrpcHeaderToSliceBuffer(SliceBuffer& payload, const uint8_t flags,
540+
const uint32_t length) {
541+
uint8_t* frame_hdr = payload.AddTiny(kGrpcHeaderSizeInBytes);
542+
frame_hdr[0] = flags;
543+
Write4b(length, frame_hdr + 1);
544+
}
545+
528546
} // namespace grpc_core

src/core/ext/transport/chttp2/transport/frame.h

+18
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,24 @@ absl::StatusOr<Http2Frame> ParseFramePayload(const Http2FrameHeader& hdr,
236236
// move things out of frames)
237237
void Serialize(absl::Span<Http2Frame> frames, SliceBuffer& out);
238238

239+
///////////////////////////////////////////////////////////////////////////////
240+
// GRPC Header
241+
242+
constexpr uint8_t kGrpcHeaderSizeInBytes = 5;
243+
244+
struct GrpcMessageHeader {
245+
uint8_t flags;
246+
uint32_t length;
247+
};
248+
249+
// If the payload SliceBuffer is too small to hold a gRPC header, this function
250+
// will crash. The calling function MUST ensure that the payload SliceBuffer
251+
// has length greater than or equal to the gRPC header.
252+
GrpcMessageHeader ExtractGrpcHeader(SliceBuffer& payload);
253+
254+
void AppendGrpcHeaderToSliceBuffer(SliceBuffer& payload, const uint8_t flags,
255+
const uint32_t length);
256+
239257
} // namespace grpc_core
240258

241259
#endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_FRAME_H

src/python/grpcio/grpc_core_dependencies.py

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/core/transport/chttp2/BUILD

+5
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ grpc_cc_test(
182182
deps = [
183183
"//:chttp2_frame",
184184
"//src/core:http2_errors",
185+
"//src/core:slice_buffer",
185186
],
186187
)
187188

@@ -515,6 +516,8 @@ grpc_cc_test(
515516
"//:gpr",
516517
"//:grpc",
517518
"//src/core:http2_client_transport",
519+
"//src/core:message",
520+
"//src/core:metadata",
518521
"//test/core/promise:poll_matcher",
519522
"//test/core/test_util:grpc_test_util",
520523
"//test/core/test_util:grpc_test_util_base",
@@ -538,6 +541,8 @@ grpc_cc_test(
538541
"//:gpr",
539542
"//:grpc",
540543
"//src/core:http2_server_transport",
544+
"//src/core:message",
545+
"//src/core:metadata",
541546
"//test/core/test_util:grpc_test_util",
542547
"//test/core/test_util:grpc_test_util_base",
543548
"//test/core/transport/chttp2:http2_frame_test_helper",

test/core/transport/chttp2/frame_test.cc

+17
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "absl/status/status.h"
2222
#include "gmock/gmock.h"
2323
#include "gtest/gtest.h"
24+
#include "src/core/lib/slice/slice_buffer.h"
2425
#include "src/core/lib/transport/http2_errors.h"
2526

2627
namespace grpc_core {
@@ -404,6 +405,22 @@ TEST(Frame, ParseRejects) {
404405
"stream_id=0, length=4}"));
405406
}
406407

408+
TEST(Frame, GrpcHeaderTest) {
409+
constexpr uint8_t kFlags = 15;
410+
constexpr uint32_t kLength = 1111111;
411+
412+
SliceBuffer payload;
413+
EXPECT_EQ(payload.Length(), 0);
414+
415+
AppendGrpcHeaderToSliceBuffer(payload, kFlags, kLength);
416+
EXPECT_EQ(payload.Length(), kGrpcHeaderSizeInBytes);
417+
418+
GrpcMessageHeader header = ExtractGrpcHeader(payload);
419+
EXPECT_EQ(payload.Length(), 0);
420+
EXPECT_EQ(header.flags, kFlags);
421+
EXPECT_EQ(header.length, kLength);
422+
}
423+
407424
} // namespace
408425
} // namespace grpc_core
409426

tools/doxygen/Doxyfile.c++.internal

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/doxygen/Doxyfile.core.internal

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)