master
Harald Wolff 2019-11-04 10:01:04 +01:00
parent d07b28da48
commit 6c5b2f7534
1 changed files with 11 additions and 86 deletions

View File

@ -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);
}
}
}
}