73 lines
2.3 KiB
C#
73 lines
2.3 KiB
C#
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
|
|
#pragma warning disable
|
|
using System;
|
|
using System.IO;
|
|
|
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Zlib;
|
|
|
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
|
|
{
|
|
public class TlsDeflateCompression : TlsCompression
|
|
{
|
|
public const int LEVEL_NONE = JZlib.Z_NO_COMPRESSION;
|
|
public const int LEVEL_FASTEST = JZlib.Z_BEST_SPEED;
|
|
public const int LEVEL_SMALLEST = JZlib.Z_BEST_COMPRESSION;
|
|
public const int LEVEL_DEFAULT = JZlib.Z_DEFAULT_COMPRESSION;
|
|
|
|
protected readonly ZStream zIn, zOut;
|
|
|
|
public TlsDeflateCompression()
|
|
: this(LEVEL_DEFAULT)
|
|
{
|
|
}
|
|
|
|
public TlsDeflateCompression(int level)
|
|
{
|
|
this.zIn = new ZStream();
|
|
this.zIn.inflateInit();
|
|
|
|
this.zOut = new ZStream();
|
|
this.zOut.deflateInit(level);
|
|
}
|
|
|
|
public virtual Stream Compress(Stream output)
|
|
{
|
|
return new DeflateOutputStream(output, zOut, true);
|
|
}
|
|
|
|
public virtual Stream Decompress(Stream output)
|
|
{
|
|
return new DeflateOutputStream(output, zIn, false);
|
|
}
|
|
|
|
protected class DeflateOutputStream : ZOutputStream
|
|
{
|
|
public DeflateOutputStream(Stream output, ZStream z, bool compress)
|
|
: base(output, z)
|
|
{
|
|
this.compress = compress;
|
|
|
|
/*
|
|
* See discussion at http://www.bolet.org/~pornin/deflate-flush.html .
|
|
*/
|
|
this.FlushMode = JZlib.Z_SYNC_FLUSH;
|
|
}
|
|
|
|
public override void Flush()
|
|
{
|
|
/*
|
|
* TODO The inflateSyncPoint doesn't appear to work the way I hoped at the moment.
|
|
* In any case, we may like to accept PARTIAL_FLUSH input, not just SYNC_FLUSH.
|
|
* It's not clear how to check this in the Inflater.
|
|
*/
|
|
//if (!this.compress && (z == null || z.istate == null || z.istate.inflateSyncPoint(z) <= 0))
|
|
//{
|
|
// throw new TlsFatalAlert(AlertDescription.decompression_failure);
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#pragma warning restore
|
|
#endif
|