diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-24 16:53:54 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-24 16:53:54 -0500 |
| commit | 8ce3e74e8112a94773df22827849bf274fc88198 (patch) | |
| tree | a4ce1edf34466be697e2e432609f6be80b6c6df6 /MediaBrowser.Networking/Web | |
| parent | 6c86721f6de2acbe68e9419064ff21111ff3a223 (diff) | |
More DI
Diffstat (limited to 'MediaBrowser.Networking/Web')
| -rw-r--r-- | MediaBrowser.Networking/Web/HttpServer.cs | 21 | ||||
| -rw-r--r-- | MediaBrowser.Networking/Web/NativeWebSocket.cs | 145 | ||||
| -rw-r--r-- | MediaBrowser.Networking/Web/ServerFactory.cs | 28 |
3 files changed, 192 insertions, 2 deletions
diff --git a/MediaBrowser.Networking/Web/HttpServer.cs b/MediaBrowser.Networking/Web/HttpServer.cs index c280abedf..ab4b8558f 100644 --- a/MediaBrowser.Networking/Web/HttpServer.cs +++ b/MediaBrowser.Networking/Web/HttpServer.cs @@ -4,6 +4,7 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Net; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; using ServiceStack.Api.Swagger; using ServiceStack.Common.Web; using ServiceStack.Configuration; @@ -61,6 +62,12 @@ namespace MediaBrowser.Networking.Web private IDisposable HttpListener { get; set; } /// <summary> + /// Gets or sets the protobuf serializer. + /// </summary> + /// <value>The protobuf serializer.</value> + private IProtobufSerializer ProtobufSerializer { get; set; } + + /// <summary> /// Occurs when [web socket connected]. /// </summary> public event EventHandler<WebSocketConnectEventArgs> WebSocketConnected; @@ -82,17 +89,22 @@ namespace MediaBrowser.Networking.Web /// </summary> /// <param name="applicationHost">The application host.</param> /// <param name="kernel">The kernel.</param> + /// <param name="protobufSerializer">The protobuf serializer.</param> /// <param name="logger">The logger.</param> /// <param name="serverName">Name of the server.</param> /// <param name="defaultRedirectpath">The default redirectpath.</param> /// <exception cref="System.ArgumentNullException">urlPrefix</exception> - public HttpServer(IApplicationHost applicationHost, IKernel kernel, ILogger logger, string serverName, string defaultRedirectpath) + public HttpServer(IApplicationHost applicationHost, IKernel kernel, IProtobufSerializer protobufSerializer, ILogger logger, string serverName, string defaultRedirectpath) : base() { if (kernel == null) { throw new ArgumentNullException("kernel"); } + if (protobufSerializer == null) + { + throw new ArgumentNullException("protobufSerializer"); + } if (logger == null) { throw new ArgumentNullException("logger"); @@ -112,6 +124,7 @@ namespace MediaBrowser.Networking.Web ServerName = serverName; DefaultRedirectPath = defaultRedirectpath; + ProtobufSerializer = protobufSerializer; _logger = logger; ApplicationHost = applicationHost; @@ -121,7 +134,7 @@ namespace MediaBrowser.Networking.Web Kernel = kernel; EndpointHost.ConfigureHost(this, ServerName, CreateServiceManager()); - ContentTypeFilters.Register(ContentType.ProtoBuf, (reqCtx, res, stream) => Kernel.ProtobufSerializer.SerializeToStream(res, stream), (type, stream) => Kernel.ProtobufSerializer.DeserializeFromStream(stream, type)); + ContentTypeFilters.Register(ContentType.ProtoBuf, (reqCtx, res, stream) => ProtobufSerializer.SerializeToStream(res, stream), (type, stream) => ProtobufSerializer.DeserializeFromStream(stream, type)); Init(); } @@ -132,6 +145,10 @@ namespace MediaBrowser.Networking.Web /// <param name="container">The container.</param> public override void Configure(Container container) { + JsConfig.DateHandler = JsonDateHandler.ISO8601; + JsConfig.ExcludeTypeInfo = true; + JsConfig.IncludeNullValues = false; + SetConfig(new EndpointHostConfig { DefaultRedirectPath = DefaultRedirectPath, diff --git a/MediaBrowser.Networking/Web/NativeWebSocket.cs b/MediaBrowser.Networking/Web/NativeWebSocket.cs new file mode 100644 index 000000000..ad28d1a7f --- /dev/null +++ b/MediaBrowser.Networking/Web/NativeWebSocket.cs @@ -0,0 +1,145 @@ +using MediaBrowser.Model.Logging; +using System; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Common.Net +{ + /// <summary> + /// Class NativeWebSocket + /// </summary> + public class NativeWebSocket : IWebSocket + { + /// <summary> + /// The logger + /// </summary> + private readonly ILogger _logger; + + /// <summary> + /// Gets or sets the web socket. + /// </summary> + /// <value>The web socket.</value> + private WebSocket WebSocket { get; set; } + + /// <summary> + /// Initializes a new instance of the <see cref="NativeWebSocket" /> class. + /// </summary> + /// <param name="socket">The socket.</param> + /// <param name="logger">The logger.</param> + /// <exception cref="System.ArgumentNullException">socket</exception> + public NativeWebSocket(WebSocket socket, ILogger logger) + { + if (socket == null) + { + throw new ArgumentNullException("socket"); + } + + if (logger == null) + { + throw new ArgumentNullException("logger"); + } + + _logger = logger; + WebSocket = socket; + + Receive(); + } + + /// <summary> + /// Gets or sets the state. + /// </summary> + /// <value>The state.</value> + public WebSocketState State + { + get { return WebSocket.State; } + } + + /// <summary> + /// Receives this instance. + /// </summary> + private async void Receive() + { + while (true) + { + byte[] bytes; + + try + { + bytes = await ReceiveBytesAsync(CancellationToken.None).ConfigureAwait(false); + } + catch (WebSocketException ex) + { + _logger.ErrorException("Error reveiving web socket message", ex); + + break; + } + + if (OnReceiveDelegate != null) + { + OnReceiveDelegate(bytes); + } + } + } + + /// <summary> + /// Receives the async. + /// </summary> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task{WebSocketMessageInfo}.</returns> + /// <exception cref="System.Net.WebSockets.WebSocketException">Connection closed</exception> + private async Task<byte[]> ReceiveBytesAsync(CancellationToken cancellationToken) + { + var bytes = new byte[4096]; + var buffer = new ArraySegment<byte>(bytes); + + var result = await WebSocket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false); + + if (result.CloseStatus.HasValue) + { + throw new WebSocketException("Connection closed"); + } + + return buffer.Array; + } + + /// <summary> + /// Sends the async. + /// </summary> + /// <param name="bytes">The bytes.</param> + /// <param name="type">The type.</param> + /// <param name="endOfMessage">if set to <c>true</c> [end of message].</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + public Task SendAsync(byte[] bytes, WebSocketMessageType type, bool endOfMessage, CancellationToken cancellationToken) + { + return WebSocket.SendAsync(new ArraySegment<byte>(bytes), type, true, cancellationToken); + } + + /// <summary> + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// </summary> + public void Dispose() + { + Dispose(true); + } + + /// <summary> + /// Releases unmanaged and - optionally - managed resources. + /// </summary> + /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> + protected virtual void Dispose(bool dispose) + { + if (dispose) + { + WebSocket.Dispose(); + } + } + + /// <summary> + /// Gets or sets the receive action. + /// </summary> + /// <value>The receive action.</value> + public Action<byte[]> OnReceiveDelegate { get; set; } + } +} diff --git a/MediaBrowser.Networking/Web/ServerFactory.cs b/MediaBrowser.Networking/Web/ServerFactory.cs new file mode 100644 index 000000000..b93f2ca1c --- /dev/null +++ b/MediaBrowser.Networking/Web/ServerFactory.cs @@ -0,0 +1,28 @@ +using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Net; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; + +namespace MediaBrowser.Networking.Web +{ + /// <summary> + /// Class ServerFactory + /// </summary> + public static class ServerFactory + { + /// <summary> + /// Creates the server. + /// </summary> + /// <param name="applicationHost">The application host.</param> + /// <param name="kernel">The kernel.</param> + /// <param name="protobufSerializer">The protobuf serializer.</param> + /// <param name="logger">The logger.</param> + /// <param name="serverName">Name of the server.</param> + /// <param name="defaultRedirectpath">The default redirectpath.</param> + /// <returns>IHttpServer.</returns> + public static IHttpServer CreateServer(IApplicationHost applicationHost, IKernel kernel, IProtobufSerializer protobufSerializer, ILogger logger, string serverName, string defaultRedirectpath) + { + return new HttpServer(applicationHost, kernel, protobufSerializer, logger, serverName, defaultRedirectpath); + } + } +} |
