package hudson.plugins.pxe;
import org.kohsuke.loopy.FileEntry;
import org.kohsuke.loopy.iso9660.ISO9660FileSystem;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.servlet.ServletException;
import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
/**
* Binding {@link ISO9660FileSystem} to an HTTP URL space.
*
* @author Kohsuke Kawaguchi
*/
public class ISO9660Tree implements HttpResponse {
private final File iso;
public ISO9660Tree(File iso) {
this.iso = iso;
}
public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException {
ISO9660FileSystem fs = new ISO9660FileSystem(iso,false);
try {
String rest = req.getRestOfPath();
FileEntry e = fs.get(rest);
if(e==null) {
rsp.sendError(SC_NOT_FOUND);
return;
}
if(e.isDirectory()) {
// if the target page to be displayed is a directory and the path doesn't end with '/', redirect
StringBuffer reqUrl = req.getRequestURL();
if(reqUrl.charAt(reqUrl.length()-1)!='/') {
rsp.sendRedirect2(reqUrl.append('/').toString());
return;
}
rsp.setContentType("text/html");
PrintWriter w = new PrintWriter(rsp.getWriter());
w.println("<html><body>");
for (FileEntry f : e.childEntries().values())
w.printf("<LI><A HREF='%1$s%2$s'>%1$s%2$s</A></LI>",f.getName(),f.isDirectory()?"/":"");
w.println("</body></html>");
} else {
InputStream in = e.read();
rsp.serveFile(req, in, e.getLastModifiedTime(), 1000L*1000*1000, e.getSize(), getMimeTypeName(e));
}
} finally {
fs.close();
}
}
private String getMimeTypeName(FileEntry e) {
if(e.getName().endsWith(".rpm")) // force the RPM package type
return "mime-type:application/x-redhat-package-manager";
return e.getName();
}
}