getting there
This commit is contained in:
@@ -6,4 +6,10 @@
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ImageConverter\ImageConverter.csproj" />
|
||||
<ProjectReference Include="..\PVHelpers\PVHelpers.csproj" />
|
||||
<ProjectReference Include="..\RemoteFrameBuffer\RemoteFrameBuffer.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
using System.Net;
|
||||
using System.Net.WebSockets;
|
||||
using System.Text;
|
||||
|
||||
namespace CollabVM.Server
|
||||
{
|
||||
public class CollabVMGuacamoleServer
|
||||
{
|
||||
public async void HandleSocket(WebSocket ws, IPEndPoint remote)
|
||||
{
|
||||
Console.Error.WriteLine("new WebSocket, who dis?");
|
||||
#warning we probably don't need this much
|
||||
Byte[] buf = new Byte[1024];
|
||||
try
|
||||
{
|
||||
while (ws.State == WebSocketState.Open)
|
||||
{
|
||||
#warning probably needs a real ctoken
|
||||
WebSocketReceiveResult recResult = await ws.ReceiveAsync(new ArraySegment<Byte>(buf), CancellationToken.None);
|
||||
Console.Error.WriteLine(recResult.MessageType);
|
||||
switch (recResult.MessageType)
|
||||
{
|
||||
case WebSocketMessageType.Close:
|
||||
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
|
||||
break;
|
||||
case WebSocketMessageType.Text:
|
||||
String msg = Encoding.UTF8.GetString(buf, 0, recResult.Count);
|
||||
Console.Error.WriteLine(msg);
|
||||
break;
|
||||
default:
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
} finally
|
||||
{
|
||||
ws.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ namespace CollabVM.Server
|
||||
public class CollabVMHttpServer
|
||||
{
|
||||
private HttpListener _listener = new();
|
||||
private Dictionary<String, CollabVMGuacamoleServer> _servers = new();
|
||||
private Dictionary<String, CollabVMv1_2GuacamoleServer> _servers = new();
|
||||
private readonly IPEndPoint _serverEndPoint;
|
||||
private readonly Boolean _allowList = false;
|
||||
|
||||
@@ -21,12 +21,12 @@ namespace CollabVM.Server
|
||||
}
|
||||
public CollabVMHttpServer(IPAddress address, UInt16 port = 6004, Boolean allowList = false) : this(new(address, port), allowList) { }
|
||||
|
||||
public CollabVMHttpServer(CollabVMGuacamoleServer server, IPEndPoint endPoint)
|
||||
public CollabVMHttpServer(CollabVMv1_2GuacamoleServer server, IPEndPoint endPoint)
|
||||
{
|
||||
this._serverEndPoint = endPoint;
|
||||
this._addServer("/", server);
|
||||
}
|
||||
public CollabVMHttpServer(CollabVMGuacamoleServer server, IPAddress address, UInt16 port = 6004) : this(server, new(address, port)) { }
|
||||
public CollabVMHttpServer(CollabVMv1_2GuacamoleServer server, IPAddress address, UInt16 port = 6004) : this(server, new(address, port)) { }
|
||||
|
||||
private void ListenPath(String path)
|
||||
{
|
||||
@@ -36,13 +36,13 @@ namespace CollabVM.Server
|
||||
this._listener.Prefixes.Add(tmp);
|
||||
}
|
||||
|
||||
private void _addServer(String path, CollabVMGuacamoleServer server)
|
||||
private void _addServer(String path, CollabVMv1_2GuacamoleServer server)
|
||||
{
|
||||
this._servers[path] = server;
|
||||
//this.ListenPath(path);
|
||||
}
|
||||
|
||||
public void AddServer(String name, CollabVMGuacamoleServer server)
|
||||
public void AddServer(String name, CollabVMv1_2GuacamoleServer server)
|
||||
{
|
||||
Regex nameRegex = new Regex(@"^[a-zA-Z0-9_-]+$");
|
||||
if (this._servers.ContainsKey("/"))
|
||||
@@ -68,7 +68,7 @@ namespace CollabVM.Server
|
||||
{
|
||||
if (context.Request.IsWebSocketRequest)
|
||||
{
|
||||
if (this._servers.TryGetValue(context.Request.RawUrl, out CollabVMGuacamoleServer? server))
|
||||
if (this._servers.TryGetValue(context.Request.RawUrl, out CollabVMv1_2GuacamoleServer? server))
|
||||
{
|
||||
WebSocketContext wsc;
|
||||
try
|
||||
@@ -101,7 +101,7 @@ namespace CollabVM.Server
|
||||
}
|
||||
}
|
||||
|
||||
private async void HandleWebSocket(WebSocketContext wsc, CollabVMGuacamoleServer server, IPEndPoint remote)
|
||||
private async void HandleWebSocket(WebSocketContext wsc, CollabVMv1_2GuacamoleServer server, IPEndPoint remote)
|
||||
{
|
||||
server.HandleSocket(wsc.WebSocket, remote);
|
||||
}
|
||||
|
||||
116
CollabVM/Server/CollabVMv1_2GuacamoleServer.cs
Normal file
116
CollabVM/Server/CollabVMv1_2GuacamoleServer.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
using ImageConverter;
|
||||
using PVHelpers;
|
||||
using RemoteFrameBuffer;
|
||||
using System.Net;
|
||||
using System.Net.WebSockets;
|
||||
using System.Text;
|
||||
|
||||
namespace CollabVM.Server
|
||||
{
|
||||
public class CollabVMv1_2GuacamoleServer
|
||||
{
|
||||
private String tbfile = @"C:\Users\rolan\Downloads\bootsplash.jpg";
|
||||
|
||||
private static String[] ParseMessage(String s)
|
||||
{
|
||||
List<String> args = [];
|
||||
while (true)
|
||||
{
|
||||
String[] parts = s.Split('.', 2);
|
||||
if (parts.Length != 2)
|
||||
{
|
||||
throw new ArgumentException("Invalid message format: missing `.`", nameof(s));
|
||||
}
|
||||
if (Int32.TryParse(parts[0], out Int32 len))
|
||||
{
|
||||
if (parts[1].Length < len + 1)
|
||||
{
|
||||
throw new ArgumentException("Invalid message format: data doesn't fit in message", nameof(s));
|
||||
}
|
||||
args.Add(parts[1][..len]);
|
||||
s = parts[1][(len+1)..];
|
||||
if (parts[1][len] == ',')
|
||||
{
|
||||
continue;
|
||||
}else if (parts[1][len] == ';')
|
||||
{
|
||||
break;
|
||||
} else
|
||||
{
|
||||
throw new ArgumentException("Invalid message format: parameters must be separated by `,`, list closed by `;`", nameof(s));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentException("Invalid message format: can't parse length field", nameof(s));
|
||||
}
|
||||
}
|
||||
return args.ToArray();
|
||||
}
|
||||
|
||||
private static String ConstructMessage(params String[] args) => String.Join(',', args.Select((s) => $"{s.Length}.{s}")) + ";";
|
||||
|
||||
private RemoteFramebufferClient _client;
|
||||
|
||||
public CollabVMv1_2GuacamoleServer(RemoteFramebufferClient client)
|
||||
{
|
||||
this._client = client;
|
||||
client.Start();
|
||||
}
|
||||
|
||||
public async void HandleSocket(WebSocket ws, IPEndPoint remote)
|
||||
{
|
||||
Console.Error.WriteLine("new WebSocket, who dis?");
|
||||
#warning we probably don't need this much
|
||||
Byte[] buf = new Byte[1024];
|
||||
try
|
||||
{
|
||||
while (ws.State == WebSocketState.Open)
|
||||
{
|
||||
#warning probably needs a real ctoken
|
||||
WebSocketReceiveResult recResult = await ws.ReceiveAsync(new ArraySegment<Byte>(buf), CancellationToken.None);
|
||||
Console.Error.WriteLine(recResult.MessageType);
|
||||
switch (recResult.MessageType)
|
||||
{
|
||||
case WebSocketMessageType.Close:
|
||||
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
|
||||
break;
|
||||
case WebSocketMessageType.Text:
|
||||
String msg = Encoding.UTF8.GetString(buf, 0, recResult.Count);
|
||||
Console.Error.WriteLine(msg);
|
||||
await this.HandleCommand(ws, ParseMessage(msg));
|
||||
break;
|
||||
default:
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
} finally
|
||||
{
|
||||
ws.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task HandleCommand(WebSocket ws, params String[] args)
|
||||
{
|
||||
switch (args[0])
|
||||
{
|
||||
case "cap":
|
||||
break;
|
||||
case "connect":
|
||||
break;
|
||||
case "list":
|
||||
//await this.Reply(ws, "list", "vmx", "Fake test VM", File.ReadAllBytes(tbfile).EncodeBase64String());
|
||||
await this.Reply(ws, "list", "vmx", "Somewhat fake test VM", this._client.BitMap.BmpToJpg().EncodeBase64String());
|
||||
break;
|
||||
case "rename":
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Reply(WebSocket ws, params String[] args)
|
||||
{
|
||||
Byte[] buf = Encoding.UTF8.GetBytes(ConstructMessage(args));
|
||||
await ws.SendAsync(new ArraySegment<Byte>(buf, 0, buf.Length), WebSocketMessageType.Text, true, CancellationToken.None);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user