- From: Mukul Gandhi <gandhi.mukul@gmail.com>
- Date: Sun, 7 May 2006 22:45:44 +0530
- 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 UTC