This is in reference to my mail below regarding implementing CGI in a
Web Server.

After some work I found that this way:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdarray, envp);

of invoking the CGI program will not work on Windows (I am working on
Win XP). Because the command is executed already, and there is no way
I can pass POST data to a java.lang.Process object.

As a workaround, I am (my web server) now writing POST data to a file.
And the CGI script is reading from the file.

Following is the pseudocode in the Web Server:
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();

//write to file as interface for POST data
FileWriter fw = new FileWriter("postdata");
fw.write(httpbody);
fw.flush();
fw.close();

//execute CGI program
String program = resource.substring(resource.indexOf("/") + 1);
String[] cmdarray = {"C:\\php-5.0.5\\php.exe", "htdocs\\"+program, line};
String[] envp = {"CONTENT_LENGTH="+clength,
"CONTENT_TYPE=application/x-www-form-urlencoded"};
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdarray, envp);

//send output to browser
String header = "HTTP/1.1 200 OK\n";
header += "Content-Type: text/html\n\n";
os.write(header.getBytes());
os.flush();

InputStream pis = process.getInputStream();

while ((n = pis.read()) != -1) {
   char c = (char)n;
   os.write(c);
   os.flush();
}

pis.close();

//delete file "postdata"
File pd = new File("postdata");
pd.delete();

Now in the PHP file, I do following to read POST data:
<?php

 //read post data from file
 $handle = @fopen("postdata", "r");
 $postdata = "";
 if ($handle) {
   while (!feof($handle)) {
     $buffer = fgets($handle, 4096);
     $postdata = $postdata . $buffer;
   }
   fclose($handle);
 }

 //decode post data
 $a = explode('&', $postdata);
 $i = 0;
 while ($i < count($a)) {
   $b = split('=', $a[$i]);
   echo 'Value for parameter ', htmlspecialchars(urldecode($b[0])),
          ' is ', htmlspecialchars(urldecode($b[1])), "<br />\n";
   $i++;
 }

?>

This works. But does this violate CGI 1.1 spec in any way?

Regards,
Mukul

On 5/3/06, Mukul Gandhi <[EMAIL PROTECTED]> wrote:
I am trying to write a small HTTP server using Java. I have some doubt
about how to implement CGI.

This is a portion of Java code that handles HTTP POST method, and
tries to execute a PHP script. I feel this is the correct way to
implement CGI (of course there are many more environment variables
which I must set for CGI, which I'll do later). Later I'll try to
incorporate CGI programs written in any CGI programming language.

String[] cmdarray = {"C:\\php-5.0.5\\php.exe", "htdocs\\test.php"};
String[] envp = {"CONTENT_LENGTH="+clength,
"CONTENT_TYPE=application/x-www-form-urlencoded"};

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(cmdarray, envp);
InputStream pis = process.getInputStream();

String header = "HTTP/1.1 200 OK\n";
header += "Content-Type: text/html\n\n";

os.write(header.getBytes());
os.flush();

int n = 0;
while ((n = pis.read()) != -1) {
 char c = (char)n;
 os.write(c);
 os.flush();
}

I am correctly assigning the value to variable clength for
CONTENT_LENGTH environment variable (taken from request header
Content-Length). os is the OutputStream attached to the socket which
is bound to a specific connection from the browser.

The PHP script (test.php) gets correctly called, and the output from
PHP script correctly gets displayed on the browser. But the problem
happens when I submit a HTML form to be handled by PHP. How will the
PHP script read form data from HTTP body in the request? For
information I must tell that HTML form POST data is accessible in the
PHP script as $_POST["name"] (which presently incorrectly sets to
null).

I'll be grateful for any pointers to solve this problem, and also any
comments on the CGI implementation approach I am using..

Regards,
Mukul

Reply via email to