Curl и заголовки сервера

Статус
В этой теме нельзя размещать новые ответы.

Den1xxx

Постоялец
Регистрация
15 Янв 2014
Сообщения
290
Реакции
168
Здравствуйте.
Как, при использовании curl, определить заголовки, посылаемые сервером?
Дело в том, что редиски из Гугла отдают в контенте
HTML:
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
А вот перед этим заголовками посылают хидеры с кодировкой, она имеет естественно приоритет и всё ломается.

Вот так определяются заголовки, посылаемые curl'ом:
PHP:
<?
$headers = curl_getinfo($ch,CURLINFO_HEADER_OUT);
А вот опции CURLINFO_HEADER_IN — не существует.
Но как-то можно же их посмотреть?
Ткните носом, плиз, не нашёл.
Если задавать curl_setopt($ch, CURLOPT_HEADER, true); — заголовки смешиваются с контентом, что не айс.

Весь код:
PHP:
<?
// mini proxy, manyyy bugs!
if (isset($_GET['proxy'])) {
    $url = isset($_GET['url'])?$_GET['url']:'';
    $form = '
<div style="position:relative;z-index:10500;">
<form action="" method="GET">
<input type="hidden" name="proxy" value="true">
Url: <input type="text" name="url" value="'.$url.'">
<input type="submit" value="Show">
</form>
</div>
';
    if ($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_REFERER, 'http://'.$_SERVER['HTTP_HOST']);
        ob_start();
        curl_exec($ch);
        print(curl_error($ch));
        curl_close($ch);
        $result = ob_get_clean();
        $result = str_replace('background:url(/',$url.'/',$result);
        $result = preg_replace('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
        $result = preg_replace('%(<body.*?>)%i', '$1'.$form, $result);
        echo $result;
        die();
    } else {
?>
<!doctype html>
<html>
<head>    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Proxy</title>
</head>
<body>
<?=$form?>
</body>
</html>
<?
die();
    }
}
 
PHP:
...
$result = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
curl_close($ch);

$dom = new \DOMDocument();
$source = mb_convert_encoding($result, 'HTML-ENTITIES', 'utf-8');
$dom->loadHTML($source);
$xpath = new \DOMXPath($dom);

$nodes = $xpath->query('/html/head/*');
foreach($nodes as $node){
  ....
}

....
 
PHP:
...
$result = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
curl_close($ch);

$dom = new \DOMDocument();
$source = mb_convert_encoding($result, 'HTML-ENTITIES', 'utf-8');
$dom->loadHTML($source);
$xpath = new \DOMXPath($dom);

$nodes = $xpath->query('/html/head/*');
foreach($nodes as $node){
  ....
}

....
Из всех полезных действий я вижу только строчку
PHP:
$source = mb_convert_encoding($result, 'HTML-ENTITIES', 'utf-8');
Всё остальное непонятно что и зачем. Как они помогут мне прочитать заголовок документа и определить кодировку?
 
Если вытаскивать из хедера, то как-то так:

PHP:
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
preg_match('/charset=([^"']+)/i', $contentType, $charset);
var_dump($charset);
/*
array (
  0 => 'charset=UTF-8',
  1 => 'UTF-8',
)
*/

Чтобы целиком вытащить хедер:

PHP:
$result = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$header_array = parse_http_head($header);

Но лучше обойти циклом ноды head и body
вытащить кодировку и прочее, что требуется, оттуда,
а потом вывести то, что нужно

ps.
parse_http_head() - отсюда
Для просмотра ссылки Войди или Зарегистрируйся
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху