<%
/*
 * USE CAUTION WHEN EDITING
 * Trailing whitespace OR NEWLINE on the last line will cause
 * IllegalStateExceptions !!!
 *
 * Do not tag this file for translation.
 */
net.i2p.I2PAppContext ctx = net.i2p.I2PAppContext.getGlobalContext();
net.i2p.router.web.StatSummarizer ss = net.i2p.router.web.StatSummarizer.instance(ctx);
if (ss == null) {
    response.sendError(403, "Stats disabled");
    return;
}
boolean rendered = false;
/****  unused
String templateFile = request.getParameter("template");
if (templateFile != null) {
  java.io.OutputStream cout = response.getOutputStream();
  response.setContentType("image/png");
  rendered = ss.renderPng(cout, templateFile);
}
****/
net.i2p.stat.Rate rate = null;
String stat = request.getParameter("stat");
String period = request.getParameter("period");
boolean fakeBw = (stat != null && ("bw.combined".equals(stat)));
net.i2p.stat.RateStat rs = null;
if (stat != null)
    rs = ctx.statManager().getRate(stat);
if ( !rendered && ((rs != null) || fakeBw) ) {
  long per = -1;
  try {
    if (fakeBw)
      per = 60*1000;
    else
      per = Long.parseLong(period);
    if (!fakeBw)
      rate = rs.getRate(per);
    if ( (rate != null) || (fakeBw) ) {
      if (stat != null &&
          (stat.indexOf('\n') >= 0 || stat.indexOf('\r') >= 0)) {
          response.sendError(403, "param");
          return;
      }
      java.io.OutputStream cout = response.getOutputStream();
      String format = request.getParameter("format");
      response.setHeader("X-Content-Type-Options", "nosniff");
      if ("xml".equals(format)) {
        if (!fakeBw) {
          response.setContentType("text/xml");
          response.setHeader("Content-Disposition", "attachment; filename=\"" + stat + ".xml\"");
          rendered = ss.getXML(rate, cout);
        }
      } else {
        response.setContentType("image/png");
        response.setHeader("Content-Disposition", "inline; filename=\"" + stat + ".png\"");
        // very brief 45 sec expire
        response.setDateHeader("Expires", ctx.clock().now() + (45*1000));
        response.setHeader("Accept-Ranges", "none");
        // http://jira.codehaus.org/browse/JETTY-1346
        // This doesn't actually appear in the response, but it fixes the problem,
        // so Jetty must look for this header and close the connection.
        response.setHeader("Connection", "Close");
        int width = -1;
        int height = -1;
        int periodCount = -1;
        int end = 0;
        String str = request.getParameter("width");
        if (str != null) try { width = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
        str = request.getParameter("height");
        if (str != null) try { height = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
        str = request.getParameter("periodCount");
        if (str != null) try { periodCount = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
        str = request.getParameter("end");
        if (str != null) try { end = Integer.parseInt(str); } catch (NumberFormatException nfe) {}
        boolean hideLegend = Boolean.parseBoolean(request.getParameter("hideLegend"));
        boolean hideGrid = Boolean.parseBoolean(request.getParameter("hideGrid"));
        boolean hideTitle = Boolean.parseBoolean(request.getParameter("hideTitle"));
        boolean showEvents = Boolean.parseBoolean(request.getParameter("showEvents"));
        boolean showCredit = false;
        if (request.getParameter("showCredit") != null)
          showCredit = Boolean.parseBoolean(request.getParameter("showCredit"));
        if (fakeBw)
            rendered = ss.renderRatePng(cout, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, end, showCredit);
        else
            rendered = ss.renderPng(rate, cout, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, end, showCredit);
      }
      if (rendered)
        cout.close();
      //System.out.println("Rendered period " + per + " for the stat " + stat + "? " + rendered);
    }
  } catch (NumberFormatException nfe) {}
}
/*
 *  Send a 403 instead of a 404, because the server sends error.jsp
 *  for 404 errors, complete with the summary bar, which would be
 *  a huge load for a page full of graphs if there's a problem
 */
if (!rendered) {
    if (stat != null) {
        stat = net.i2p.data.DataHelper.stripHTML(stat);
        response.sendError(403, "The stat " + stat + " is not available, it must be enabled for graphing on the stats configuration page.");
    } else {
        response.sendError(403, "No stat specified");
    }
}
%>