nopolabs/yabot

View on GitHub
src/Guzzle/GuzzleFactory.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Nopolabs\Yabot\Guzzle;

use GuzzleHttp\Client;
use GuzzleHttp\Handler\CurlMultiHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use Nopolabs\ReactAwareGuzzleClientFactory;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use React\EventLoop\LoopInterface;

class GuzzleFactory
{
    private $eventLoop;
    private $logger;

    public function __construct(LoopInterface $eventLoop, LoggerInterface $logger = null)
    {
        $this->eventLoop = $eventLoop;
        $this->logger = $logger ?? new NullLogger();
    }

    public function newClient(array $config) : Client
    {
        $clientFactory = new ReactAwareGuzzleClientFactory(function(CurlMultiHandler $handler) {
            return $this->createHandlerStack($handler);
        });

        return $clientFactory->createGuzzleClient($this->eventLoop, $config, null, $this->logger);
    }

    /**
     * Like HandlerStack::create() except no http_errors
     * @see http://docs.guzzlephp.org/en/stable/request-options.html#http-errors
     *
     * @param CurlMultiHandler $handler
     * @return HandlerStack
     */
    public function createHandlerStack(CurlMultiHandler $handler) : HandlerStack
    {
        $stack = new HandlerStack($handler);
        $stack->push(Middleware::redirect(), 'allow_redirects');
        $stack->push(Middleware::cookies(), 'cookies');
        $stack->push(Middleware::prepareBody(), 'prepare_body');

        return $stack;
    }
}