Странное поведение Curl

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Весь день с этой ошибкой сижу, всё не могу понять почему так выходит.

Делаю автоматическое добавление сайтов в CloudFlare.

Получаем записи домена так:
PHP:
$records = $this->request('api/v4/zones/'.$content['result']['id'].'/dns_records?page=1&per_page=100&order=type&direction=asc', array(), false, $headers);
$records = json_decode($records, true);

if($records['success']===false)
{
    return 'Ошибка при получении данных домена';
}

Функция request:
PHP:
public function request($url, $data=array(), $return_headers=false, $send_headers=array(), $method=false, $referer=false)
    {
        $cookie_path = FCPATH.'application/cache/cookie.dat';

        if(!$cookie = config_item('cf_cookie') or config_item('cf_cookie')==='')
            $cookie = file_get_contents($cookie_path);
      
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'https://www.cloudflare.com/'.$url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HEADER, true);
        curl_setopt($curl, CURLOPT_COOKIE, $cookie);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $send_headers);
        curl_setopt($curl, CURLINFO_HEADER_OUT, true);
        curl_setopt($curl, CURLOPT_USERAGENT, self::$useragent);
      
        if($method)
        {
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }
      
        if($referer)
        {
            curl_setopt($curl, CURLOPT_REFERER, $referer);
        }
      
        if(sizeof($data))
        {
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        }
      
        $out = curl_exec($curl);
        $info = curl_getinfo($curl);

      
        $return = array();
        $return['h'] = substr($out, 0, $info['header_size']);
        $return['b'] = substr($out, $info['header_size']);
        $return['i'] = $info;
      
        curl_close($curl);
      
      
        preg_match_all("/Set-Cookie: (.*?)=(.*?);/i",$return['h'],$out_cookie);
      
        $cookie='';
        foreach ($out_cookie[1] as $key => $value) {
            $cookie .= $value.'='.$out_cookie[2][$key].';';
        };
      
        set_config('cf_cookie', $cookie);
        file_put_contents($cookie_path, $cookie);
        $this->log("URL: https://www.cloudflare.com/{$url};\nRequest headers:\n{$return['i']['request_header']};\n\nReferer: {$referer};\n\nResponse headers:\n{$return['h']};\n\nResponse body:\n{$return['b']};");
      
        if($return_headers) return $return;
                else return $return['b'];
    }

Тут последним параметром указываем $referer и если он есть, то передаем курлу, а так же записываем в лог всё это. И реферер тоже отдельно записываем в лог.

Смотрим лог:
Код:
2015-07-18 21-09-03 - URL: https://www.cloudflare.com/api/v4/zones/912ebb6a697ac6523653854c34b61f64/dns_records?page=1&per_page=100&order=type&direction=asc;
Request headers:
GET /api/v4/zones/912ebb6a697ac6533653854c34b31f64/dns_records?page=1&per_page=100&order=type&direction=asc HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
Host: www.cloudflare.com
Accept: */*
Cookie: vses2=7guo955gbdk0v986aq5min8c93;__cf_effload=1;
Referer: https://www.cloudflare.com/a/setup/site.ru/step/2
X-ATOK: 1437329340-da25eee3ed4d5443eb3b
X-NewRelic-ID: XOUOVMNRGwcJVlRQBAA=
X-Requested-With: XMLHttpRequest

;

Referer: ;

Response headers:
HTTP/1.1 403 Forbidden
Server: cloudflare-nginx
Date: Sat, 18 Jul 2015 18:09:03 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=de464e74528e5d12cfcba35a94cc85ae21437342942; expires=Sun, 17-Jul-16 18:09:02 GMT; path=/; domain=.cloudflare.com; HttpOnly
Expires: Sun, 25 Jan 1981 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-NewRelic-App-Data: PxQPUl9WCgETUFhQAgMEV0YdFGQHBDcQUQxLA1tMXV1dORYiRBJHDQlqGCYjNxhvHx4ODFJCa0leWFJvTQINEW8QXQFXSlBBEUkJTwFRA1JUGgdPVlMAAQdITFMbEwcEBQEHA1ZeW1QFUQ5VAVwWHlUEVRJUPA==
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
CF-RAY: 208022a5ba1015cb-FRA

;

Response body:
{"success":false,"errors":[{"code":9303,"message":"Invalid Action Token"}],"messages":[],"result":null};

[---[END]---]

В отправленных заголовках вроде как есть реферер, но в отдельном поле, где для реферера место выделено пусто!

И ошибка пришла от CF: Invalid Action Token, а она, на сколько я знаю, приходит когда реферер не тот или его вообще нет.

Что с реферером?
 
Какие заголовки уходят в переменной $headers в функцию request? Вероятно реферер описан там, иначе ему неоткуда появиться. CURLOPT_AUTOREFERER не включен и не может повлиять.
Почему в данной конструкции он не фигурирует в отдельном логе - потому что переменная $referer = false при переводе в строку будет пустой строкой. true перевелся бы в единицу.
 
Назад
Сверху