public async Task AppendAutoRefreshJavaScript(HttpServerResponse response, Stream outputStream, CancellationToken token) { if (response.ContentType == "text/html") { await outputStream.WriteAsync(JavaScript, 0, JavaScript.Length, token).ConfigureAwait(false); } }
private HttpServerResponse GenerateResponse(HttpListenerContext context) { string url = context.Request.Url.AbsolutePath; if (url == autoRefresher.ServerEndpoint) { return(autoRefresher.SendPollResponse()); // don't log refresh polling to the console on purpose, because it's too noisy. } Console.WriteLine($"{DateTime.Now:HH:mm:ss} - HTTP {context.Request.HttpMethod} {url}"); string filename = WebUtility.UrlDecode(url.TrimStart('/')); string exactFile = Path.Combine(path, filename); if (File.Exists(exactFile)) { return(HttpServerResponse.FileResponse(exactFile)); } string defaultIndexFile = Path.Combine(path, filename, IndexFile); if (File.Exists(defaultIndexFile)) { return(HttpServerResponse.FileResponse(defaultIndexFile)); } if (Directory.Exists(exactFile)) { var listing = GenerateDirectoryListing(exactFile); return(HttpServerResponse.HtmlResponse(listing)); } return(HttpServerResponse.HtmlResponse("Not Found", HttpStatusCode.NotFound)); }
public HttpServerResponse SendPollResponse() { var response = ServerSentEvents.ToString(); ServerSentEvents.Clear(); return(HttpServerResponse.StringResponse(response, "text/event-stream")); }
private async Task StreamResponseAsync(HttpListenerContext context, HttpServerResponse response, CancellationToken token) { Stream outputStream = context.Response.OutputStream; context.Response.StatusCode = (int)response.StatusCode; context.Response.ContentType = response.ContentType + "; charset=utf-8"; context.Response.AddHeader("Date", DateTime.Now.ToString("r")); using (response.Body) { await response.Body.CopyToAsync(outputStream, 81920, token).ConfigureAwait(false); await autoRefresher.AppendAutoRefreshJavaScript(response, outputStream, token).ConfigureAwait(false); await outputStream.FlushAsync(token).ConfigureAwait(false); } outputStream.Close(); }
/// <summary> /// Process the received context from the <see cref="HttpListener"/>. /// The context represents a single request/response. /// </summary> private async Task ProcessContext(HttpListenerContext context, CancellationToken token) { HttpServerResponse response; try { response = GenerateResponse(context); } catch (Exception e) { ReportError(e); response = HttpServerResponse.HtmlResponse("ERROR: " + e.Message, HttpStatusCode.InternalServerError); } if (!token.IsCancellationRequested) { await StreamResponseAsync(context, response, token).ConfigureAwait(false); } }