|
Posted by Andy Hassall on 11/13/55 11:59
On 27 Sep 2006 08:56:56 -0700, "webEater" <andreaskalsch@gmx.de> wrote:
>I am writing a file that reads in an external file in the web and
>prints it out including the response header of the http protocol. I do
>this to enable cross domain XMLHttpRequests.
>I implemented it via fsockopen, like this:
>
><?
>$url = $_REQUEST['uri']; // take the param as $uri
>//... more ...
> if ($c = fsockopen($host, $port, $errorNo, $errorStr, 5)) { //
>connection
> $headers = getallheaders(); // request headers
> $h = ($headers['Content-Type'] ==
>'application/x-www-form-urlencoded') ? 'POST' : 'GET'; // request
>method
> $h .= " $path HTTP/1.1\r\nHost: $host\r\n";
*klaxxon noises*
You are attempting to write an HTTP client yourself. You have made an HTTP/1.1
request, which means you _must_ implement some features as specified in the
specification to be able to decode the response, else it'll bite you.
> $h .= 'Connection: closed'."\r\n";
Not a valid value, you mean "close":
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.10
> // read and output results
> $header = true;
> while (!feof($c)) {
> $p = fgets($c);
> if ($p == "\r\n")
> $header = false;
> if ($header) {
> if (strpos($p, 'Content-Type') !== false && $html)
> header(str_replace('xml', 'html', $p));
> else
> header(trim($p));
> }
> else
> echo $p;
> }
> }
>
>^ Thats the code, test it in Firefox and IE:
>
>http://aka-fotos.de/research/uniajax/php/http.php?uri=http%3A%2F%2Faka-fotos.de%2Fresearch%2Funiajax%2FresponseXml.php
>
>It means that http.php reads the file
>http://aka-fotos.de/research/uniajax/responseXml, a simple XML file
>that looks like this:
>
><?xml version="1.0" encoding="utf-8"?><response>hello</response>
>
>Firefox shows the correct source code, exactly the same as above ^, but
>IE shows an error (cannot find the page). To get to the bottom auf
>things I used Rex Swains HTTP viewer that shows me all headers of a
>http request including the body of the page:
>http://rexswain.com/httpview.html. If you paste in my adress -
>http://aka-fotos.de/research/uniajax/php/http.php?uri=http%3A%2F%2Faka-fotos.de%2Fresearch%2Funiajax%2FresponseXml.php
>- and submit the form, you will see that the response body looks like
>this:
>
>(CR)(LF)
>26·(CR)(LF)
><?xml·version="1.0"·encoding="utf-8"?>(CR)(LF)
>1b·(CR)(LF)
><response>hello</response>(LF)
>(CR)(LF)
>0(CR)(LF)
>(CR)(LF)
>
>(CR) and (LF) are control characters, forget them, but I see some
>charakters "26" and "1b". This result differs from what Firefox shows,
>can somebody say me whats going on there?
26 and 1b are chunk sizes.
You haven't implemented HTTP/1.1 Content-transfer-encoding: chunked, which is
mandatory and very commonly used in HTTP/1.1 server replies.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1
"All HTTP/1.1 applications MUST be able to receive and decode the "chunked"
transfer-coding, and MUST ignore chunk-extension extensions they do not
understand."
Some choices:
(1) Make HTTP 1.0 requests instead of 1.1.
(2) Implement chunked transfer-coding.
(3) Use an HTTP client library that understands it, for example cURL.
--
Andy Hassall :: andy@andyh.co.uk :: http://www.andyh.co.uk
http://www.andyhsoftware.co.uk/space :: disk and FTP usage analysis tool
Navigation:
[Reply to this message]
|