using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.IO.Compression; namespace MediaBrowser.Common.Net.Handlers { public abstract class BaseHandler { /// /// Response headers /// public IDictionary Headers = new Dictionary(); public virtual bool UseChunkedEncoding { get { return true; } } public virtual long? ContentLength { get { return null; } } /// /// Returns true or false indicating if the handler writes to the stream asynchronously. /// If so the subclass will be responsible for disposing the stream when complete. /// protected virtual bool IsAsyncHandler { get { return false; } } /// /// The action to write the response to the output stream /// public virtual Action WriteStream { get { return s => { WriteReponse(s); if (!IsAsyncHandler) { s.Dispose(); } }; } } /// /// The original RequestContext /// public RequestContext RequestContext { get; set; } /// /// The original QueryString /// protected NameValueCollection QueryString { get { return RequestContext.Request.QueryString; } } /// /// Gets the MIME type to include in the response headers /// public abstract string ContentType { get; } /// /// Gets the status code to include in the response headers /// public virtual int StatusCode { get { return 200; } } /// /// Gets the cache duration to include in the response headers /// public virtual TimeSpan CacheDuration { get { return TimeSpan.FromTicks(0); } } /// /// Gets the last date modified of the content being returned, if this can be determined. /// This will be used to invalidate the cache, so it's not needed if CacheDuration is 0. /// public virtual DateTime? LastDateModified { get { return null; } } public virtual bool CompressResponse { get { return true; } } private void WriteReponse(Stream stream) { if (CompressResponse) { using (DeflateStream compressedStream = new DeflateStream(stream, CompressionLevel.Fastest, false)) { WriteResponseToOutputStream(compressedStream); } } else { WriteResponseToOutputStream(stream); } } protected abstract void WriteResponseToOutputStream(Stream stream); } }