1 2 24 25 package org.enhydra.servlet.servlets; 26 27 import java.io.BufferedReader ; 28 import java.io.File ; 29 import java.io.IOException ; 30 import java.io.InputStreamReader ; 31 import java.util.Vector ; 32 33 import javax.servlet.ServletOutputStream ; 34 import javax.servlet.http.HttpServletRequest ; 35 import javax.servlet.http.HttpServletResponse ; 36 37 38 49 class CgiProcessor { 50 51 54 private static final int buffer_size = 1024; 55 56 57 60 private final static String NOT_FOUND_MSG = 61 "<TITLE>Not Found</TITLE><H1>Not Found</H1> " + 62 "The requested object does not exist on this Enhydra Server. " + 63 "The link you followed is either outdated, inaccurate, " + 64 "or the server has been instructed not to let you have it."; 65 66 67 70 public void processCgiRequest(HttpServletRequest request, HttpServletResponse response, String scriptPath, String pathInfo, String scriptName) 71 throws IOException { 72 73 ServletOutputStream out; 74 String strBuffer; 75 String name, value; 76 byte buffer[] = new byte[buffer_size]; 77 int bytesRead; 78 79 Process process = null; 81 Runtime runner = Runtime.getRuntime(); 82 String envVars[] = getCgiEnv(request, scriptPath, pathInfo, scriptName); 83 File script = new File (scriptPath); 84 if (! (script.exists() && script.isFile())) { 85 response.sendError(response.SC_NOT_FOUND, NOT_FOUND_MSG); 87 return; 88 } 89 process = runner.exec(scriptPath, envVars); 90 91 InputStreamReader tempIn 92 = new InputStreamReader (process.getInputStream()); 93 BufferedReader in = new BufferedReader (tempIn); 94 95 strBuffer = in.readLine(); 96 if (scriptName.toLowerCase().startsWith("nph-")) { 97 String code = strBuffer.substring(strBuffer.indexOf(" ")); 98 response.setStatus(Integer.parseInt(code)); 99 strBuffer = in.readLine(); 100 } 101 102 while ((strBuffer != null) && (strBuffer.length() != 0)) { 104 int colon = strBuffer.indexOf(":"); 105 if (colon != -1) { 106 name = strBuffer.substring(0, colon); 107 value = strBuffer.substring(colon + 1); 108 String lName = name.toLowerCase(); 109 if (lName.equals("status")) { 110 String tValue = value.trim(); 111 if (tValue.indexOf(" ") != -1) { 112 String nValue = tValue.substring(0, tValue.indexOf(" ")); 113 response.setStatus(Integer.parseInt(nValue)); 114 } else { 115 response.setStatus(Integer.parseInt(tValue)); 116 } 117 } else if (lName.equals("content-type")) { 118 String tValue = value.trim(); 119 response.setContentType(tValue); 120 } else { 121 response.setHeader(name, value); 122 } 123 } 124 strBuffer = in.readLine(); 125 } 126 127 bytesRead = in.read(); 128 out = response.getOutputStream(); 130 131 while(bytesRead != -1) { 132 out.write(bytesRead); 133 bytesRead = in.read(); 134 } 135 in.close(); 136 tempIn.close(); 137 out.flush(); 138 out.close(); 139 } 140 141 144 private String [] getCgiEnv(HttpServletRequest request, 145 String scriptPath, 146 String pathInfo, 147 String scriptName) { 148 149 Vector envList = new Vector (); 150 String strBuffer = null; 151 152 155 169 170 strBuffer = request.getServerName(); 172 if (strBuffer != null) { 173 envList.addElement("SERVER_NAME=" + strBuffer); 174 } 175 176 strBuffer = request.getProtocol(); 177 if (strBuffer != null) { 178 envList.addElement("SERVER_PROTOCOL=" + strBuffer); 179 } 180 181 envList.addElement("SERVER_PORT=" + request.getServerPort()); 182 183 strBuffer = request.getMethod(); 184 if (strBuffer != null) { 185 envList.addElement("REQUEST_METHOD=" + strBuffer); 186 } 187 188 if (pathInfo != null && pathInfo.length() != 0) { 189 envList.addElement("PATH_INFO=" + pathInfo); 190 } 191 192 strBuffer = request.getPathTranslated(); 193 if (strBuffer != null) { 194 envList.addElement("PATH_TRANSLATED=" + strBuffer); 195 envList.addElement("SCRIPT_FILENAME=" + strBuffer); 196 } 197 198 if (scriptPath != null || scriptPath.equals("")) { 199 envList.addElement("SCRIPT_NAME=" + request.getServletPath() 200 + scriptName); 201 } 202 203 strBuffer = request.getRealPath("/"); 204 if (strBuffer != null) { 205 envList.addElement("DOCUMENT_ROOT=" + strBuffer); 206 } 207 208 strBuffer = request.getQueryString(); 209 if(strBuffer != null) { 210 envList.addElement("QUERY_STRING=" + strBuffer); 211 } 212 213 strBuffer = request.getRemoteHost(); 214 if (strBuffer != null) { 215 envList.addElement("REMOTE_HOST=" + strBuffer); 216 } 217 218 strBuffer = request.getRemoteAddr(); 219 if (strBuffer != null) { 220 envList.addElement("REMOTE_ADDR=" + strBuffer); 221 } 222 223 strBuffer = request.getAuthType(); 224 if (strBuffer != null) { 225 envList.addElement("AUTH_TYPE=" + strBuffer); 226 } 227 228 strBuffer = request.getRemoteUser(); 229 if (strBuffer != null) { 230 envList.addElement("REMOTE_USER=" + strBuffer); 231 } 232 233 if (request.getContentLength() != -1) { 234 envList.addElement("CONTENT_LENGTH=" 235 + request.getContentLength()); 236 } 237 238 strBuffer = request.getContentType(); 239 if (strBuffer != null) { 240 envList.addElement("CONTENT_TYPE=" + strBuffer); 241 } 242 243 strBuffer = request.getHeader("Accept"); 244 if (strBuffer != null) { 245 envList.addElement("HTTP_ACCEPT=" + strBuffer); 246 } 247 248 strBuffer = request.getHeader("User-Agent"); 249 if (strBuffer != null) { 250 envList.addElement("HTTP_USER_AGENT=" + strBuffer); 251 } 252 253 envList.addElement("SERVER_SOFTWARE=Enhydra6.5"); 254 255 String envVars[] = new String [envList.size()]; 257 envList.copyInto(envVars); 258 return envVars; 259 } 260 261 264 public static void cgiError(HttpServletResponse response) 265 throws IOException { 266 267 ServletOutputStream out = response.getOutputStream(); 268 response.setContentType("text/html"); 269 270 out.println("<HTML>"); 271 out.println("<HEAD>"); 272 out.println("<TITLE>CGIServlet Error</TITLE>\n</HEAD>"); 273 out.println("<BODY>"); 274 out.println("<H1>CGIServlet Error</H1>"); 275 out.println("A CGI program to execute was not specified or could not be found."); 276 out.println("</BODY>\n</HTML>"); 277 out.flush(); 278 out.close(); 279 } 280 281 } 282 | Popular Tags |