Re: Re: The specified CGI application misbehaved by not returning acomplete set of HTTP headers.
| From: | HKG) | Date: | Tue, 23 Mar 2004 09:45:02 +0000 |
| Subject: | Re: Re: The specified CGI application misbehaved by not returning acomplete set of HTTP headers. | ||
| References: | 1 2 | Groups: | php.windows |
| Request: | Send a blank email to php-windows+get-23234@lists.php.net to get a copy of this message | ||
Your suggestion to redirect stderr to stdin works splendid.
On Mon, 2004-03-22 at 12:44, DvDmanDT wrote:
> I would suspect popen() happends to output STDERR, and that dir returns some
> STDERR when no files are found, or when the argument is invalid.. And if so,
> the STDERR message would get output directly to the webserver, and if it
> contains two newlines (which it does really I think), the webserver wouldn't
> get a complete set of headers (which it's complaining about)...
>
> Add this at the end of your command: 2 > &1, like this:
>
> $ListDir = "dir $Dir\\*.$pattern 2>&1";
>
> Also, I think this would be even better:
> $ListDir = "dir \"$Dir\\*.$pattern\" 2>&1";
>
> Happy coding!
> --
> // DvDmanDT
> MSN: dvdmandt$hotmail.com
> Mail: dvdmandt$telia.com
> "B.A.T. Svensson" <B.A.T.Svensson@lumc.nl> skrev i meddelandet
> news:1079951719.30259.138.camel@ander...
> > I am curious about why the following error:
> >
> >
> > "The specified CGI application misbehaved by not returning a complete
> > set of HTTP headers."
> >
> > is generated while trying to read data from an empty pipe.
> >
> >
> >
> > **********************************************************
> >
> > DISCUSSION:
> >
> > I have an (working) application that renders an out put in
> > side a table based on the menu selection the user does.
> >
> > Basically the web pages is organized as such:
> >
> > +-----------+
> > | PAGE HEAD |
> > +-+---------+
> > |M| |
> > |E| OUTPUT |
> > |N| VIEW |
> > |U| |
> > . . .
> > . . .
> > . . .
> > +-+---------+
> > | PAGE FOOT |
> > +-----------+
> >
> >
> >
> > Now, if I select a certain menu choices, and the system is in a
> > certain state (will soon explain this) then the CGI error "The
> > specified CGI application misbehaved by not returning a complete
> > set of HTTP headers." occurs.
> >
> > What trigger then the error then, well, it is derived from a
> > function like this:
> >
> > (This function will output its display data the "OUTPUT VIEW".)
> >
> > function ug_show_files($Dir, $pattern, $Message)
> > {
> > print "<pre>$Message\r\n";
> >
> > $ListDir = "dir $Dir\\*.$pattern";
> > if ($pipe = popen($ListDir, "r")) {
> >
> > while (!feof($pipe)) {
> > $line = trim(fgets($pipe));
> > print "$line\n";
> > }
> >
> > pclose($pipe);
> > }
> >
> print"<pre>";
> > return "ok";
> > }
> >
> > The above code list a given directory based on $pattern.
> > However whenever no files are found, then the above CGI error
> > is generated - but never if there is a content found. I was a
> > bit confused about this, since the only difference is that the
> > directory listing does not generate an output, so in my point
> > of view it should work, but it did not.
> >
> >
> > I boiled down the problem to be related with fgets() - the error
> > occurs when the directory listing does not return anything, so I
> > thought I would be able to get rid of the error by writing the code
> > like this instead:
> >
> > function ug_show_files($Dir, $pattern, $Message)
> > {
> > print "<pre>$Message\r\n";
> >
> > $ListDir = "dir $Dir\\*.$pattern";
> > if ($pipe = popen($ListDir, "r")) {
> >
> > $a = fgets($pipe)
> > while (!feof($pipe)) {
> > $line = trim($a);
> > print "$line\n";
> > $a = fgets($pipe);
> > }
> > pclose($pipe);
> > }
> >
> print"<pre>";
> > return "ok";
> > }
> >
> >
> > However the error persisted whenever the directory list
> > was empty so I changed the code to look like this:
> >
> > function ug_show_files($Dir, $pattern, $Message)
> > {
> > print "<pre>$Message\r\n";
> >
> > $ListDir = "dir $Dir";
> > if ($pipe = popen($ListDir, "r")) {
> >
> > while (!feof($pipe)) {
> >
> > $line = trim(fgets($pipe));
> > if (strpos($line, ".$pattern")) {
> > print "$line\n";
> > }
> >
> > }
> > pclose($pipe);
> > }
> >
> print"<pre>";
> > return "ok";
> > }
> >
> > And after this the pages stop returning an error. Now to the
> > question; why is it that fgets() generates this CGI error
> > when fgets() read from an empty pipe?