WIP
parent
d07b28da48
commit
6c5b2f7534
|
@ -8,110 +8,35 @@ 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, ERROR }
|
||||
public delegate void WSRConnection(WebsocketResource webSocketResource, WebSocket webSocket, WSREvent ev);
|
||||
|
||||
public class WebsocketResource : Resource
|
||||
{
|
||||
public event WSRConnection Connection;
|
||||
public Func<HttpRequest,WebSocket> WebSocketFactory { get; }
|
||||
|
||||
public WebsocketResource(Resource container,String resourceName)
|
||||
public WebsocketResource(Resource container,String resourceName, Func<HttpRequest, WebSocket> webSocketFactory)
|
||||
:base(container,resourceName)
|
||||
{
|
||||
WebSocketFactory = webSocketFactory;
|
||||
}
|
||||
|
||||
public override void AddResource(Resource resource)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override bool Contains(string name)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override IEnumerable<Resource> GetResources()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public override void AddResource(Resource resource) => throw new NotImplementedException();
|
||||
public override bool Contains(string name) => throw new NotImplementedException();
|
||||
public override IEnumerable<Resource> GetResources() => throw new NotImplementedException();
|
||||
public override void RemoveResource(Resource resource) => 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)
|
||||
WebSocketFactory(httpRequest).Run();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logging.Log(e);
|
||||
Connection(this, webSocket, WSREvent.ERROR);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue