public static async Task HandleWebSocketRequestAsync(HttpContext context) { // // Make sure we get a good ID // if (!context.Request.Query.TryGetValue("id", out var idValues)) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } var id = idValues.FirstOrDefault(); if (id == null || id.Length != 32) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } // // Find the pending session // if (!pendingSessions.TryRemove(id, out var pendingSession)) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } // // Reject the session if it's old // if ((DateTime.UtcNow - pendingSession.RequestTimeUtc) > SessionTimeout) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } // // OK, Run // var token = CancellationToken.None; var webSocket = await context.WebSockets.AcceptWebSocketAsync("ooui"); var session = new Ooui.UI.Session(webSocket, pendingSession.Element, token); await session.RunAsync().ConfigureAwait(false); }
public static async Task HandleWebSocketRequestAsync(HttpContext context) { void BadRequest(string message) { context.Response.StatusCode = StatusCodes.Status400BadRequest; context.Response.ContentType = "text/plain; charset=utf-8"; using (var sw = new System.IO.StreamWriter(context.Response.Body)) { sw.WriteLine(message); } } // // Make sure we get a good ID // if (!context.Request.Query.TryGetValue("id", out var idValues)) { BadRequest("Missing `id`"); return; } var id = idValues.LastOrDefault(); if (id == null || id.Length != 32) { BadRequest("Invalid `id`"); return; } // // Clear old sessions // var toClear = activeSessions.Where(x => (DateTime.UtcNow - x.Value.LastConnectTimeUtc) > SessionTimeout).ToList(); foreach (var c in toClear) { activeSessions.TryRemove(c.Key, out var _); } // // Find the pending session // if (!activeSessions.TryGetValue(id, out var activeSession)) { BadRequest("Unknown `id`"); return; } activeSession.LastConnectTimeUtc = DateTime.UtcNow; // // Set the element's dimensions // if (!context.Request.Query.TryGetValue("w", out var wValues) || wValues.Count < 1) { BadRequest("Missing `w`"); return; } if (!context.Request.Query.TryGetValue("h", out var hValues) || hValues.Count < 1) { BadRequest("Missing `h`"); return; } var icult = System.Globalization.CultureInfo.InvariantCulture; if (!double.TryParse(wValues.Last(), System.Globalization.NumberStyles.Any, icult, out var w)) { w = 640; } if (!double.TryParse(hValues.Last(), System.Globalization.NumberStyles.Any, icult, out var h)) { h = 480; } // // OK, Run // var token = CancellationToken.None; var webSocket = await context.WebSockets.AcceptWebSocketAsync("ooui"); var session = new Ooui.UI.Session(webSocket, activeSession.Element, w, h, token); await session.RunAsync().ConfigureAwait(false); }
public static async Task HandleWebSocketRequestAsync(HttpContext context) { void BadRequest(string message) { context.Response.StatusCode = StatusCodes.Status400BadRequest; context.Response.ContentType = "text/plain; charset=utf-8"; using (var sw = new System.IO.StreamWriter(context.Response.Body)) { sw.WriteLine(message); } } // // Make sure we get a good ID // if (!context.Request.Query.TryGetValue("id", out var idValues)) { BadRequest("Missing `id`"); return; } var id = idValues.LastOrDefault(); if (id == null || id.Length != 32) { BadRequest("Invalid `id`"); return; } // // Find the pending session // if (!pendingSessions.TryRemove(id, out var pendingSession)) { BadRequest("Unknown `id`"); return; } // // Reject the session if it's old // if ((DateTime.UtcNow - pendingSession.RequestTimeUtc) > SessionTimeout) { BadRequest("Old `id`"); return; } // // Set the element's dimensions // if (!context.Request.Query.TryGetValue("w", out var wValues) || wValues.Count < 1) { BadRequest("Missing `w`"); return; } if (!context.Request.Query.TryGetValue("h", out var hValues) || hValues.Count < 1) { BadRequest("Missing `h`"); return; } if (!double.TryParse(wValues.Last(), out var w)) { w = 640; } if (!double.TryParse(hValues.Last(), out var h)) { h = 480; } // // OK, Run // var token = CancellationToken.None; var webSocket = await context.WebSockets.AcceptWebSocketAsync("ooui"); var session = new Ooui.UI.Session(webSocket, pendingSession.Element, w, h, token); await session.RunAsync().ConfigureAwait(false); }