[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/gtechx/NetCoreServer/master/source/NetCoreServer/HttpServer.cs [Back]  [Original]

using System;
using System.Net;
using System.IO;

namespace NetCoreServer
{
    /// 
    /// HTTP server is used to create HTTP Web server and communicate with clients using HTTP protocol. It allows to receive GET, POST, PUT, DELETE requests and send HTTP responses.
    /// 
    /// Thread-safe.
    public class HttpServer : TcpServer
    {
        /// 
        /// Initialize HTTP server with a given IP address and port number
        /// 
        /// IP address
        /// Port number
        public HttpServer(IPAddress address, int port) : base(address, port) { Cache = new FileCache(); }
        /// 
        /// Initialize HTTP server with a given IP address and port number
        /// 
        /// IP address
        /// Port number
        public HttpServer(string address, int port) : base(address, port) { Cache = new FileCache(); }
        /// 
        /// Initialize HTTP server with a given DNS endpoint
        /// 
        /// DNS endpoint
        public HttpServer(DnsEndPoint endpoint) : base(endpoint) { Cache = new FileCache(); }
        /// 
        /// Initialize HTTP server with a given IP endpoint
        /// 
        /// IP endpoint
        public HttpServer(IPEndPoint endpoint) : base(endpoint) { Cache = new FileCache(); }

        /// 
        /// Get the static content cache
        /// 
        public FileCache Cache { get; }

        /// 
        /// Add static content cache
        /// 
        /// Static content path
        /// Cache prefix (default is "/")
        /// Cache filter (default is "*.*")
        /// Refresh cache timeout (default is 1 hour)
        public void AddStaticContent(string path, string prefix = "/", string filter = "*.*", TimeSpan? timeout = null)
        {
            timeout ??= TimeSpan.FromHours(1);

            bool Handler(FileCache cache, string key, byte[] value, TimeSpan timespan)
            {
                var response = new HttpResponse();
                response.SetBegin(200);
                response.SetContentType(Path.GetExtension(key));
                response.SetHeader("Cache-Control", $"max-age={timespan.Seconds}");
                response.SetBody(value);
                return cache.Add(key, response.Cache.Data, timespan);
            }

            Cache.InsertPath(path, prefix, filter, timeout.Value, Handler);
        }
        /// 
        /// Remove static content cache
        /// 
        /// Static content path
        public void RemoveStaticContent(string path) { Cache.RemovePath(path); }
        /// 
        /// Clear static content cache
        /// 
        public void ClearStaticContent() { Cache.Clear(); }

        protected override TcpSession CreateSession() { return new HttpSession(this); }

        #region IDisposable implementation

        // Disposed flag.
        private bool _disposed;

        protected override void Dispose(bool disposingManagedResources)
        {
            if (!_disposed)
            {
                if (disposingManagedResources)
                {
                    // Dispose managed resources here...
                    Cache.Dispose();
                }

                // Dispose unmanaged resources here...

                // Set large fields to null here...

                // Mark as disposed.
                _disposed = true;
            }

            // Call Dispose in the base class.
            base.Dispose(disposingManagedResources);
        }

        // The derived class does not have a Finalize method
        // or a Dispose method without parameters because it inherits
        // them from the base class.

        #endregion
    }
}

Web Proxy Viewer  |  New URL  |  Original Page