user4271704 user4271704 - 2 months ago 9
HTTP Question

How to get header with stream?

Consider this function:

function use_fopen($url, $make_post_field, $headers = '') {

$context = array(
'http' => array(
'method' => 'POST',
'timeout' => '60',
'content' => $make_post_field)
);
$header = "Content-type: application/x-www-form-urlencoded\r\n";
if (!empty($headers)) {
foreach ($headers as $head) {
$header.="$head\r\n";
}
}

$context['http']['header'] = $header;
$context = stream_context_create($context);

//$contents = @file_get_contents($url, null, $context);
$fp = fopen($url, 'r', false, $context);

$stream_meta_data = @stream_get_meta_data($fp);
print_r($stream_meta_data );
fclose($fp);
}


I use the function like this:

$headers = array ('baz: bar');
$data = array ('foo' => 'bar', 'bar' => 'baz');
$data = http_build_query($data);
print(use_fopen("http://www.example.com/phpinfo.php", $data, $headers));


As target url is phpinfo, I can verify that
$_POST['foo']
is set to bar and

CONTENT_TYPE = application/x-www-form-urlencoded


HTTP_FOO = baz


So it seems context is working fine, but when I use

$stream_meta_data = @stream_get_meta_data($fp);
print_r($stream_meta_data );


I get

Array
(
[timed_out] =>
[blocked] => 1
[eof] =>
[wrapper_data] => Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Tue, 02 Aug 2016 11:46:36 GMT
[2] => Server: Apache
[3] => Connection: close
[4] => Content-Type: text/html; charset=UTF-8
)

[wrapper_type] => http
[stream_type] => tcp_socket/ssl
[mode] => r
[unread_bytes] => 8061
[seekable] =>
[uri] => http://wwwexample.com/phpinfo.php
)


why content-type is wrong and HTTP_FOO that is actually a header is not shown here? the change below also did not help. what should I do? to get custom headers and correct content-type?

$contents = @file_get_contents($url, null, $context);
print_r(get_headers($url));


I searched SO and found this How to get HTTP response headers after POST request in PHP? but as I said I tried both
stream_get_meta_data($fp)
and
get_headers($url)
but I don't get my custom headers. what else should I do?

Answer

It seems you are confused with request header and response header. You can't send HTTP_FOO header from client and expect it to be in header of server. You need to set it in target script in server side:

header ('HTTP_FOO: Bar');

Comments