W3C home > Mailing lists > Public > www-talk@w3.org > May to June 2006

Re: How to implement CGI in a Web Server

From: Mukul Gandhi <gandhi.mukul@gmail.com>
Date: Sun, 7 May 2006 22:45:44 +0530
Message-ID: <7870f82e0605071015p4dc6ce8dy5ac4439664dd6c30@mail.gmail.com>
To: www-talk@w3.org

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 <gandhi.mukul@gmail.com> 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
Received on Sunday, 7 May 2006 17:15:58 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Wednesday, 27 October 2010 18:14:29 GMT