LISTING 1
//Get system environment variables and put them (name=value) into a hashtable
Process p = Runtime.getRuntime().exec("cmd.exe /c set"); // System.getenv does not work before JDK 1.5
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
Hashtable h_envp = new Hashtable();
String line;
while (!procDone(p)) {
while( (line=stdInput.readLine())!=null ){
h_envp.put(line.substring(0,line.indexOf('=')).toUpperCase(), line.substring(line.indexOf('=')+1));
}
stdInput.close();
}
//List of parameters to be transferred to Perl interpreter
String envp2[] = {
"COMSPEC",
"PATH",
"PATHEXT",
"SYSTEMROOT",
"WINDIR",
request.getAuthType()!=null ? "AUTH_TYPE=" + request.getAuthType() : null,
request.getPathInfo()!=null ? "PATH_INFO==" + request.getPathInfo() : null,
request.getPathTranslated()!=null ? "PATH_TRANSLATED=" + request.getPathTranslated() : null,
"QUERY_STRING=" + ("GET".equals(request.getMethod()) ? selfLinkArguments : ""),
request.getRemoteAddr()!=null ? "REMOTE_ADDR=" + request.getRemoteAddr() : null,
request.getRemoteHost()!=null ? "REMOTE_HOST=" + request.getRemoteHost() : null,
request.getRemoteUser()!=null ? "REMOTE_USER=" + request.getRemoteUser() : null,
request.getMethod()!=null ? "REQUEST_METHOD=" + request.getMethod() : null,
request.getRequestURI()!=null ? "REQUEST_URI=" + request.getRequestURI() : null,
request.getProtocol()!=null ? "SERVER_PROTOCOL=" + request.getProtocol() : null,
"SERVER_SOFTWARE=Sybase - Jaguar CTS - Component Transaction Server/Version 5.x"
};
//Fill a vector with parameters and their values
Vector v_envp = new Vector();
for (int i=0; i=0){
// their values are precalculated
v_envp.addElement(envp2[i]);
}
}
//In case of POST, CONTENT_LENGTH must be filled with the total size of all request parameters
if ("POST".equals(request.getMethod())){
// parameters -> stdin of perl
v_envp.addElement("CONTENT_LENGTH=" +
(utf_8 ? selfLinkArguments.getBytes("UTF-8").length : selfLinkArguments.length()) );
}
//Set cookies if exist
if (cookies.length>0){
v_envp.addElement( "HTTP_COOKIE=" + cookies_str );
}
//Finally make the parameter vector eatable for Perl interpeter
String envp[] = new String[v_envp.size()];
envp = (String [])v_envp.toArray(envp);
LISTING 2
while (!procDone(p)){
int status = -1;
// process stdout
while(stdInput.ready() && (line=stdInput.readLine())!=null){
if (!header_passed){
if (line.startsWith("Content-Type: ")){
String s;
// Content-Type: text/html
// or
// Content-Type: text/html; charset=ISO-8859-1
s = line.substring("Content-Type: ".length());
response.setContentType( s );
}
else if (line.startsWith("Set-Cookie: ")){
// Set-Cookie: Bugzilla_login=1; path=/; expires=Fri, 01-Jan-2038 00:00:00 GMT
line = line.substring("Set-Cookie: ".length());
Cookie cookie = null;
StringTokenizer st = new StringTokenizer(line,";");
String token = null;
for (int n_token=0; st.hasMoreTokens(); n_token++){
token = st.nextToken().trim();
String pname = token.substring(0,token.indexOf('='));
String pvalue =
token.length()==token.indexOf('=')+1 ? "" : token.substring(token.indexOf('=')+1);
if (n_token==0){
cookie = new Cookie( pname, pvalue );
}
else{
if (pname.equals("path")){
cookie.setPath(pvalue);
}
else if (pname.equals("expires")){
// pvalue date - act date (in seconds)
try {
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd-MMM-yyyy HH:mm:ss z",
Locale.US);
sdf.setLenient(true);
Date actual_time = new Date();
Date expire_time = sdf.parse(pvalue);
cookie.setMaxAge((int)((expire_time.getTime()-actual_time.getTime())/1000));
}
catch (ParseException e) {
cookie.setMaxAge(-1); // remains alive until browser is closed
}
}
}
}
response.addCookie(cookie);
}
else if (line.startsWith("Status: ")){
line = line.substring("Status: ".length());
if (line.equals("302 Moved")){
status = 302;
}
}
else if (line.startsWith("Location: ") && status==302){
status = -1;
line = line.substring("Location: ".length());
response.sendRedirect(line);
}
}
else{
if (sos==null) sos = response.getWriter();
sos.println( line );
}
if (!header_passed && line.length()==0) header_passed = true;
} /* while */