예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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));
        }