如何使用流获取标头



考虑这个函数:

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-urlencodedrn";
    if (!empty($headers)) {
        foreach ($headers as $head) {
                 $header.="$headrn";
        }
    }
    $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);
}

我使用这样的功能:

$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));

由于目标url是phpinfo,我可以验证$_POST['foo']是否设置为bar和

CONTENT_TYPE = application/x-www-form-urlencoded

HTTP_FOO = baz

所以上下文似乎运行良好,但当我使用时

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

我得到

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
)

为什么内容类型是错误的,而HTTP_FOO实际上是一个标头却没有显示在这里?下面的改动也于事无补。我该怎么办?以获得自定义标题和正确的内容类型?

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

我搜索了SO,发现了这个如何在PHP中POST请求后获得HTTP响应头?但正如我所说,我尝试了stream_get_meta_data($fp)get_headers($url),但我没有得到我的自定义标头。我还能做什么?

从谷歌找到你的线程,因为我和你有同样的问题。我使用函数stream_context_set_default解决了这个问题。我想我会把它发布给下一个从谷歌跌跌撞撞进来的人,或者如果你还需要一个解决方案的话。

相关内容

  • 没有找到相关文章

最新更新