private bool CheckFileCache(HttpHandlerContext context, string filename) { #if (CACHECONTROL) var connection = context.Connection; var request = connection.ListenerContext.Request; var finfo = new FileInfo(filename); var nochacecontrol = request.Headers["Cache-Control"]; if (!string.IsNullOrEmpty(nochacecontrol) && nochacecontrol.IndexOf("no-cache") != -1) { return(false); } if (!string.IsNullOrEmpty(nochacecontrol) && nochacecontrol.IndexOf("only-if-cached") != -1) { return(true); } var ifModifiedScince = request.Headers["If-Modified-Since"]; if (!string.IsNullOrEmpty(ifModifiedScince)) { DateTime cacheModified; if (DateTime.TryParseExact(ifModifiedScince, "R", CultureInfo.InvariantCulture, DateTimeStyles.None, out cacheModified) || DateTime.TryParseExact(ifModifiedScince, "ddd, dd MMM yyyy hh", CultureInfo.InvariantCulture, DateTimeStyles.None, out cacheModified)) { if (cacheModified.Date >= finfo.LastWriteTimeUtc.Date) { connection.WriteEntireResponseFromString(304, null, "", false); return(true); } } } //Split req etag var requestEtag = request.Headers["If-None-Match"]; var etag = string.Format("\"{0}.{1}\"", finfo.LastWriteTimeUtc.ToFileTimeUtc(), finfo.Length); if (!string.IsNullOrEmpty(requestEtag)) { string[] reqetags = requestEtag.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var reqetag in reqetags) { if (etag.Equals(reqetag)) { connection.WriteEntireResponseFromString(304, null, "", false); return(true); } } } #if (ETAG) SendUnknownResponseHeader("Etag", etag); #endif connection.ListenerContext.Response.Headers[HttpResponseHeader.LastModified] = finfo.LastWriteTimeUtc.ToString("R"); connection.ListenerContext.Response.Headers[HttpResponseHeader.Expires] = DateTime.UtcNow.AddDays(1).ToString("R"); #endif return(false); }
private bool CheckFileCache(HttpHandlerContext context, string filename) { #if (CACHECONTROL) var connection = context.Connection; var request = connection.ListenerContext.Request; var finfo = new FileInfo(filename); var nochacecontrol = request.Headers["Cache-Control"]; if (!string.IsNullOrEmpty(nochacecontrol) && nochacecontrol.IndexOf("no-cache") != -1) { return false; } if (!string.IsNullOrEmpty(nochacecontrol) && nochacecontrol.IndexOf("only-if-cached") != -1) { return true; } var ifModifiedScince = request.Headers["If-Modified-Since"]; if (!string.IsNullOrEmpty(ifModifiedScince)) { DateTime cacheModified; if (DateTime.TryParseExact(ifModifiedScince, "R", CultureInfo.InvariantCulture, DateTimeStyles.None, out cacheModified) || DateTime.TryParseExact(ifModifiedScince, "ddd, dd MMM yyyy hh", CultureInfo.InvariantCulture, DateTimeStyles.None, out cacheModified)) { if (cacheModified.Date >= finfo.LastWriteTimeUtc.Date) { connection.WriteEntireResponseFromString(304, null, "", false); return true; } } } //Split req etag var requestEtag = request.Headers["If-None-Match"]; var etag = string.Format("\"{0}.{1}\"", finfo.LastWriteTimeUtc.ToFileTimeUtc(), finfo.Length); if (!string.IsNullOrEmpty(requestEtag)) { string[] reqetags = requestEtag.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var reqetag in reqetags) { if (etag.Equals(reqetag)) { connection.WriteEntireResponseFromString(304, null, "", false); return true; } } } #if (ETAG) SendUnknownResponseHeader("Etag", etag); #endif connection.ListenerContext.Response.Headers[HttpResponseHeader.LastModified] = finfo.LastWriteTimeUtc.ToString("R"); connection.ListenerContext.Response.Headers[HttpResponseHeader.Expires] = DateTime.UtcNow.AddDays(1).ToString("R"); #endif return false; }
private string GetFileName(HttpHandlerContext context) { var virtRoot = context.Server.VirtualPath; var physRoot = context.Server.PhysicalPath; var virtPath = context.Connection.ListenerContext.Request.Url.LocalPath; if (virtPath.StartsWith(virtRoot, StringComparison.OrdinalIgnoreCase)) { virtPath = virtPath.Substring(virtRoot.Length).Replace('/', '\\'); return(Path.Combine(physRoot, virtPath)); } return(null); }
private static IEnumerable <IHttpHandler> GetHandlers(HttpHandlerContext context) { var extension = Path.GetExtension(context.Connection.ListenerContext.Request.Url.AbsolutePath); if (extension != null && extension.StartsWith(".")) { extension = extension.Substring(1); IHttpHandler handler; if (handlers.TryGetValue(extension, out handler)) { yield return(handler); } } yield return(DefaultHttpHandler); yield return(AspNetHandler); yield return(DirectoryHttpHandler); }
public void ProcessRequest(HttpHandlerContext context) { try { if (IsInRestrictDir(context.Connection.ListenerContext.Request.Url.LocalPath)) { context.Connection.WriteErrorWithExtraHeadersAndKeepAlive(403, null); return; } var filename = GetFileName(context); if (string.IsNullOrEmpty(filename) || !File.Exists(filename)) { context.Connection.WriteErrorWithExtraHeadersAndKeepAlive(404, null); return; } if (!CheckFileCache(context, filename)) { using (var f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { var keepAlive = string.CompareOrdinal(context.Connection.ListenerContext.Request.Headers["Connection"], "keep-alive") == 0; var compress = false; #if (GZIP) if (compressedExt.Contains(Path.GetExtension(filename))) { var acceptEncoding = context.Connection.ListenerContext.Request.Headers["Accept-Encoding"]; if (!string.IsNullOrEmpty(acceptEncoding) && acceptEncoding.Contains("gzip")) { compress = true; } } #endif context.Connection.WriteEntireResponseFromFile(filename, keepAlive, compress); } } } catch (Exception) { context.Connection.WriteErrorAndClose(500); } }
public void ProcessRequest(HttpHandlerContext context) { try { if (IsInRestrictDir(context.Connection.ListenerContext.Request.Url.LocalPath)) { context.Connection.WriteErrorWithExtraHeadersAndKeepAlive(403, null); return; } var filename = GetFileName(context); if (string.IsNullOrEmpty(filename) || !File.Exists(filename)) { context.Connection.WriteErrorWithExtraHeadersAndKeepAlive(404, null); return; } if (!CheckFileCache(context, filename)) { using (var f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { var keepAlive = string.CompareOrdinal(context.Connection.ListenerContext.Request.Headers["Connection"], "keep-alive") == 0; var compress = false; #if (GZIP) if (compressedExt.Contains(Path.GetExtension(filename))) { var acceptEncoding = context.Connection.ListenerContext.Request.Headers["Accept-Encoding"]; if (!string.IsNullOrEmpty(acceptEncoding) && acceptEncoding.Contains("gzip")) compress = true; } #endif context.Connection.WriteEntireResponseFromFile(filename, keepAlive, compress); } } } catch (Exception) { context.Connection.WriteErrorAndClose(500); } }
public bool CanHandle(HttpHandlerContext context) { /*asp.net can handle all requests*/ return true; }
public void ProcessRequest(HttpHandlerContext context) { context.Host.ProcessRequest(context.Connection, context.Identity); }
private static IEnumerable<IHttpHandler> GetHandlers(HttpHandlerContext context) { var extension = Path.GetExtension(context.Connection.ListenerContext.Request.Url.AbsolutePath); if (extension != null && extension.StartsWith(".")) { extension = extension.Substring(1); IHttpHandler handler; if (handlers.TryGetValue(extension, out handler)) { yield return handler; } } yield return DefaultHttpHandler; yield return AspNetHandler; yield return DirectoryHttpHandler; }
public static IHttpHandler GetHttpHandler(HttpHandlerContext context) { return GetHandlers(context).FirstOrDefault(x=>x.CanHandle(context)) ?? DirectoryHttpHandler; }
private string GetFileName(HttpHandlerContext context) { var virtRoot = context.Server.VirtualPath; var physRoot = context.Server.PhysicalPath; var virtPath = context.Connection.ListenerContext.Request.Url.LocalPath; if (virtPath.StartsWith(virtRoot, StringComparison.OrdinalIgnoreCase)) { virtPath = virtPath.Substring(virtRoot.Length).Replace('/', '\\'); return Path.Combine(physRoot, virtPath); } return null; }
public bool CanHandle(HttpHandlerContext context) { /*asp.net can handle all requests*/ return(true); }
public bool CanHandle(HttpHandlerContext context) { var filename = GetFileName(context); return(!(string.IsNullOrEmpty(filename) || !File.Exists(filename))); }
public static IHttpHandler GetHttpHandler(HttpHandlerContext context) { return(GetHandlers(context).FirstOrDefault(x => x.CanHandle(context)) ?? DirectoryHttpHandler); }
public bool CanHandle(HttpHandlerContext context) { var filename = GetFileName(context); return !(string.IsNullOrEmpty(filename) || !File.Exists(filename)); }