Beispiel #1
0
 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);
     }
 }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        public HttpServerResponse SendPollResponse()
        {
            var response = ServerSentEvents.ToString();

            ServerSentEvents.Clear();
            return(HttpServerResponse.StringResponse(response, "text/event-stream"));
        }
Beispiel #4
0
        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();
        }
Beispiel #5
0
        /// <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);
            }
        }