473,387 Members | 1,501 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

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

Hey,

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";
foreach ($headers as $name =$content) {
// don't forward user's (and your) cookies to external server!
if ($name == 'Accept')
$h .= 'Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*;q=0.5'."\r\n";
elseif ($name == 'Accept-Encoding')
$h .= 'Accept-Encoding: '."\r\n";
elseif ($name != 'Host' && $name != 'Connection' && $name !=
'Cookie')
$h .= $name.': '.$content."\r\n";
}
$h .= 'Connection: closed'."\r\n";
$h .= "\r\n";
// header sent

// post content
if ($_POST) {
$posts = array();
foreach ($_POST as $key =$value)
$posts[] = urlencode($key).'='.urlencode($value);
$h .= implode('&', $posts);
}
fwrite($c, $h);

// 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;
}
}
fclose($c);
}
else
echo $errorNo.' '.$errorStr;
}
?>

^ Thats the code, test it in Firefox and IE:

http://aka-fotos.de/research/uniajax...esponseXml.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...esponseXml.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?

I hope somebody can help me!
Thanks,

Andi

Sep 27 '06 #1
3 2125
On 27 Sep 2006 08:56:56 -0700, "webEater" <an***********@gmx.dewrote:
>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/....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...esponseXml.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...esponseXml.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/....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 :: an**@andyh.co.uk :: http://www.andyh.co.uk
http://www.andyhsoftware.co.uk/space :: disk and FTP usage analysis tool
Sep 27 '06 #2
Hi,

thank you, your notes helped me very much!
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/....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.
I took the first choice - taking v1.0 - it's simpler. Now it works
properly ,)

Sep 27 '06 #3
Hello,

on 09/27/2006 12:56 PM webEater said the following:
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:
I think you should not send headers that your HTTP client is not capable
of understanding.

Anyway, instead of reinventing the wheel, you may want to try this
proven HTTP client class:

http://www.phpclasses.org/httpclient
--

Regards,
Manuel Lemos

Metastorage - Data object relational mapping layer generator
http://www.metastorage.net/

PHP Classes - Free ready to use OOP components written in PHP
http://www.phpclasses.org/
Sep 28 '06 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Jerry | last post by:
I've found a problem with exec, passthru, shell_exec & system. I'm trying to run the following exec("sort -r -n -k2,2 r1.txt > r2.txt") with r1.txt being a numeric file. The file looks like...
7
by: Juul | last post by:
Hi, My hostingprovider just updated to PHP 4.4. Since that time I have problems using the mail() function in PHP. I can't send headers anymore and my provider don't know what's wrong. ...
1
by: Shahzad Atta | last post by:
Hi there, My web server needs to get html source of a web page from a remote web server . This html will be rendered to client browser after some processing. I know it can be done via XMLHTTP...
1
by: Andrea | last post by:
I was trying to deserialize my xml file (I enclose it below ) into a class. So I generated an xsd file given my xml using the MS xsd tool; then I generated the corresponsing C# class (using the MS...
8
by: Andreas Klemt | last post by:
Hello, I get this error Message "cannot redirect after http headers have been sent" when I do this response.redirect ("home.aspx") How can I find out with vb.net if already a http header has...
6
by: Andreas Klemt | last post by:
Hello, I get this error Message "cannot redirect after http headers have been sent" when I do this response.redirect ("home.aspx") How can I find out with vb.net if already a http header has...
4
by: batista | last post by:
Hi there, My problem is that, i've created a simple hello world web service project, and then, when i run it to test the operation,the invoke button does not open any window. I mean there is...
0
by: seven.su | last post by:
I am trying to streaming back a xls file in page render event and this has been working properly in .net 1.1. But now I got 'Server cannot set content type after HTTP headers have been sent' under...
5
by: gibble | last post by:
Hi, I am going crazy. We get a hundred or so of these errors each day and while the fix would seem obvious, the error does not include a line number! -------------------- Process...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.