forked from I2P_Developers/i2p.i2p
95 lines
3.6 KiB
Java
95 lines
3.6 KiB
Java
package net.i2p.router.web;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.util.Arrays;
|
|
|
|
import javax.servlet.http.HttpServlet;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.GenericServlet;
|
|
import javax.servlet.ServletException;
|
|
import javax.servlet.ServletRequest;
|
|
import javax.servlet.ServletResponse;
|
|
|
|
import net.i2p.I2PAppContext;
|
|
import net.i2p.data.Base64;
|
|
import net.i2p.util.FileUtil;
|
|
|
|
|
|
/**
|
|
* Serve plugin icons, at /Plugins/pluginicon?plugin=foo
|
|
*
|
|
* @author cacapo
|
|
* @since 0.9.25
|
|
*/
|
|
public class CodedIconRendererServlet extends HttpServlet {
|
|
|
|
private static final long serialVersionUID = 16851750L;
|
|
|
|
private static final String base = I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath();
|
|
private static final String file = "docs" + File.separatorChar + "themes" + File.separatorChar + "console" + File.separatorChar + "images" + File.separatorChar + "plugin.png";
|
|
|
|
|
|
@Override
|
|
protected void service(HttpServletRequest srq, HttpServletResponse srs) throws ServletException, IOException {
|
|
byte[] data;
|
|
String name = srq.getParameter("plugin");
|
|
data = NavHelper.getBinary(name);
|
|
|
|
//set as many headers as are common to any outcome
|
|
|
|
srs.setContentType("image/png");
|
|
srs.setHeader("X-Content-Type-Options", "nosniff");
|
|
srs.setDateHeader("Expires", I2PAppContext.getGlobalContext().clock().now() + 86400000l);
|
|
srs.setHeader("Cache-Control", "public, max-age=86400");
|
|
OutputStream os = srs.getOutputStream();
|
|
|
|
//Binary data is present
|
|
if(data != null){
|
|
srs.setHeader("Content-Length", Integer.toString(data.length));
|
|
int content = Arrays.hashCode(data);
|
|
int chksum = srq.getIntHeader("If-None-Match");//returns -1 if no such header
|
|
//Don't render if icon already present
|
|
if(content != chksum){
|
|
srs.setIntHeader("ETag", content);
|
|
try{
|
|
os.write(data);
|
|
os.flush();
|
|
os.close();
|
|
}catch(IOException e){
|
|
I2PAppContext.getGlobalContext().logManager().getLog(getClass()).warn("Error writing binary image data for plugin", e);
|
|
}
|
|
} else {
|
|
srs.sendError(304, "Not Modified");
|
|
}
|
|
} else {
|
|
//Binary data is not present but must be substituted by file on disk
|
|
File pfile = new File(base, file);
|
|
srs.setHeader("Content-Length", Long.toString(pfile.length()));
|
|
try{
|
|
long lastmod = pfile.lastModified();
|
|
if(lastmod > 0){
|
|
long iflast = srq.getDateHeader("If-Modified-Since");
|
|
if(iflast >= ((lastmod/1000) * 1000)){
|
|
srs.sendError(304, "Not Modified");
|
|
} else {
|
|
srs.setDateHeader("Last-Modified", lastmod);
|
|
FileUtil.readFile(file, base, os);
|
|
}
|
|
|
|
}
|
|
} catch(IOException e) {
|
|
if (!srs.isCommitted()) {
|
|
srs.sendError(403, e.toString());
|
|
} else {
|
|
I2PAppContext.getGlobalContext().logManager().getLog(getClass()).warn("Error serving plugin.png", e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|