bool TryProcessSpecialCommand(HttpSocket s, string uri) { uri = uri.ToLowerInvariant(); switch (uri) { case "/bye!": s.WriteTextResponse(200, "plain", ":(", false); ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(100); Stop(); }); return(true); case "/ping!": s.WriteTextResponse(200, "plain", ":)", false); return(true); case "/sl.png!": s.WriteBinaryResponse(200, "image/png", GetResourceBytes("sl.png"), false); return(true); case "/slx.png!": s.WriteBinaryResponse(200, "image/png", GetResourceBytes("slx.png"), false); return(true); case "/style.css!": s.WriteTextResponse(200, "css", HtmlFormatter.Style, false); return(true); default: return(false); } }
bool TryProcessDirectoryRequest(HttpSocket s, string uri, string path) { if (!Directory.Exists(path)) { return(false); } string q = string.Empty; int i = uri.IndexOf('?'); if (i > 0) { q = uri.Substring(i); uri = uri.Substring(0, i); } // redirect to trailing '/' to fix-up relative links if (!uri.EndsWith("/")) { string newUri = uri + "/" + q; s.WriteResponse(302, string.Format("Content-Type: text/html; charset=utf-8\r\nLocation: {0}\r\n", newUri), Encoding.UTF8.GetBytes( string.Format(@"<html><head><title>Object moved</title></head><body> <h2>Object moved to <a href=""{0}"">here</a>.</h2></body></html>", newUri)), false); return(true); } // get all files and subdirs FileSystemInfo[] infos; try { infos = new DirectoryInfo(path).GetFileSystemInfos(); } catch { infos = new FileSystemInfo[0]; } // decode %XX uri = DecodeUri(uri); // determine if parent is appropriate string parent = null; if (uri.Length > 1) { i = uri.LastIndexOf('/', uri.Length - 2); parent = (i > 0) ? uri.Substring(0, i) : "/"; } // write the response s.WriteTextResponse(200, "html", HtmlFormatter.FormatDirectoryListing(uri, parent, infos), false); return(true); }
bool TryProcessXapListingRequest(HttpSocket s, string uri, string path) { // path should end with '\' (for XAP listing) if (!path.EndsWith(Path.DirectorySeparatorChar.ToString())) { return(false); } path = path.Substring(0, path.Length - 1); // must end with XAP if (string.Compare(Path.GetExtension(path), ".xap", StringComparison.OrdinalIgnoreCase) != 0) { return(false); } // file must exist if (!File.Exists(path)) { return(false); } // see if need to serve file from XAP string filename = null; int iq = uri.IndexOf('?'); if (iq >= 0) { filename = uri.Substring(iq + 1); } ZipArchive xap = null; try { // open XAP file xap = new ZipArchive(path, FileAccess.Read); if (string.IsNullOrEmpty(filename)) { // list contents List <ZipArchiveFile> xapContents = new List <ZipArchiveFile>(); foreach (KeyValuePair <string, ZipArchiveFile> p in xap.entries) { xapContents.Add(p.Value); } s.WriteTextResponse(200, "html", HtmlFormatter.FormatXapListing(uri, xapContents), false); return(true); } // server file from XAP ZipArchiveFile f = null; if (!xap.entries.TryGetValue(filename, out f)) { s.WriteErrorResponse(404, "Resource not found in XAP"); return(true); } // check mime type string mimeType = HttpSocket.GetMimeType(filename); if (string.IsNullOrEmpty(mimeType)) { s.WriteErrorResponse(403); return(true); } // get the content byte[] body = new byte[(int)f.Length]; if (body.Length > 0) { using (Stream fs = f.OpenRead()) { fs.Read(body, 0, body.Length); } } // write the resposne s.WriteResponse(200, string.Format("Content-type: {0}\r\n", mimeType), body, false); return(true); } catch { s.WriteErrorResponse(500, "error reading XAP"); return(true); } finally { if (xap != null) { xap.Close(); } } }
bool TryProcessXapListingRequest(HttpSocket s, string uri, string path) { // path should end with '\' (for XAP listing) if (!path.EndsWith(Path.DirectorySeparatorChar.ToString())) return false; path = path.Substring(0, path.Length - 1); // must end with XAP if (string.Compare(Path.GetExtension(path), ".xap", StringComparison.OrdinalIgnoreCase) != 0) return false; // file must exist if (!File.Exists(path)) return false; // see if need to serve file from XAP string filename = null; int iq = uri.IndexOf('?'); if (iq >= 0) filename = uri.Substring(iq + 1); ZipArchive xap = null; try { // open XAP file xap = new ZipArchive(path, FileAccess.Read); if (string.IsNullOrEmpty(filename)) { // list contents List<ZipArchiveFile> xapContents = new List<ZipArchiveFile>(); foreach (KeyValuePair<string, ZipArchiveFile> p in xap.entries) xapContents.Add(p.Value); s.WriteTextResponse(200, "html", HtmlFormatter.FormatXapListing(uri, xapContents), false); return true; } // server file from XAP ZipArchiveFile f = null; if (!xap.entries.TryGetValue(filename, out f)) { s.WriteErrorResponse(404, "Resource not found in XAP"); return true; } // check mime type string mimeType = HttpSocket.GetMimeType(filename); if (string.IsNullOrEmpty(mimeType)) { s.WriteErrorResponse(403); return true; } // get the content byte[] body = new byte[(int)f.Length]; if (body.Length > 0) { using (Stream fs = f.OpenRead()) { fs.Read(body, 0, body.Length); } } // write the resposne s.WriteResponse(200, string.Format("Content-type: {0}\r\n", mimeType), body, false); return true; } catch { s.WriteErrorResponse(500, "error reading XAP"); return true; } finally { if (xap != null) xap.Close(); } }
bool TryProcessDirectoryRequest(HttpSocket s, string uri, string path) { if (!Directory.Exists(path)) return false; string q = string.Empty; int i = uri.IndexOf('?'); if (i > 0) { q = uri.Substring(i); uri = uri.Substring(0, i); } // redirect to trailing '/' to fix-up relative links if (!uri.EndsWith("/")) { string newUri = uri + "/" + q; s.WriteResponse(302, string.Format("Content-Type: text/html; charset=utf-8\r\nLocation: {0}\r\n", newUri), Encoding.UTF8.GetBytes( string.Format(@"<html><head><title>Object moved</title></head><body> <h2>Object moved to <a href=""{0}"">here</a>.</h2></body></html>", newUri)), false); return true; } // get all files and subdirs FileSystemInfo[] infos; try { infos = new DirectoryInfo(path).GetFileSystemInfos(); } catch { infos = new FileSystemInfo[0]; } // decode %XX uri = DecodeUri(uri); // determine if parent is appropriate string parent = null; if (uri.Length > 1) { i = uri.LastIndexOf('/', uri.Length-2); parent = (i > 0) ? uri.Substring(0, i) : "/"; } // write the response s.WriteTextResponse(200, "html", HtmlFormatter.FormatDirectoryListing(uri, parent, infos), false); return true; }
bool TryProcessSpecialCommand(HttpSocket s, string uri) { uri = uri.ToLowerInvariant(); switch (uri) { case "/bye!": s.WriteTextResponse(200, "plain", ":(", false); ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(100); Stop(); }); return true; case "/ping!": s.WriteTextResponse(200, "plain", ":)", false); return true; case "/sl.png!": s.WriteBinaryResponse(200, "image/png", GetResourceBytes("sl.png"), false); return true; case "/slx.png!": s.WriteBinaryResponse(200, "image/png", GetResourceBytes("slx.png"), false); return true; case "/style.css!": s.WriteTextResponse(200, "css", HtmlFormatter.Style, false); return true; default: return false; } }