@ -50,12 +50,13 @@ const NoDestruct<Slice> kZeroSlice{[] {
class FrameSerializer {
public :
explicit FrameSerializer ( FrameHeader header ) : header_ ( header ) {
explicit FrameSerializer ( FrameType frame_type , uint32_t stream_id ,
uint32_t message_padding ) {
output_ . AppendIndexed ( kZeroSlice - > Copy ( ) ) ;
// Initialize header flags, header_length, trailer_length to 0.
header_ . type = frame_type ;
header_ . stream_id = stream_id ;
header_ . message_padding = message_padding ;
header_ . flags . SetAll ( false ) ;
header_ . header_length = 0 ;
header_ . trailer_length = 0 ;
}
// If called, must be called before AddTrailers, Finish.
SliceBuffer & AddHeaders ( ) {
@ -173,11 +174,12 @@ absl::Status SettingsFrame::Deserialize(HPackParser*, const FrameHeader& header,
}
SliceBuffer SettingsFrame : : Serialize ( HPackCompressor * ) const {
FrameSerializer serializer (
FrameHeader { FrameType : : kSettings , { } , 0 , 0 , 0 , 0 , 0 } ) ;
FrameSerializer serializer ( FrameType : : kSettings , 0 , 0 ) ;
return serializer . Finish ( ) ;
}
std : : string SettingsFrame : : ToString ( ) const { return " SettingsFrame{} " ; }
absl : : Status ClientFragmentFrame : : Deserialize ( HPackParser * parser ,
const FrameHeader & header ,
absl : : BitGenRef bitsrc ,
@ -185,7 +187,8 @@ absl::Status ClientFragmentFrame::Deserialize(HPackParser* parser,
if ( header . stream_id = = 0 ) {
return absl : : InvalidArgumentError ( " Expected non-zero stream id " ) ;
}
frame_header = header ;
stream_id = header . stream_id ;
message_padding = header . message_padding ;
if ( header . type ! = FrameType : : kFragment ) {
return absl : : InvalidArgumentError ( " Expected fragment frame " ) ;
}
@ -197,6 +200,9 @@ absl::Status ClientFragmentFrame::Deserialize(HPackParser* parser,
if ( r . value ( ) ! = nullptr ) {
headers = std : : move ( r . value ( ) ) ;
}
} else if ( header . header_length ! = 0 ) {
return absl : : InvalidArgumentError ( absl : : StrCat (
" Unexpected non-zero header length " , header . header_length ) ) ;
}
if ( header . flags . is_set ( 1 ) ) {
if ( header . trailer_length ! = 0 ) {
@ -210,8 +216,8 @@ absl::Status ClientFragmentFrame::Deserialize(HPackParser* parser,
}
SliceBuffer ClientFragmentFrame : : Serialize ( HPackCompressor * encoder ) const {
GPR_ASSERT ( frame_header . stream_id ! = 0 ) ;
FrameSerializer serializer ( frame_header ) ;
GPR_ASSERT ( stream_id ! = 0 ) ;
FrameSerializer serializer ( FrameType : : kFragment , stream_id , message_padding ) ;
if ( headers . get ( ) ! = nullptr ) {
encoder - > EncodeRawHeaders ( * headers . get ( ) , serializer . AddHeaders ( ) ) ;
}
@ -221,6 +227,16 @@ SliceBuffer ClientFragmentFrame::Serialize(HPackCompressor* encoder) const {
return serializer . Finish ( ) ;
}
std : : string ClientFragmentFrame : : ToString ( ) const {
return absl : : StrCat (
" ClientFragmentFrame{stream_id= " , stream_id , " , headers= " ,
headers . get ( ) ! = nullptr ? headers - > DebugString ( ) . c_str ( ) : " nullptr " ,
" , message= " ,
message . get ( ) ! = nullptr ? message - > DebugString ( ) . c_str ( ) : " nullptr " ,
" , message_padding= " , message_padding , " , end_of_stream= " , end_of_stream ,
" } " ) ;
}
absl : : Status ServerFragmentFrame : : Deserialize ( HPackParser * parser ,
const FrameHeader & header ,
absl : : BitGenRef bitsrc ,
@ -228,7 +244,8 @@ absl::Status ServerFragmentFrame::Deserialize(HPackParser* parser,
if ( header . stream_id = = 0 ) {
return absl : : InvalidArgumentError ( " Expected non-zero stream id " ) ;
}
frame_header = header ;
stream_id = header . stream_id ;
message_padding = header . message_padding ;
FrameDeserializer deserializer ( header , slice_buffer ) ;
if ( header . flags . is_set ( 0 ) ) {
auto r =
@ -238,6 +255,9 @@ absl::Status ServerFragmentFrame::Deserialize(HPackParser* parser,
if ( r . value ( ) ! = nullptr ) {
headers = std : : move ( r . value ( ) ) ;
}
} else if ( header . header_length ! = 0 ) {
return absl : : InvalidArgumentError ( absl : : StrCat (
" Unexpected non-zero header length " , header . header_length ) ) ;
}
if ( header . flags . is_set ( 1 ) ) {
auto r =
@ -247,13 +267,16 @@ absl::Status ServerFragmentFrame::Deserialize(HPackParser* parser,
if ( r . value ( ) ! = nullptr ) {
trailers = std : : move ( r . value ( ) ) ;
}
} else if ( header . trailer_length ! = 0 ) {
return absl : : InvalidArgumentError ( absl : : StrCat (
" Unexpected non-zero trailer length " , header . trailer_length ) ) ;
}
return deserializer . Finish ( ) ;
}
SliceBuffer ServerFragmentFrame : : Serialize ( HPackCompressor * encoder ) const {
GPR_ASSERT ( frame_header . stream_id ! = 0 ) ;
FrameSerializer serializer ( frame_header ) ;
GPR_ASSERT ( stream_id ! = 0 ) ;
FrameSerializer serializer ( FrameType : : kFragment , stream_id , message_padding ) ;
if ( headers . get ( ) ! = nullptr ) {
encoder - > EncodeRawHeaders ( * headers . get ( ) , serializer . AddHeaders ( ) ) ;
}
@ -263,6 +286,17 @@ SliceBuffer ServerFragmentFrame::Serialize(HPackCompressor* encoder) const {
return serializer . Finish ( ) ;
}
std : : string ServerFragmentFrame : : ToString ( ) const {
return absl : : StrCat (
" ServerFragmentFrame{stream_id= " , stream_id , " , headers= " ,
headers . get ( ) ! = nullptr ? headers - > DebugString ( ) . c_str ( ) : " nullptr " ,
" , message= " ,
message . get ( ) ! = nullptr ? message - > DebugString ( ) . c_str ( ) : " nullptr " ,
" , message_padding= " , message_padding , " , trailers= " ,
trailers . get ( ) ! = nullptr ? trailers - > DebugString ( ) . c_str ( ) : " nullptr " ,
" } " ) ;
}
absl : : Status CancelFrame : : Deserialize ( HPackParser * , const FrameHeader & header ,
absl : : BitGenRef ,
SliceBuffer & slice_buffer ) {
@ -282,10 +316,13 @@ absl::Status CancelFrame::Deserialize(HPackParser*, const FrameHeader& header,
SliceBuffer CancelFrame : : Serialize ( HPackCompressor * ) const {
GPR_ASSERT ( stream_id ! = 0 ) ;
FrameSerializer serializer (
FrameHeader { FrameType : : kCancel , { } , stream_id , 0 , 0 , 0 , 0 } ) ;
FrameSerializer serializer ( FrameType : : kCancel , stream_id , 0 ) ;
return serializer . Finish ( ) ;
}
std : : string CancelFrame : : ToString ( ) const {
return absl : : StrCat ( " CancelFrame{stream_id= " , stream_id , " } " ) ;
}
} // namespace chaotic_good
} // namespace grpc_core