From 80b3ad7bd20329e6a5bbf6eeb76af62c87434a7c Mon Sep 17 00:00:00 2001 From: LukePulverenti Luke Pulverenti luke pulverenti Date: Thu, 19 Jul 2012 22:22:44 -0400 Subject: Moved the http server to it's own assembly. added comments and made other minor re-organizations. --- MediaBrowser.Common/Net/CollectionExtensions.cs | 14 --- .../Net/Handlers/BaseEmbeddedResourceHandler.cs | 70 ------------- MediaBrowser.Common/Net/Handlers/JsonHandler.cs | 36 ------- MediaBrowser.Common/Net/HttpServer.cs | 42 -------- MediaBrowser.Common/Net/Request.cs | 18 ---- MediaBrowser.Common/Net/RequestContext.cs | 112 --------------------- MediaBrowser.Common/Net/Response.cs | 77 -------------- MediaBrowser.Common/Net/StreamExtensions.cs | 19 ---- 8 files changed, 388 deletions(-) delete mode 100644 MediaBrowser.Common/Net/CollectionExtensions.cs delete mode 100644 MediaBrowser.Common/Net/Handlers/BaseEmbeddedResourceHandler.cs delete mode 100644 MediaBrowser.Common/Net/Handlers/JsonHandler.cs delete mode 100644 MediaBrowser.Common/Net/HttpServer.cs delete mode 100644 MediaBrowser.Common/Net/Request.cs delete mode 100644 MediaBrowser.Common/Net/RequestContext.cs delete mode 100644 MediaBrowser.Common/Net/Response.cs delete mode 100644 MediaBrowser.Common/Net/StreamExtensions.cs (limited to 'MediaBrowser.Common/Net') diff --git a/MediaBrowser.Common/Net/CollectionExtensions.cs b/MediaBrowser.Common/Net/CollectionExtensions.cs deleted file mode 100644 index 98d24dfc04..0000000000 --- a/MediaBrowser.Common/Net/CollectionExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; - -namespace MediaBrowser.Common.Net -{ - public static class CollectionExtensions - { - public static IDictionary> ToDictionary(this NameValueCollection source) - { - return source.AllKeys.ToDictionary>(key => key, source.GetValues); - } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/Net/Handlers/BaseEmbeddedResourceHandler.cs b/MediaBrowser.Common/Net/Handlers/BaseEmbeddedResourceHandler.cs deleted file mode 100644 index e64773f33f..0000000000 --- a/MediaBrowser.Common/Net/Handlers/BaseEmbeddedResourceHandler.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.IO; -using System.IO.Compression; -using System; - -namespace MediaBrowser.Common.Net.Handlers -{ - public abstract class BaseEmbeddedResourceHandler : Response - { - public BaseEmbeddedResourceHandler(RequestContext ctx, string resourcePath) - : base(ctx) - { - ResourcePath = resourcePath; - - Headers["Content-Encoding"] = "gzip"; - - WriteStream = s => - { - WriteReponse(s); - s.Close(); - }; - } - - protected string ResourcePath { get; set; } - - public override string ContentType - { - get - { - string extension = Path.GetExtension(ResourcePath); - - if (extension.EndsWith("jpeg", StringComparison.OrdinalIgnoreCase) || extension.EndsWith("jpg", StringComparison.OrdinalIgnoreCase)) - { - return "image/jpeg"; - } - else if (extension.EndsWith("png", StringComparison.OrdinalIgnoreCase)) - { - return "image/png"; - } - else if (extension.EndsWith("ico", StringComparison.OrdinalIgnoreCase)) - { - return "image/ico"; - } - else if (extension.EndsWith("js", StringComparison.OrdinalIgnoreCase)) - { - return "application/x-javascript"; - } - else if (extension.EndsWith("css", StringComparison.OrdinalIgnoreCase)) - { - return "text/css"; - } - else if (extension.EndsWith("html", StringComparison.OrdinalIgnoreCase)) - { - return "text/html; charset=utf-8"; - } - - return "text/plain; charset=utf-8"; - } - } - - private void WriteReponse(Stream stream) - { - using (GZipStream gzipStream = new GZipStream(stream, CompressionMode.Compress, false)) - { - GetEmbeddedResourceStream().CopyTo(gzipStream); - } - } - - protected abstract Stream GetEmbeddedResourceStream(); - } -} diff --git a/MediaBrowser.Common/Net/Handlers/JsonHandler.cs b/MediaBrowser.Common/Net/Handlers/JsonHandler.cs deleted file mode 100644 index ecfdd311a1..0000000000 --- a/MediaBrowser.Common/Net/Handlers/JsonHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.IO; -using System.IO.Compression; -using MediaBrowser.Common.Json; - -namespace MediaBrowser.Common.Net.Handlers -{ - public abstract class JsonHandler : Response - { - public JsonHandler(RequestContext ctx) - : base(ctx) - { - Headers["Content-Encoding"] = "gzip"; - - WriteStream = s => - { - WriteReponse(s); - s.Close(); - }; - } - - public override string ContentType - { - get { return "application/json"; } - } - - protected abstract object ObjectToSerialize { get; } - - private void WriteReponse(Stream stream) - { - using (GZipStream gzipStream = new GZipStream(stream, CompressionMode.Compress, false)) - { - JsonSerializer.SerializeToStream(ObjectToSerialize, gzipStream); - } - } - } -} diff --git a/MediaBrowser.Common/Net/HttpServer.cs b/MediaBrowser.Common/Net/HttpServer.cs deleted file mode 100644 index fad8d13eb9..0000000000 --- a/MediaBrowser.Common/Net/HttpServer.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Net; -using System.Reactive.Linq; - -namespace MediaBrowser.Common.Net -{ - public class HttpServer : IObservable, IDisposable - { - private readonly HttpListener listener; - private readonly IObservable stream; - - public HttpServer(string url) - { - listener = new HttpListener(); - listener.Prefixes.Add(url); - listener.Start(); - stream = ObservableHttpContext(); - } - - private IObservable ObservableHttpContext() - { - return Observable.Create(obs => - Observable.FromAsyncPattern(listener.BeginGetContext, - listener.EndGetContext)() - .Select(c => new RequestContext(c)) - .Subscribe(obs)) - .Repeat() - .Retry() - .Publish() - .RefCount(); - } - public void Dispose() - { - listener.Stop(); - } - - public IDisposable Subscribe(IObserver observer) - { - return stream.Subscribe(observer); - } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/Net/Request.cs b/MediaBrowser.Common/Net/Request.cs deleted file mode 100644 index 795c9c36ba..0000000000 --- a/MediaBrowser.Common/Net/Request.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace MediaBrowser.Common.Net -{ - public class Request - { - public string HttpMethod { get; set; } - public IDictionary> Headers { get; set; } - public Stream InputStream { get; set; } - public string RawUrl { get; set; } - public int ContentLength - { - get { return int.Parse(Headers["Content-Length"].First()); } - } - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/Net/RequestContext.cs b/MediaBrowser.Common/Net/RequestContext.cs deleted file mode 100644 index d3635f34a5..0000000000 --- a/MediaBrowser.Common/Net/RequestContext.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Linq; -using System.Net; - -namespace MediaBrowser.Common.Net -{ - public class RequestContext - { - public HttpListenerRequest Request { get; private set; } - public HttpListenerResponse Response { get; private set; } - - public string LocalPath - { - get - { - return Request.Url.LocalPath; - } - } - - public RequestContext(HttpListenerContext context) - { - Response = context.Response; - Request = context.Request; - } - - public void Respond(Response handler) - { - Response.AddHeader("Access-Control-Allow-Origin", "*"); - - Response.KeepAlive = true; - - foreach (var header in handler.Headers) - { - Response.AddHeader(header.Key, header.Value); - } - - int statusCode = handler.StatusCode; - Response.ContentType = handler.ContentType; - - TimeSpan cacheDuration = handler.CacheDuration; - - if (Request.Headers.AllKeys.Contains("If-Modified-Since")) - { - DateTime ifModifiedSince; - - if (DateTime.TryParse(Request.Headers["If-Modified-Since"].Replace(" GMT", string.Empty), out ifModifiedSince)) - { - // If the cache hasn't expired yet just return a 304 - if (IsCacheValid(ifModifiedSince, cacheDuration, handler.LastDateModified)) - { - statusCode = 304; - } - } - } - - Response.SendChunked = true; - Response.StatusCode = statusCode; - - if (statusCode != 304) - { - if (cacheDuration.Ticks > 0) - { - CacheResponse(Response, cacheDuration, handler.LastDateModified); - } - handler.WriteStream(Response.OutputStream); - } - else - { - Response.OutputStream.Flush(); - Response.OutputStream.Close(); - } - } - - private void CacheResponse(HttpListenerResponse response, TimeSpan duration, DateTime? dateModified) - { - DateTime lastModified = dateModified ?? DateTime.Now; - - response.Headers[HttpResponseHeader.CacheControl] = "Public"; - response.Headers[HttpResponseHeader.Expires] = DateTime.Now.Add(duration).ToString("r"); - response.Headers[HttpResponseHeader.LastModified] = lastModified.ToString("r"); - } - - private bool IsCacheValid(DateTime ifModifiedSince, TimeSpan cacheDuration, DateTime? dateModified) - { - if (dateModified.HasValue) - { - DateTime lastModified = NormalizeDateForComparison(dateModified.Value); - ifModifiedSince = NormalizeDateForComparison(ifModifiedSince); - - return lastModified <= ifModifiedSince; - } - - DateTime cacheExpirationDate = ifModifiedSince.Add(cacheDuration); - - if (DateTime.Now < cacheExpirationDate) - { - return true; - } - - return false; - } - - /// - /// When the browser sends the IfModifiedDate, it's precision is limited to seconds, so this will account for that - /// - private DateTime NormalizeDateForComparison(DateTime date) - { - return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second); - } - - } -} \ No newline at end of file diff --git a/MediaBrowser.Common/Net/Response.cs b/MediaBrowser.Common/Net/Response.cs deleted file mode 100644 index 44b4e29622..0000000000 --- a/MediaBrowser.Common/Net/Response.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.IO; - -namespace MediaBrowser.Common.Net -{ - public abstract class Response - { - protected RequestContext RequestContext { get; private set; } - - protected NameValueCollection QueryString - { - get - { - return RequestContext.Request.QueryString; - } - } - - public Response(RequestContext ctx) - { - RequestContext = ctx; - - WriteStream = s => { }; - Headers = new Dictionary(); - } - - public abstract string ContentType { get; } - - public virtual int StatusCode - { - get - { - return 200; - } - } - - public virtual TimeSpan CacheDuration - { - get - { - return TimeSpan.FromTicks(0); - } - } - - public virtual DateTime? LastDateModified - { - get - { - return null; - } - } - - public IDictionary Headers { get; set; } - public Action WriteStream { get; set; } - } - - /*public class ByteResponse : Response - { - public ByteResponse(byte[] bytes) - { - WriteStream = async s => - { - await s.WriteAsync(bytes, 0, bytes.Length); - s.Close(); - }; - } - } - - public class StringResponse : ByteResponse - { - public StringResponse(string message) - : base(Encoding.UTF8.GetBytes(message)) - { - } - }*/ -} \ No newline at end of file diff --git a/MediaBrowser.Common/Net/StreamExtensions.cs b/MediaBrowser.Common/Net/StreamExtensions.cs deleted file mode 100644 index c10e458ada..0000000000 --- a/MediaBrowser.Common/Net/StreamExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.IO; -using System.Reactive.Linq; - -namespace MediaBrowser.Common.Net -{ - public static class StreamExtensions - { - public static IObservable ReadBytes(this Stream stream, int count) - { - var buffer = new byte[count]; - return Observable.FromAsyncPattern((cb, state) => stream.BeginRead(buffer, 0, count, cb, state), ar => - { - stream.EndRead(ar); - return buffer; - })(); - } - } -} \ No newline at end of file -- cgit v1.2.3