public static bool HandleIfNotModified(this HttpConnection p, DateTime lastModified, string etag, string lastModifiedString) { if (lastModified != null) { p.setHeader("Last-Modified", lastModifiedString); } if (etag != null) { p.setHeader("Etag", etag); } //p.setHeader("Cache-Control", "public,max-age=3600"); var notmod = (etag != null && p.GetReqHeader("If-None-Match") == etag); if (!notmod) { if (lastModified > DateTime.MinValue) { var sinceStr = p.GetReqHeader("If-Modified-Since"); if (sinceStr != null && DateTime.TryParse(sinceStr, out var since)) { if (since <= lastModified) { notmod = true; } } } } if (notmod) { p.ResponseStatusCode = "304 Not Modified"; } return(notmod); }
public static async Task HandleFileAsync(HttpConnection p, string path) { FileInfo fi = new FileInfo(path); using (var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var type = GetHttpContentTypeFromPath(path); if (type != null) { p.setHeader(HttpHeaders.KEY_Content_Type, type); } else { p.setHeader(HttpHeaders.KEY_Content_Type, "application/octet-stream"); } if (p.HandleIfNotModified(fi.LastWriteTimeUtc.ToString("R"))) { return; } await HandleFileStreamAsync(p, fs, (type == null ? fi.Name : null), false); } }
public async Task <WsHandleRequestResult> HandleRequestAsync(bool enterRecvLoop) { List <string> connectionSplits = p.GetReqHeaderSplits("Connection"); if (p.Method == "GET" && p.GetReqHeader("Upgrade") == "websocket" && (connectionSplits.Contains("Upgrade") || connectionSplits.Contains("upgrade"))) { p.Handled = true; if (p.GetReqHeader("Sec-WebSocket-Version") != "13") { p.ResponseStatusCode = "400 Bad Request"; p.setHeader("Sec-WebSocket-Version", "13"); return(new WsHandleRequestResult(WsHandleRequestResult.Results.BadVersion)); } var wskey = p.GetReqHeader("Sec-WebSocket-Key"); if (wskey == null) { p.ResponseStatusCode = "400 Bad Request"; p.keepAlive = false; return(new WsHandleRequestResult(WsHandleRequestResult.Results.BadKey)); } p.ResponseStatusCode = "101 Switching Protocols"; p.setHeader("Upgrade", "websocket"); p.setHeader("Connection", "Upgrade"); p.setHeader("Sec-WebSocket-Accept", GetWebsocketAcceptKey(wskey)); p.keepAlive = false; await p.EndResponseAsync().CAF(); p.SwitchProtocol(); ConnectionState = States.Open; if (enterRecvLoop) { await recvLoopAsync().CAF(); } return(new WsHandleRequestResult(WsHandleRequestResult.Results.Connected)); } return(new WsHandleRequestResult(WsHandleRequestResult.Results.NonWebsocket)); }