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 + -
显示快捷键?