You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.7 KiB
124 lines
3.7 KiB
8 months ago
|
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
|
||
|
#pragma warning disable
|
||
|
using System;
|
||
|
|
||
|
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Date;
|
||
|
|
||
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
|
||
|
{
|
||
|
internal class Timeout
|
||
|
{
|
||
|
private long durationMillis;
|
||
|
private long startMillis;
|
||
|
|
||
|
internal Timeout(long durationMillis)
|
||
|
: this(durationMillis, DateTimeUtilities.CurrentUnixMs())
|
||
|
{
|
||
|
}
|
||
|
|
||
|
internal Timeout(long durationMillis, long currentTimeMillis)
|
||
|
{
|
||
|
this.durationMillis = System.Math.Max(0, durationMillis);
|
||
|
this.startMillis = System.Math.Max(0, currentTimeMillis);
|
||
|
}
|
||
|
|
||
|
//internal long RemainingMillis()
|
||
|
//{
|
||
|
// return RemainingMillis(DateTimeUtilities.CurrentUnixMs());
|
||
|
//}
|
||
|
|
||
|
internal long RemainingMillis(long currentTimeMillis)
|
||
|
{
|
||
|
lock (this)
|
||
|
{
|
||
|
// If clock jumped backwards, reset start time
|
||
|
if (startMillis > currentTimeMillis)
|
||
|
{
|
||
|
startMillis = currentTimeMillis;
|
||
|
return durationMillis;
|
||
|
}
|
||
|
|
||
|
long elapsed = currentTimeMillis - startMillis;
|
||
|
long remaining = durationMillis - elapsed;
|
||
|
|
||
|
// Once timeout reached, lock it in
|
||
|
if (remaining <= 0)
|
||
|
return durationMillis = 0L;
|
||
|
|
||
|
return remaining;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//internal static int ConstrainWaitMillis(int waitMillis, Timeout timeout)
|
||
|
//{
|
||
|
// return constrainWaitMillis(waitMillis, timeout, DateTimeUtilities.CurrentUnixMs());
|
||
|
//}
|
||
|
|
||
|
internal static int ConstrainWaitMillis(int waitMillis, Timeout timeout, long currentTimeMillis)
|
||
|
{
|
||
|
if (waitMillis < 0)
|
||
|
return -1;
|
||
|
|
||
|
int timeoutMillis = GetWaitMillis(timeout, currentTimeMillis);
|
||
|
if (timeoutMillis < 0)
|
||
|
return -1;
|
||
|
|
||
|
if (waitMillis == 0)
|
||
|
return timeoutMillis;
|
||
|
|
||
|
if (timeoutMillis == 0)
|
||
|
return waitMillis;
|
||
|
|
||
|
return System.Math.Min(waitMillis, timeoutMillis);
|
||
|
}
|
||
|
|
||
|
internal static Timeout ForWaitMillis(int waitMillis)
|
||
|
{
|
||
|
return ForWaitMillis(waitMillis, DateTimeUtilities.CurrentUnixMs());
|
||
|
}
|
||
|
|
||
|
internal static Timeout ForWaitMillis(int waitMillis, long currentTimeMillis)
|
||
|
{
|
||
|
if (waitMillis < 0)
|
||
|
throw new ArgumentException("cannot be negative", "waitMillis");
|
||
|
|
||
|
if (waitMillis > 0)
|
||
|
return new Timeout(waitMillis, currentTimeMillis);
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
//internal static int GetWaitMillis(Timeout timeout)
|
||
|
//{
|
||
|
// return GetWaitMillis(timeout, DateTimeUtilities.CurrentUnixMs());
|
||
|
//}
|
||
|
|
||
|
internal static int GetWaitMillis(Timeout timeout, long currentTimeMillis)
|
||
|
{
|
||
|
if (null == timeout)
|
||
|
return 0;
|
||
|
|
||
|
long remainingMillis = timeout.RemainingMillis(currentTimeMillis);
|
||
|
if (remainingMillis < 1L)
|
||
|
return -1;
|
||
|
|
||
|
if (remainingMillis > int.MaxValue)
|
||
|
return int.MaxValue;
|
||
|
|
||
|
return (int)remainingMillis;
|
||
|
}
|
||
|
|
||
|
internal static bool HasExpired(Timeout timeout)
|
||
|
{
|
||
|
return HasExpired(timeout, DateTimeUtilities.CurrentUnixMs());
|
||
|
}
|
||
|
|
||
|
internal static bool HasExpired(Timeout timeout, long currentTimeMillis)
|
||
|
{
|
||
|
return null != timeout && timeout.RemainingMillis(currentTimeMillis) < 1L;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#pragma warning restore
|
||
|
#endif
|