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

Тема в разделе "PHP", создана пользователем Den1xxx, 6 мар 2017.

Метки:
Статус темы:
Закрыта.
Модераторы: latteo
  1. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    280
    Симпатии:
    155
    Здравствуйте.
    Как, при использовании 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($chCURLOPT_USERAGENT'Den1xxx test proxy');
            
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
            
    curl_setopt($chCURLOPT_SSL_VERIFYHOST,0);
            
    curl_setopt($chCURLOPT_SSL_VERIFYPEER,0);
            
    curl_setopt($chCURLOPT_HEADER0);
            
    curl_setopt($chCURLOPT_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();
        }
    }
     
  2. alex_me

    alex_me

    Регистр.:
    25 янв 2017
    Сообщения:
    167
    Симпатии:
    113
    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){
      ....
    }

    ....
     
    Den1xxx нравится это.
  3. Den1xxx

    Den1xxx

    Moderator
    Регистр.:
    15 янв 2014
    Сообщения:
    280
    Симпатии:
    155
    Из всех полезных действий я вижу только строчку
    PHP:
    $source mb_convert_encoding($result'HTML-ENTITIES''utf-8');
    Всё остальное непонятно что и зачем. Как они помогут мне прочитать заголовок документа и определить кодировку?
     
  4. alex_me

    alex_me

    Регистр.:
    25 янв 2017
    Сообщения:
    167
    Симпатии:
    113
    Если вытаскивать из хедера, то как-то так:

    PHP:
    $contentType curl_getinfo($chCURLINFO_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($chCURLINFO_HEADER_SIZE);
    $header substr($result0$header_size);
    $header_array parse_http_head($header);
    Но лучше обойти циклом ноды head и body
    вытащить кодировку и прочее, что требуется, оттуда,
    а потом вывести то, что нужно

    ps.
    parse_http_head() - отсюда
    http://stackoverflow.com/questions/9905224/get-content-type-from-curl
     
    latteo и Den1xxx нравится это.
  5. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    482
    Симпатии:
    1.184
Статус темы:
Закрыта.