This commit is contained in:
wanghongenpin
2025-05-15 01:46:37 +08:00
parent c94ff7eba9
commit 244fde4dc6
6 changed files with 33 additions and 19 deletions

View File

@@ -79,6 +79,11 @@ class HeadersFrame extends Frame {
HeadersFrame(super.header, this.padLength, this.exclusiveDependency, this.streamDependency, this.weight,
this.headerBlockFragment);
@override
String toString() {
return "HeadersFrame{padLength: $padLength, exclusiveDependency: $exclusiveDependency, streamDependency: $streamDependency, weight: $weight, headerBlockFragment: ${headerBlockFragment.length}}";
}
}
class DataFrame extends Frame {

View File

@@ -102,7 +102,7 @@ abstract class Http2Codec<T extends HttpMessage> implements Codec<T, T> {
var result = DecoderResult<T>(isDone: false);
// logger.d(
// "${this is Http2RequestDecoder ? 'request' : 'response'} streamId: ${frameHeader.streamIdentifier} ${frameHeader.type} endHeaders: ${frameHeader.hasEndHeadersFlag} "
// "[${channelContext.clientChannel?.id}] ${this is Http2RequestDecoder ? 'request' : 'response'} streamId:${frameHeader.streamIdentifier} ${frameHeader.type} endHeaders: ${frameHeader.hasEndHeadersFlag} "
// "endStream: ${frameHeader.hasEndStreamFlag} ${frameHeader.length}");
//根据帧类型进行处理
switch (frameHeader.type) {
@@ -192,10 +192,10 @@ abstract class Http2Codec<T extends HttpMessage> implements Codec<T, T> {
var chunkSize = min(maxFrameSize, payload.length);
var chunk = payload.sublist(0, chunkSize);
payload = payload.sublist(chunkSize);
_writeFrame(bytesBuilder, FrameType.data, 0, data.streamId!, chunk);
_writeFrame(channelContext, bytesBuilder, FrameType.data, 0, data.streamId!, chunk);
}
_writeFrame(bytesBuilder, FrameType.data, FrameHeader.flagsEndStream, data.streamId!, payload);
_writeFrame(channelContext, bytesBuilder, FrameType.data, FrameHeader.flagsEndStream, data.streamId!, payload);
}
return bytesBuilder.takeBytes();
@@ -227,14 +227,15 @@ abstract class Http2Codec<T extends HttpMessage> implements Codec<T, T> {
while (fragment.length > maxSize) {
var chunk = fragment.sublist(0, maxSize);
fragment = fragment.sublist(maxSize);
_writeFrame(bytesBuilder, FrameType.continuation, 0, streamId, chunk);
_writeFrame(channelContext, bytesBuilder, FrameType.continuation, 0, streamId, chunk);
}
_writeFrame(bytesBuilder, FrameType.continuation, FrameHeader.flagsEndHeaders, streamId, fragment);
_writeFrame(
channelContext, bytesBuilder, FrameType.continuation, FrameHeader.flagsEndHeaders, streamId, fragment);
if (endStream) {
//如果没有body发送一个空的DATA帧
_writeFrame(bytesBuilder, FrameType.data, FrameHeader.flagsEndStream, streamId, []);
_writeFrame(channelContext, bytesBuilder, FrameType.data, FrameHeader.flagsEndStream, streamId, []);
}
}
}
@@ -257,13 +258,17 @@ abstract class Http2Codec<T extends HttpMessage> implements Codec<T, T> {
];
}
_writeFrame(bytesBuilder, FrameType.headers, flags, streamId, payload);
// logger.d(
// "[${channelContext.clientChannel?.id}] ${this is Http2RequestDecoder ? 'request' : 'response'} _writeHeadersFrame streamId:$streamId flags:$flags originFlags:${streamPriority?.header.flags} ${streamPriority} ${payload.length}");
_writeFrame(channelContext, bytesBuilder, FrameType.headers, flags, streamId, payload);
}
void _writeFrame(BytesBuilder bytesBuilder, FrameType type, int flags, int streamId, List<int> payload) {
void _writeFrame(ChannelContext channelContext, BytesBuilder bytesBuilder, FrameType type, int flags, int streamId,
List<int> payload) {
FrameHeader frameHeader = FrameHeader(payload.length, type, flags, streamId);
// logger.d(
// "${this is Http2RequestDecoder ? 'request' : 'response'} _writeFrame streamId: ${frameHeader.streamIdentifier} ${frameHeader.type} flags:${frameHeader.flags} endHeaders: ${frameHeader.hasEndHeadersFlag} endStream: ${frameHeader.hasEndStreamFlag} ${payload.length}");
// "[${channelContext.clientChannel?.id}] ${this is Http2RequestDecoder ? 'request' : 'response'} _writeFrame streamId:${frameHeader.streamIdentifier} ${frameHeader.type} flags:${frameHeader.flags} endHeaders: ${frameHeader.hasEndHeadersFlag} endStream: ${frameHeader.hasEndStreamFlag} ${payload.length}");
bytesBuilder.add(frameHeader.encode());
bytesBuilder.add(payload);