String fullName = pathInfo;
if (pathInfo.startsWith("/"))
  fullName = pathInfo.substring(1);
int idx = fullName.indexOf('/');
jarName = fullName.substring(0, idx);
String classPath = fullName.substring(idx + 1);
if ((pathInfo.lastIndexOf('.') != -1) &&
  !pathInfo.endsWith(".class")) {
  JSPhandler.ResourceStream rs =
    jh.getResourceAsStream(jarName, classPath);
  if (rs == null) {
    response.sendError(response.SC_NOT_FOUND);
    return;
  }
  // HTTP cache handling code
  java.text.SimpleDateFormat sdf =
    new java.text.SimpleDateFormat(
    "EEE, dd MMM yyyy hh:mm:ss");
  sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  String strLastModified = sdf.format(
    new Date(rs.lastModified));
  String strETag = "E" + rs.lastModified;
  String ifNoneMatch = request.getHeader(
    "If-None-Match");
  if (ifNoneMatch != null) {
    if (ifNoneMatch.equals(strETag)) {
      response.setDateHeader("Expires",
        System.currentTimeMillis() +
        jh.expiration * 1000);
      response.sendError(
        response.SC_NOT_MODIFIED);
      return;
    }
  }
  String ifModified = request.getHeader(
    "If-Modified-Since");
  if (ifModified != null) {
    if (ifModified.equals(strLastModified)) {
      response.setDateHeader("Expires",
        System.currentTimeMillis() +
        jh.expiration * 1000);
      response.sendError(
        response.SC_NOT_MODIFIED);
      return;
    }
  }
  response.setHeader("Cache-control", "public");
  response.setDateHeader("Date",
    System.currentTimeMillis());
  response.setHeader("Last-Modified",
    strLastModified + " GMT");
  response.setHeader("ETag", "E"+rs.lastModified);
  response.setDateHeader("Expires",
    System.currentTimeMillis() +
    jh.expiration * 1000);
  // end of HTTP cache handling code
  ServletContext sc = getServletContext();
  response.setContentType(
    sc.getMimeType(classPath));
  BufferedInputStream bis =
    new BufferedInputStream(rs.is);
  BufferedOutputStream bos =
    new BufferedOutputStream(
    response.getOutputStream());
  int i;
  while((i = bis.read()) != -1)
    bos.write(i);
  bos.flush();
  bis.close();
  return;
}