123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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;
- }
- }
|