cgiservlet.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 622 行 · 第 1/2 页

JAVA
622
字号
    }  }  /**   * Returns the index to the script path.   */  private int findScriptPathIndex(HttpServletRequest req, String fullPath)  {    String realPath = req.getRealPath(fullPath);    Path path = Vfs.lookup(realPath);    if (log.isLoggable(Level.FINER))      log.finer(L.l("real-path is `{0}'", path));    if (path.canRead() && ! path.isDirectory())      return fullPath.length();    int tail = fullPath.length();    int head;    while ((head = fullPath.lastIndexOf('/', tail)) >= 0) {      String subPath = fullPath.substring(0, head);      realPath = req.getRealPath(subPath);      path = Vfs.lookup(realPath);      if (log.isLoggable(Level.FINEST))        log.finest(L.l("trying script path {0}", path));      if (path.canRead() && ! path.isDirectory())	return head;      tail = head - 1;    }    return -1;  }  private String []getArgs(String path)  {    if (_executable != null)      return new String[] { _executable, path };    ReadStream is = null;    try {      is = Vfs.lookup(path).openRead();      int ch;      if (is.read() != '#')        return new String[] { path };      else if (is.read() != '!')        return new String[] { path };      CharBuffer cb = CharBuffer.allocate();      ArrayList<String> list = new ArrayList<String>();      ch = is.read();      while ((ch >= 0 && ch != '\r' && ch != '\n')) {        for (; ch == ' ' || ch == '\t'; ch = is.read()) {        }        if (ch < 0 || ch == '\r' || ch == '\n') {          if (list.size() > 0) {            list.add(path);            return list.toArray(new String[list.size()]);          }          else            return new String[] { path };        }        cb.clear();        while (ch > 0 && ch != ' ' && ch != '\t' && ch != '\r' && ch != '\n') {          cb.append((char) ch);          ch = is.read();        }        list.add(cb.toString());        for (; ch == ' ' || ch == '\t'; ch = is.read()) {        }      }      if (list.size() > 0) {        list.add(path);        return list.toArray(new String[list.size()]);      }      else        return new String[] { path };    } catch (Exception e) {      return new String[] { path };    } finally {      if (is != null) {	is.close();      }    }  }  private String[] createEnvironment(HttpServletRequest req,                                     String requestURI, String contextPath,                                     String scriptPath, String pathInfo,                                     String queryString)  {    boolean isFine = log.isLoggable(Level.FINE);        ArrayList<String> env = new ArrayList<String>();    env.add("SERVER_SOFTWARE=Resin/" + com.caucho.Version.VERSION);    env.add("SERVER_NAME=" + req.getServerName());    //env.add("SERVER_ADDR=" + req.getServerAddr());    env.add("SERVER_PORT=" + req.getServerPort());    env.add("REMOTE_ADDR=" + req.getRemoteAddr());    // env.add("REMOTE_PORT=" + req.getRemotePort());    if (req.getRemoteUser() != null)      env.add("REMOTE_USER=" + req.getRemoteUser());    if (req.getAuthType() != null)      env.add("AUTH_TYPE=" + req.getAuthType());    env.add("GATEWAY_INTERFACE=CGI/1.1");    env.add("SERVER_PROTOCOL=" + req.getProtocol());    env.add("REQUEST_METHOD=" + req.getMethod());    if (isFine)      log.fine("[cgi] REQUEST_METHOD=" + req.getMethod());        if (queryString != null) {      env.add("QUERY_STRING="+ queryString);            if (isFine)      log.fine("[cgi] QUERY_STRING=" + queryString);    }    env.add("REQUEST_URI=" + requestURI);    if (isFine)      log.fine("[cgi] REQUEST_URI=" + requestURI);    // PHP needs SCRIPT_FILENAME or it reports "No input file specified."    env.add("SCRIPT_FILENAME=" + req.getRealPath(scriptPath));    scriptPath = contextPath + scriptPath;    env.add("SCRIPT_NAME=" + scriptPath);        if (isFine)      log.fine("[cgi] SCRIPT_NAME=" + scriptPath);        if (pathInfo != null) {      env.add("PATH_INFO=" + pathInfo);      env.add("PATH_TRANSLATED=" + req.getRealPath(pathInfo));    }    Enumeration e = req.getHeaderNames();    while (e.hasMoreElements()) {      String key = (String) e.nextElement();      String value = req.getHeader(key);      if (isFine)	log.fine("[cgi] " + key + "=" + value);      if (key.equalsIgnoreCase("content-length"))        env.add("CONTENT_LENGTH=" + value);      else if (key.equalsIgnoreCase("content-type"))        env.add("CONTENT_TYPE=" + value);      else if (key.equalsIgnoreCase("authorization")) {      }      else if (key.equalsIgnoreCase("proxy-authorization")) {      }      else        env.add(convertHeader(key, value));    }    return (String []) env.toArray(new String[env.size()]);  }  private String convertHeader(String key, String value)  {    CharBuffer cb = new CharBuffer();    cb.append("HTTP_");    for (int i = 0; i < key.length(); i++) {      char ch = key.charAt(i);      if (ch == '-')        cb.append('_');      else if (ch >= 'a' && ch <= 'z')        cb.append((char) (ch + 'A' - 'a'));      else        cb.append(ch);    }    cb.append('=');    cb.append(value);    return cb.close();  }  private boolean parseHeaders(HttpServletRequest req,			       HttpServletResponse res,			       ReadStream rs)    throws IOException  {    boolean hasStatus = false;    CharBuffer key = new CharBuffer();    CharBuffer value = new CharBuffer();    int ch;    while (true) {      key.clear();      value.clear();      for (ch = rs.read();           ch >= 0 && ch != ' ' && ch != '\r' && ch != '\n' && ch != ':';           ch = rs.read()) {        key.append((char) ch);      }      for (;           ch >= 0 && ch == ' ' || ch == ':';           ch = rs.read()) {      }      for (;           ch >= 0 && ch != '\r' && ch != '\n';           ch = rs.read()) {        value.append((char) ch);      }      if (ch == '\r') {        ch = rs.read();        if (ch != '\n')          rs.unread();      }      if (key.length() == 0)        return hasStatus;      String keyStr = key.toString();      String valueStr = value.toString();      if (log.isLoggable(Level.FINER))	log.finer(keyStr + ": " + valueStr);      if (keyStr.equalsIgnoreCase("Status")) {        int status = 0;        int len = valueStr.length();        int i = 0;	hasStatus = true;	        for (; i < len && (ch = valueStr.charAt(i)) >= '0' && ch <= '9'; i++)          status = 10 * status + ch - '0';                for (; i < len && (ch = valueStr.charAt(i)) == ' '; i++) {        }	if (status < 304)	  res.setStatus(status);	else	  res.sendError(status, valueStr.substring(i));      }      else if (keyStr.equalsIgnoreCase("Location")) {	String uri;		if (valueStr.startsWith("/"))	  uri = req.getContextPath() + valueStr;	else	  uri = valueStr;	res.setHeader("Location", res.encodeRedirectURL(uri));      }      else        res.addHeader(keyStr, valueStr);    }  }  class TimeoutAlarm implements AlarmListener {    String _uri;    Process _process;    InputStream _is;    TimeoutAlarm(String uri, Process process, InputStream is)    {      _uri = uri;      _process = process;      _is = is;    }    public void handleAlarm(Alarm alarm)    {      log.warning("timing out CGI process for '" + _uri + "'");            try {	_is.close();      } catch (Throwable e) {	log.log(Level.WARNING, e.toString(), e);      }            try {	_process.destroy();      } catch (Throwable e) {	log.log(Level.WARNING, e.toString(), e);      }    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?