пятница, 13 мая 2016 г.

Referer in Guzzle v6 for few step by step connections

Referer в Guzzle v6 для клиента с последовательными запросами.



function useReferer() {
    return function (callable $handler) {
        return function (
            Psr\Http\Message\RequestInterface $request,
            array $options
        ) use ($handler) {
         static $lastRefer; // немного некрасиво если использовать параллельно в нескольких клиентах

         $exist=$request->getHeaderLine('Referer');
         if(empty($exist) && !empty($lastRefer)) { // если есть - не заменяем.
          $request = $request->withHeader('Referer', $lastRefer);
         }
         $lastRefer=(string)$request->getUri();
            return $handler($request, $options);
        };
    };
}


$stack = new GuzzleHttp\HandlerStack();
$stack->setHandler(new GuzzleHttp\Handler\CurlHandler());
$stack->push(useReferer());
// не забываем указать и значения по умолчанию. А то если мы создаем Handler нам и следить за его наполненостью.
$stack->push(GuzzleHttp\Middleware::httpErrors(), 'http_errors');
$stack->push(GuzzleHttp\Middleware::redirect(), 'allow_redirects');
$stack->push(GuzzleHttp\Middleware::cookies(), 'cookies');
$stack->push(GuzzleHttp\Middleware::prepareBody(), 'prepare_body');

$client=new GuzzleHttp\Client(array('base_uri' => 'http://example.com/','verify'=>false,'http_errors'=>false,'handler'=>$stack));

$r=$client->get('page1');
$r=$client->get('page2');