培训考核三期,新版培训,网页版培训登录器
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.
 
 

126 lines
3.5 KiB

using System;
using BestHTTP.Logger;
namespace BestHTTP.Connections
{
public abstract class ConnectionBase : IDisposable
{
#region Public Properties
/// <summary>
/// The address of the server that this connection is bound to.
/// </summary>
public string ServerAddress { get; protected set; }
/// <summary>
/// The state of this connection.
/// </summary>
public HTTPConnectionStates State { get; internal set; }
/// <summary>
/// If the State is HTTPConnectionStates.Processing, then it holds a HTTPRequest instance. Otherwise it's null.
/// </summary>
public HTTPRequest CurrentRequest { get; internal set; }
/// <summary>
/// How much the connection kept alive after its last request processing.
/// </summary>
public virtual TimeSpan KeepAliveTime { get; protected set; }
public virtual bool CanProcessMultiple { get { return false; } }
/// <summary>
/// When we start to process the current request. It's set after the connection is established.
/// </summary>
public DateTime StartTime { get; protected set; }
public Uri LastProcessedUri { get; protected set; }
public DateTime LastProcessTime { get; protected set; }
internal LoggingContext Context;
#endregion
#region Privates
private bool IsThreaded;
#endregion
public ConnectionBase(string serverAddress)
:this(serverAddress, true)
{}
public ConnectionBase(string serverAddress, bool threaded)
{
this.ServerAddress = serverAddress;
this.State = HTTPConnectionStates.Initial;
this.LastProcessTime = DateTime.Now;
this.KeepAliveTime = HTTPManager.MaxConnectionIdleTime;
this.IsThreaded = threaded;
this.Context = new LoggingContext(this);
this.Context.Add("ServerAddress", serverAddress);
this.Context.Add("Threaded", threaded);
}
internal virtual void Process(HTTPRequest request)
{
if (State == HTTPConnectionStates.Processing)
throw new Exception("Connection already processing a request! " + this.ToString());
StartTime = DateTime.MaxValue;
State = HTTPConnectionStates.Processing;
CurrentRequest = request;
LastProcessedUri = CurrentRequest.CurrentUri;
if (IsThreaded)
PlatformSupport.Threading.ThreadedRunner.RunLongLiving(ThreadFunc);
else
ThreadFunc();
}
protected virtual void ThreadFunc()
{
}
public ShutdownTypes ShutdownType { get; protected set; }
/// <summary>
/// Called when the plugin shuts down immediately.
/// </summary>
public virtual void Shutdown(ShutdownTypes type)
{
this.ShutdownType = type;
}
#region Dispose Pattern
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
}
~ConnectionBase()
{
Dispose(false);
}
#endregion
public override string ToString()
{
return string.Format("[{0}:{1}]", this.GetHashCode(), this.ServerAddress);
}
public virtual bool TestConnection() => true;
}
}