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 */