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

@@ -39,7 +39,7 @@ abstract class ChannelHandler<T> {
///连接断开
void channelInactive(ChannelContext channelContext, Channel channel) {
// log.i("close $channel");
//log.i("[${channel.id}] close $channel");
}
void exceptionCaught(ChannelContext channelContext, Channel channel, dynamic error, {StackTrace? trace}) {
@@ -104,7 +104,7 @@ class Channel {
return secureSocket;
}
String? get selectedProtocol => isSsl ? (_socket as SecureSocket).selectedProtocol : null;
String? get selectedProtocol => isSsl && isOpen ? (_socket as SecureSocket).selectedProtocol : null;
///是否是ssl链接
bool get isSsl => _socket is SecureSocket;
@@ -116,8 +116,7 @@ class Channel {
Future<void> writeBytes(List<int> bytes) async {
if (isClosed) {
logger.w("[$id] channel is closed");
return;
logger.w("[$id] $remoteSocketAddress channel is closed", stackTrace: StackTrace.current);
}
//只能有一个写入

View File

@@ -153,7 +153,7 @@ class ChannelDispatcher extends ChannelHandler<Uint8List> {
handler.channelRead(channelContext, channel, data!);
} catch (error, trace) {
logger.e(
"[${channelContext.clientChannel?.id}] channelRead error isSsl:${channel.isSsl} ${channelContext.clientChannel?.selectedProtocol} ${channelContext.serverChannel?.selectedProtocol} ${String.fromCharCodes(buffer.bytes)}",
"[${channelContext.clientChannel?.id}] channelRead error isSsl:${channel.isSsl} client: ${channelContext.clientChannel?.selectedProtocol} server: ${channelContext.serverChannel?.selectedProtocol} ${String.fromCharCodes(buffer.bytes)}",
error: error,
stackTrace: trace);
buffer.clear();

View File

@@ -174,17 +174,21 @@ class Server extends Network {
//ssl自签证书
var certificate = await CertificateManager.getCertificateContext(serviceName!);
var selectedProtocol = remoteChannel?.selectedProtocol;
if (selectedProtocol != null) certificate.setAlpnProtocols([selectedProtocol], true);
var supportedProtocols = selectedProtocol != null ? [selectedProtocol] : ['http/1.1'];
certificate.setAlpnProtocols(supportedProtocols, true);
//处理客户端ssl握手
var secureSocket = await SecureSocket.secureServer(channel.socket, certificate, bufferedData: data,
supportedProtocols: selectedProtocol != null ? [selectedProtocol] : null);
var secureSocket = await SecureSocket.secureServer(channel.socket, certificate,
bufferedData: data, supportedProtocols: supportedProtocols);
channel.serverSecureSocket(secureSocket, channelContext);
} catch (error, trace) {
logger.e('[${channel.id}] $hostAndPort ssl error', error: error, stackTrace: trace);
try {
channelContext.processInfo ??=
await ProcessInfoUtils.getProcessByPort(channel.remoteSocketAddress, hostAndPort?.domain ?? 'unknown');
await ProcessInfoUtils.getProcessByPort(channel.remoteSocketAddress, hostAndPort?.domain ?? 'unknown');
} catch (ignore) {
/*ignore*/
}

View File

@@ -87,7 +87,8 @@ class HttpProxyChannelHandler extends ChannelHandler<HttpRequest> {
//实现抓包代理转发
if (httpRequest.method != HttpMethod.connect) {
log.d("[${channel.id}] ${httpRequest.protocolVersion} ${httpRequest.method.name} ${httpRequest.requestUrl}");
log.d(
"[${channel.id}] streamId:${httpRequest.streamId} ${httpRequest.protocolVersion} ${httpRequest.method.name} ${httpRequest.requestUrl}");
if (HostFilter.filter(httpRequest.hostAndPort?.host)) {
await remoteChannel.write(channelContext, httpRequest);
return;

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);