in java/org/apache/catalina/servlets/DefaultServlet.java [1760:1943]
protected InputStream renderHtml(HttpServletRequest request, String contextPath, WebResource resource,
String encoding) throws IOException {
// Prepare a writer to a buffered area
ByteArrayOutputStream stream = new ByteArrayOutputStream();
OutputStreamWriter osWriter = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
PrintWriter writer = new PrintWriter(osWriter);
StringBuilder sb = new StringBuilder();
// Get the right strings
StringManager sm = StringManager.getManager(DefaultServlet.class.getPackageName(), request.getLocales());
String directoryWebappPath = resource.getWebappPath();
WebResource[] entries = resources.listResources(directoryWebappPath);
// rewriteUrl(contextPath) is expensive. cache result for later reuse
String rewrittenContextPath = rewriteUrl(contextPath);
// Render the page header
sb.append("<!doctype html>\r\n");
sb.append("<html lang=\"").append(sm.getLocale().getLanguage()).append("\">\r\n");
sb.append("<head>\r\n");
sb.append("<title>");
sb.append(sm.getString("defaultServlet.directory.title", directoryWebappPath));
sb.append("</title>\r\n");
sb.append("<style>");
sb.append(org.apache.catalina.util.TomcatCSS.TOMCAT_CSS);
sb.append("</style>\r\n");
sb.append("</head>\r\n");
sb.append("<body>\r\n");
sb.append("<h1>");
sb.append(sm.getString("defaultServlet.directory.title", directoryWebappPath));
// Render the link to our parent (if required)
String parentDirectory = directoryWebappPath;
if (parentDirectory.endsWith("/")) {
parentDirectory = parentDirectory.substring(0, parentDirectory.length() - 1);
}
int slash = parentDirectory.lastIndexOf('/');
if (slash >= 0) {
String parent = directoryWebappPath.substring(0, slash);
sb.append(" \u2013 <a href=\"");
sb.append(rewrittenContextPath);
if (parent.isEmpty()) {
parent = "/";
}
sb.append(rewriteUrl(parent));
if (!parent.endsWith("/")) {
sb.append('/');
}
sb.append("\">");
sb.append("<b>");
sb.append(sm.getString("defaultServlet.directory.parent", parent));
sb.append("</b>");
sb.append("</a>");
}
sb.append("</h1>\r\n");
sb.append("<hr class=\"line\">\r\n");
sb.append("<table width=\"100%\" cellspacing=\"0\"" + " cellpadding=\"5\" align=\"center\">\r\n");
SortManager.Order order;
if (sortListings) {
order = sortManager.getOrder(request.getQueryString());
} else {
order = null;
}
// Render the column headings
sb.append("<thead>\r\n");
sb.append("<tr>\r\n");
sb.append("<th align=\"left\"><font size=\"+1\"><strong>");
if (order != null) {
sb.append("<a href=\"?C=N;O=");
sb.append(getOrderChar(order, 'N'));
sb.append("\">");
sb.append(sm.getString("defaultServlet.resource.name"));
sb.append("</a>");
} else {
sb.append(sm.getString("defaultServlet.resource.name"));
}
sb.append("</strong></font></th>\r\n");
sb.append("<th align=\"center\"><font size=\"+1\"><strong>");
if (order != null) {
sb.append("<a href=\"?C=S;O=");
sb.append(getOrderChar(order, 'S'));
sb.append("\">");
sb.append(sm.getString("defaultServlet.resource.size"));
sb.append("</a>");
} else {
sb.append(sm.getString("defaultServlet.resource.size"));
}
sb.append("</strong></font></th>\r\n");
sb.append("<th align=\"right\"><font size=\"+1\"><strong>");
if (order != null) {
sb.append("<a href=\"?C=M;O=");
sb.append(getOrderChar(order, 'M'));
sb.append("\">");
sb.append(sm.getString("defaultServlet.resource.lastModified"));
sb.append("</a>");
} else {
sb.append(sm.getString("defaultServlet.resource.lastModified"));
}
sb.append("</strong></font></th>\r\n");
sb.append("</tr>\r\n");
sb.append("</thead>\r\n");
if (null != sortManager) {
sortManager.sort(entries, request.getQueryString());
}
boolean shade = false;
sb.append("<tbody>\r\n");
for (WebResource childResource : entries) {
String filename = childResource.getName();
if (filename.equalsIgnoreCase("WEB-INF") || filename.equalsIgnoreCase("META-INF")) {
continue;
}
if (!childResource.exists()) {
continue;
}
sb.append("<tr");
if (shade) {
sb.append(" bgcolor=\"#eeeeee\"");
}
sb.append(">\r\n");
shade = !shade;
sb.append("<td align=\"left\"> \r\n");
sb.append("<a href=\"");
sb.append(rewrittenContextPath);
sb.append(rewriteUrl(childResource.getWebappPath()));
if (childResource.isDirectory()) {
sb.append('/');
}
sb.append("\"><tt>");
sb.append(Escape.htmlElementContent(filename));
if (childResource.isDirectory()) {
sb.append('/');
}
sb.append("</tt></a></td>\r\n");
sb.append("<td align=\"right\"><tt>");
if (childResource.isDirectory()) {
sb.append(" ");
} else {
sb.append(renderSize(childResource.getContentLength()));
}
sb.append("</tt></td>\r\n");
sb.append("<td align=\"right\"><tt>");
sb.append(renderTimestamp(childResource.getLastModified()));
sb.append("</tt></td>\r\n");
sb.append("</tr>\r\n");
}
sb.append("</tbody>\r\n");
// Render the page footer
sb.append("</table>\r\n");
sb.append("<hr class=\"line\">\r\n");
String readme = getReadme(resource, encoding);
if (readme != null) {
sb.append(readme);
sb.append("<hr class=\"line\">\r\n");
}
if (showServerInfo) {
sb.append("<h3>").append(ServerInfo.getServerInfo()).append("</h3>\r\n");
}
sb.append("</body>\r\n");
sb.append("</html>\r\n");
// Return an input stream to the underlying bytes
writer.write(sb.toString());
writer.flush();
return new ByteArrayInputStream(stream.toByteArray());
}