Re: HTTP problem, wrong characters sent (HTTP pro's needed!)



On 27 Sep 2006 08:56:56 -0700, "webEater" <andreaskalsch@xxxxxx> 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@xxxxxxxxxxx :: http://www.andyh.co.uk
http://www.andyhsoftware.co.uk/space :: disk and FTP usage analysis tool
.



Relevant Pages

  • Write-up by Amit Klein: "Forging HTTP request headers with Flash"
    ... Forging HTTP request headers with Flash ... A similar syntax will send POST request (with the same header, ...
    (Bugtraq)
  • Re: that preload swf files question again ...
    ... download the swf files. ... As you back-tracked through the HTTP specification from the 206 response to the Range and If-Range headers you will have noticed that this sample of the HTTP traffic was too far down stream of be informative. ... The request that Firefox initially decided not to cache was the first one it made to the server; the one with the 200 response. ... When I make that request the only header returned that is likely to have an impact on the cache-ability of the resource was the Last-Modified header. ...
    (comp.lang.javascript)
  • Re: Little problem with C program
    ... 'sizeof request' returns the size of a pointer, ... you need to do with HTTP.) ... > message "Reading response ..." ... That system puts the GET inside the function, so I call it like this: ...
    (comp.programming)
  • Re: Getting the HTTP Content-Length Parameter
    ... > I'm doing a "low level" project that consists on monitoring certain ... > HTTPWebRequest and Response. ... > Any expert on HTTP headers and servers? ... a Content-Length header is not a required ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Screen Scraping a Password Protected Site
    ... http traffic. ... cookies to a singleton CookieContainer and the once you have logged in ... If TypeOf request Is HttpWebRequest Then ... If TypeOf response Is HttpWebResponse Then ...
    (microsoft.public.dotnet.languages.vb)