/// <summary> /// Called when the file is requested by a client. /// </summary> /// <param name="request">The <see cref="HttpRequest"/> requesting the file.</param> /// <param name="directory">The <see cref="IDirectory"/> of the parent directory.</param> public void OnFileRequested(HttpRequest request, IDirectory directory) { if(request.IfModifiedSince != DateTime.MinValue) { if(File.GetLastWriteTimeUtc(path) < request.IfModifiedSince) request.Response.ResponseCode = "304"; return; } if(request.IfUnmodifiedSince != DateTime.MinValue) { if(File.GetLastWriteTimeUtc(path) > request.IfUnmodifiedSince) request.Response.ResponseCode = "304"; return; } if(System.IO.Path.GetFileName(path).StartsWith(".")) { request.Response.ResponseCode = "403"; return; } try { request.Response.ResponseContent = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); } catch(FileNotFoundException) { request.Response.ResponseCode = "404"; } catch(IOException e) { request.Response.ResponseCode = "500"; request.Server.Log.WriteLine(e); } }
/// <summary> /// Called when the file is requested by a client. /// </summary> /// <param name="request">The <see cref="HttpRequest"/> requesting the file.</param> /// <param name="directory">The <see cref="IDirectory"/> of the parent directory.</param> public void OnFileRequested(HttpRequest request, IDirectory directory) { ICollection dirs; ICollection files; try { dirs = directory.GetDirectories(); files = directory.GetFiles(); } catch(UnauthorizedAccessException) { throw new HttpRequestException("403"); } request.Response.BeginChunkedOutput(); StreamWriter writer = new StreamWriter(request.Response.ResponseContent); writer.WriteLine("<html>"); writer.WriteLine("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"); writer.WriteLine("<head><title>Index of " + HttpWebServer.GetDirectoryPath(directory) + "</title></head>"); writer.WriteLine("<body>"); PrintBody(writer, request, directory, dirs, files); writer.WriteLine("<hr>" + request.Server.ServerName); writer.WriteLine("</body></html>"); writer.WriteLine("</body>"); writer.WriteLine("</html>"); writer.Flush(); }
internal virtual void PrintBody(StreamWriter writer, HttpRequest request, IDirectory directory, ICollection dirs, ICollection files ) { writer.WriteLine("<h2>Index of " + HttpWebServer.GetDirectoryPath(directory) + "</h2>"); if(directory.Parent != null) writer.WriteLine("<a href=\"..\">[..]</a><br>"); foreach(IDirectory dir in dirs) { //if(dir is IPhysicalResource) // if((File.GetAttributes((dir as IPhysicalResource).Path) & FileAttributes.Hidden) != 0) // continue; writer.WriteLine("<a href=\"" + UrlEncoding.Encode(dir.Name) + "/\">[" + dir.Name + "]</a><br>"); } foreach(IFile file in files) { //if(file is IPhysicalResource) // if((File.GetAttributes((file as IPhysicalResource).Path) & FileAttributes.Hidden) != 0) // continue; writer.WriteLine("<a href=\"" + UrlEncoding.Encode(file.Name) + "\">" + file.Name + "</a><br>"); } }
internal override void PrintBody(StreamWriter writer, HttpRequest request, IDirectory directory, ICollection dirs, ICollection files ) { bool reverse = request.Query["desc"] != null; ResourceColumn sort = ResourceColumn.None; try { string sortString = request.Query["sort"]; if(sortString != null && sortString != string.Empty) sort = (ResourceColumn)Enum.Parse(typeof(ResourceColumn), sortString); } catch(ArgumentException) { } writer.WriteLine("<h2>Index of " + MakeLinkPath(directory, request) + "</h2>"); writer.WriteLine("<table cellspacing=\"0\">"); writer.WriteLine("<tr>"); foreach(ResourceColumn column in columns) { writer.Write(GetColumnTd(column) + "<b><a href=\"" + "." + "?sort=" + column.ToString()); if(sort == column && !reverse) writer.Write("&desc"); writer.Write("\"/>"); writer.WriteLine(column.ToString() + "</a></b></td>"); } writer.WriteLine("</tr>"); ArrayList entries = new ArrayList(dirs.Count + files.Count); foreach(IDirectory dir in dirs) entries.Add(new ResourceEntry(dir)); foreach(IFile file in files) entries.Add(new ResourceEntry(file)); if(sort != ResourceColumn.None) entries.Sort(new ResourceComparer(reverse, sort)); foreach(ResourceEntry entry in entries) entry.WriteHtml(writer, columns); writer.WriteLine("</table>"); }
string MakeLinkPath(IDirectory directory, HttpRequest request) { StringBuilder sb = new StringBuilder(); ArrayList pathList = new ArrayList(); for(IDirectory dir = directory; dir != null; dir = dir.Parent) pathList.Add(dir.Name); pathList.RemoveAt(pathList.Count-1); pathList.Reverse(); sb.Append("<a href=\"" + request.Uri.Scheme + "://" + request.Uri.Host); if(request.Uri.Port != 80) sb.Append(":" + request.Uri.Port); sb.Append("/\">"); sb.Append(request.Uri.Host + "</a>"); if(pathList.Count > 0) sb.Append(" - "); StringBuilder reassembledPath = new StringBuilder(); for(int i = 0; i < pathList.Count; i++) { string path = pathList[i] as string; sb.Append("<a href=\"/"); reassembledPath.Append(UrlEncoding.Encode(path)); reassembledPath.Append("/"); sb.Append(reassembledPath.ToString()); sb.Append("\">"); sb.Append(path); if(i < pathList.Count-1) sb.Append("</a>/"); else sb.Append("</a>"); } return sb.ToString(); }
internal RequestEventArgs(HttpClient client, HttpRequest request) : base(client) { this.request = request; }