A call to function fsockopen to read the binary output of a CGI program yields packets duplication

Posted on 2008-11-09
Last Modified: 2013-12-25

I'm trying to download the binary output of a CGI program from a PHP script using 'fsockopen'. My problem is that rather than receiving the proper sequence of binary data, I get the sequence by chunk, and I get some chunks several times. And this duplication happens in a random fashion, i.e. I never get the same output. (but the CGI always sends the same binary data (for the sake of testing)). Also, each chunk seems to be preceded by its size (written in HEX format using ASCII) and a CRLF.

e.g. If the CGI outputs a binary sequence of 256 bytes containing the sequence (0,1,2,3,4,5,...., 255), then my output could be like (61,13,10,0,1,2,3,4,5,6,7,8,9,13,10,...., 255,13,10,13,10) where 61 is ASCII A and A is HEXA for 10 and 10 is the size of the following packet. 13,10 are CRLFs.

There does not seem to be any byte remapping. So this is not about the encoding. It's really a matter of big chucks of data being sent several times.

See the PHP code I have below.

What I tried so far:
- Downloading the binary just by executing my CGI from a browser: it works like a charm.
- Downloading a binary file using the PHP script below: works like a charm.
- Downloading from the CGI output using the stream_get_contents() function: yields the same problem as described above (duplication + packet size)

Thanks for your help.
$ServerURL = '';

$url = parse_url($ServerURL);

// Eventually, this will be a more complex POST request

$request = "GET " . $url['path'] . " HTTP/1.1\n";

$request .= "Connection: Close\n";

$request .= 'Host: ' . $url['host'] . "\n\n";

// Eventually, "" will be different so cannot assume it's local

if ($socket = fsockopen("", 80, $err_num, $err_msg, 5))


	fwrite($socket, $request);


	$buffer = '';

	while (!feof($socket))


		// print for testing purposes only

		print $buffer . "\n";

		$buffer .= fread($socket, 128);




	if ($houtput = fopen($BufferFileName, "wb"))


		fwrite($houtput, $buffer);




Open in new window

Question by:MerlinMM3
    LVL 27

    Accepted Solution

    And you'd like to avoid chunked output? In that case, you may change the protocol from HTTP/1.1 into HTTP/1.0

    Author Comment

    I changed line 5 to:

    $request = "GET " . $url['path'] . " HTTP/1.0\n";

    but I still have the duplication issue. However, something to point out is that the response I get from the server hosting the CGI program still has HTTP/1.1 in its header. Maybe if I could find a way to enforce the response to be HTTP 1.0. How do you do that?
    LVL 27

    Expert Comment

    If you've access to the server which responds (win2vo.cgi) you may try the code below in httpd.conf or in a .htaccess file in order to force and/or downgrade to http/1.0:
    SetEnvIf Request_URI "/testing/win2vo.cgi" downgrade-1.0 force-response-1.0

    Open in new window


    Author Comment

    This is getting more and more interesting. I tried adding this to the httpd.conf file. Now I get an HTTP 1.0 response but I still get the duplication problem.

    Author Comment

    The problem of duplication was solved with your first post. I just assumed I still got the duplication problem because I mistakenly put the print statement inside the fread loop instead of outside. Thanks a lot for your help caterham_www.

    Author Comment

    If some readers still have the problem, they might be interested in reading this article:

    Featured Post

    What Is Threat Intelligence?

    Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

    Join & Write a Comment

    This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
    These days socially coordinated efforts have turned into a critical requirement for enterprises.
    In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
    In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

    746 members asked questions and received personalized solutions in the past 7 days.

    Join the community of 500,000 technology professionals and ask your questions.

    Join & Ask a Question

    Need Help in Real-Time?

    Connect with top rated Experts

    16 Experts available now in Live!

    Get 1:1 Help Now