1515using System . IO . Pipelines ;
1616using System . Buffers ;
1717using System . Collections . ObjectModel ;
18+ using Nerdbank . Streams ;
1819
1920namespace Quick . Protocol
2021{
@@ -894,7 +895,8 @@ private async Task ReadRecvPipeAsync(PipeReader recvReader, CancellationToken to
894895 Pipe decryptPipe = null ;
895896 byte [ ] decryptBuffer1 = null ;
896897 byte [ ] decryptBuffer2 = null ;
897- //Pipe decompressPipe = null;
898+ //解压相关变量
899+ Pipe decompressPipe = null ;
898900 try
899901 {
900902 while ( ! token . IsCancellationRequested )
@@ -918,9 +920,10 @@ private async Task ReadRecvPipeAsync(PipeReader recvReader, CancellationToken to
918920 //如果设置了压缩或者加密
919921 if ( options . InternalCompress || options . InternalEncrypt )
920922 {
921- //如果设置了加密,则先解密
923+ //如果设置了加密
922924 if ( options . InternalEncrypt )
923925 {
926+ //准备管道
924927 if ( decryptPipe == null )
925928 {
926929 decryptPipe = new Pipe ( ) ;
@@ -960,30 +963,35 @@ private async Task ReadRecvPipeAsync(PipeReader recvReader, CancellationToken to
960963 currentReader = decryptPipe . Reader ;
961964 }
962965
963- /*
964- //如果设置了压缩,则先解压
966+ //如果设置了压缩
965967 if ( options . InternalCompress )
966968 {
967- var retBuffer = getFreeBuffer(currentPackageBuffer.Array, recvBuffer, recvBuffer2);
968- var count = 0;
969- using (var readMs = new MemoryStream(currentPackageBuffer.Array, PACKAGE_TOTAL_LENGTH_LENGTH + currentPackageBuffer.Offset, currentPackageBuffer.Count - PACKAGE_TOTAL_LENGTH_LENGTH, false))
970- using (var writeMs = new MemoryStream(retBuffer, 0, retBuffer.Length))
971- {
972- using (var gzStream = new GZipStream(readMs, CompressionMode.Decompress, true))
973- gzStream.CopyTo(writeMs);
974- count = Convert.ToInt32(writeMs.Position);
969+ //准备管道
970+ if ( decompressPipe == null )
971+ decompressPipe = new Pipe ( ) ;
972+
973+ //写入包头
974+ decompressPipe . Writer . GetMemory ( PACKAGE_TOTAL_LENGTH_LENGTH ) ;
975+ decompressPipe . Writer . Advance ( PACKAGE_TOTAL_LENGTH_LENGTH ) ;
976+ packageTotalLength = PACKAGE_TOTAL_LENGTH_LENGTH ;
977+
978+ //开始解压
979+ var compressedBuffer = packageBuffer . Slice ( PACKAGE_TOTAL_LENGTH_LENGTH ) ;
980+ using ( var readMs = compressedBuffer . AsStream ( ) )
981+ using ( var gzStream = new GZipStream ( readMs , CompressionMode . Decompress , true ) )
982+ {
983+ var count = await gzStream . ReadAsync ( decompressPipe . Writer . GetMemory ( minimumBufferSize ) , token ) . ConfigureAwait ( false ) ;
984+ decompressPipe . Writer . Advance ( count ) ;
985+ packageTotalLength += count ;
975986 }
976- var currentBuffer = getFreeBuffer(retBuffer, recvBuffer, recvBuffer2);
977- packageTotalLength = PACKAGE_TOTAL_LENGTH_LENGTH + count;
978- writePackageTotalLengthToBuffer(currentBuffer, 0, packageTotalLength);
979- Array.Copy(retBuffer, 0, currentBuffer, PACKAGE_TOTAL_LENGTH_LENGTH, count);
980- currentPackageBuffer = new ArraySegment<byte>(currentBuffer, 0, packageTotalLength);
981- }
982- */
983- }
984- else
985- {
987+ await decompressPipe . Writer . FlushAsync ( ) . ConfigureAwait ( false ) ;
988+ //解压完成,释放缓存
989+ currentReader . AdvanceTo ( packageBuffer . End ) ;
986990
991+ ret = await decompressPipe . Reader . ReadAtLeastAsync ( packageTotalLength , token ) . ConfigureAwait ( false ) ;
992+ packageBuffer = ret . Buffer ;
993+ currentReader = decompressPipe . Reader ;
994+ }
987995 }
988996
989997 //包类型
0 commit comments