using System; using System.Collections.Generic; using ln.http.websocket; using ln.logging; using System.IO; using ln.types; using System.Text; namespace ln.http.resources.websocket { public class WebSocketResourceRequestContext { public WebsocketResource WebsocketResource { get; } public WebSocket WebSocket { get; } public HttpRequest HttpRequest { get; } public WebSocketResourceRequestContext(WebsocketResource websocketResource,WebSocket webSocket,HttpRequest httpRequest) { WebsocketResource = websocketResource; WebSocket = webSocket; HttpRequest = httpRequest; } } public enum WSREvent { CONNECT, CLOSE } public delegate void WSRConnection(WebsocketResource webSocketResource, WebSocket webSocket, WSREvent ev); public class WebsocketResource : Resource { public event WSRConnection Connection; public WebsocketResource(Resource container,String resourceName) :base(container,resourceName) { } public override void AddResource(Resource resource) { throw new NotImplementedException(); } public override bool Contains(string name) { throw new NotImplementedException(); } public override IEnumerable GetResources() { throw new NotImplementedException(); } public override HttpResponse GetResponse(HttpRequest httpRequest) { MemoryStream buffer = null; WebSocket webSocket = new WebSocket(httpRequest); webSocket.WebSocketEvent += (WebSocket sender, WebSocketEventArgs e) => { switch (e.EventType) { case WebSocketEventType.MESSAGE: if (buffer == null) buffer = new MemoryStream(); buffer.WriteBytes(e.BinaryMessage); if (e.Frame.FIN) { WebSocketResourceRequestContext context = new WebSocketResourceRequestContext( this, webSocket, httpRequest ); if (e.IsBinary) MessageReceived(context, buffer.ToArray()); else MessageReceived(context, Encoding.UTF8.GetString(buffer.ToArray())); buffer.Dispose(); buffer = null; } break; } }; try { Connection(this, webSocket, WSREvent.CONNECT); webSocket.Run(); } catch (Exception e) { Logging.Log(e); } Connection(this, webSocket, WSREvent.CLOSE); httpRequest.GetConnectionStream().Close(); return null; } public override void RemoveResource(Resource resource) { throw new NotImplementedException(); } public virtual void MessageReceived(WebSocketResourceRequestContext requestContext,byte[] binaryMessage) { Logging.Log(LogLevel.WARNING, "WebSocketResource: received unhandled binary message: {0}",BitConverter.ToString(binaryMessage)); } public virtual void MessageReceived(WebSocketResourceRequestContext requestContext, String textMessage) { Logging.Log(LogLevel.WARNING, "WebSocketResource: received unhandled text message: {0}", textMessage); } } }