mirror of
https://github.com/wanghongenpin/proxypin.git
synced 2026-05-10 00:44:12 +08:00
add log
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
//只能有一个写入
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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*/
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user