bool TryProcessAssemblyRequest(HttpSocket s, string uri) { if (Chiron.UrlPrefix == "") { return(false); } int slash = uri.LastIndexOf('/'); if (slash == -1) { return(false); } // must start with URL prefix if (string.Compare(uri.Substring(0, slash + 1), Chiron.UrlPrefix, StringComparison.OrdinalIgnoreCase) != 0) { return(false); } uri = uri.Substring(slash + 1); // must end with DLL or PDB if (string.Compare(Path.GetExtension(uri), ".dll", StringComparison.OrdinalIgnoreCase) != 0 && string.Compare(Path.GetExtension(uri), ".pdb", StringComparison.OrdinalIgnoreCase) != 0) { return(false); } // get mime type string mimeType = HttpSocket.GetMimeType(uri); if (string.IsNullOrEmpty(mimeType)) { s.WriteErrorResponse(403); return(true); } // see if the file exists in the assembly reference path string path = Chiron.TryGetAssemblyPath(uri); if (path == null) { return(false); } // read the file byte[] body = null; try { body = File.ReadAllBytes(path); } catch (Exception ex) { s.WriteErrorResponse(500, ex.Message + "\r\n" + ex.StackTrace); return(true); } // write the response s.WriteResponse(200, string.Format("Content-type: {0}\r\n", mimeType), body, false); return(true); }
public static string FormatDirectoryListing(string dirPath, string parentPath, IList <FileSystemInfo> elements) { StringBuilder sb = new StringBuilder(); if (parentPath != null) { if (!parentPath.EndsWith("/")) { parentPath += "/"; } sb.AppendFormat("<a href=\"{0}\">[To Parent Directory]</a>\r\n", parentPath); } foreach (FileSystemInfo e in elements) { if (e is FileInfo) { if (e.Name.EndsWith(".xap", StringComparison.OrdinalIgnoreCase)) { // special handling of XAP files to allow listing requests sb.AppendFormat( @"{0,38:dddd, MMMM dd, yyyy hh:mm tt} {1,12:n0} <a href=""{2}/"">{3}</a> <a href=""{4}""><img border=""0"" src=""/slx.png!"" title=""Download XAP file"" /></a> ", e.LastWriteTime, ((FileInfo)e).Length, e.Name, e.Name, e.Name); } else if (string.IsNullOrEmpty(HttpSocket.GetMimeType(e.Name))) { sb.AppendFormat( @"{0,38:dddd, MMMM dd, yyyy hh:mm tt} {1,12:n0} {2}</a> ", e.LastWriteTime, ((FileInfo)e).Length, e.Name); } else { sb.AppendFormat( @"{0,38:dddd, MMMM dd, yyyy hh:mm tt} {1,12:n0} <a href=""{2}"">{3}</a> ", e.LastWriteTime, ((FileInfo)e).Length, e.Name, e.Name); } } else if (e is DirectoryInfo) { sb.AppendFormat( @"{0,38:dddd, MMMM dd, yyyy hh:mm tt} [dir] <a href=""{1}/"">{2}</a> <a href=""{3}.xap""><img border=""0"" src=""/slx.png!"" title=""Create XAP file from directory contents"" /></a> ", e.LastWriteTime, e.Name, e.Name, e.Name); } } return(string.Format(DirListingFormat, dirPath, dirPath, sb.ToString(), typeof(Chiron).Assembly.GetName().Version.ToString())); }
public static string FormatXapListing(string xapPath, IList <ZipArchiveFile> elements) { StringBuilder sb = new StringBuilder(); foreach (ZipArchiveFile f in elements) { if (string.IsNullOrEmpty(HttpSocket.GetMimeType(f.Name))) { sb.AppendFormat( @"{0,38:dddd, MMMM dd, yyyy hh:mm tt} {1,12:n0} {2}</a> ", f.LastWriteTime, f.Length, f.Name); } else { sb.AppendFormat( @"{0,38:dddd, MMMM dd, yyyy hh:mm tt} {1,12:n0} <a href=""{2}?{3}"">{4}</a> ", f.LastWriteTime, f.Length, xapPath, f.Name, f.Name); } } return(string.Format(XapListingFormat, xapPath, xapPath, sb.ToString(), typeof(Chiron).Assembly.GetName().Version.ToString())); }
bool TryProcessFileRequest(HttpSocket s, string uri, string path) { // path shouldn't end with '\' (that's for XAP listing) if (path.EndsWith(Path.DirectorySeparatorChar.ToString())) { return(false); } // file must exist if (!File.Exists(path)) { return(false); } // check extension string mimeType = HttpSocket.GetMimeType(path); if (string.IsNullOrEmpty(mimeType)) { s.WriteErrorResponse(403); return(true); } // read the file byte[] body = null; try { body = File.ReadAllBytes(path); } catch (Exception ex) { s.WriteErrorResponse(500, ex.Message + "\r\n" + ex.StackTrace); return(true); } // write the response s.WriteResponse(200, string.Format("Content-type: {0}\r\n", mimeType), body, 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(); } } }