Beispiel #1
0
        public void ProcessStaticFiles(HttpListenerContext context)
        {
            const string indexDefault = "/index.html";
            var          path         = context.Request.RawUrl;

            if (path == "/")
            {
                path = indexDefault;
            }
            var pathParts = new[] { ".", "static" }.Concat(path.Split('/')).Where(d => !string.IsNullOrEmpty(d)).ToArray();
            var filename = Path.Combine(pathParts);

            filename = filename.Split('?')[0];
            if (File.Exists(filename))
            {
                try
                {
                    Stream input = new FileStream(filename, FileMode.Open);

                    //Adding permanent http response headers
                    var extension   = Path.GetExtension(filename);
                    var contentType = MimeTypeMappings.ContainsKey(extension)
                        ? MimeTypeMappings[extension]
                        : "application/octet-stream";
                    context.Response.ContentType     = contentType;
                    context.Response.ContentLength64 = input.Length;
                    context.Response.AddHeader("Date", DateTime.Now.ToString("r"));
                    context.Response.AddHeader("Last-Modified", File.GetLastWriteTime(filename).ToString("r"));

                    var buffer = new byte[1024 * 16];
                    int nbytes;
                    while ((nbytes = input.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        context.Response.OutputStream.Write(buffer, 0, nbytes);
                    }
                    input.Close();

                    context.Response.StatusCode = (int)HttpStatusCode.OK;
                    context.Response.OutputStream.Flush();
                }
                catch (Exception ex)
                {
                    WriteMessage(ex);
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                }
            }
            else
            {
                context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            }

            context.Response.OutputStream.Close();
        }