<commit_before><?php

namespace Maruamyu\Core\Http;

use Maruamyu\Core\Http\Driver\DriverFactory;
use Maruamyu\Core\Http\Driver\DriverInterface;
use Maruamyu\Core\Http\Message\Header;
use Maruamyu\Core\Http\Message\NormalizeMessageTrait;
use Maruamyu\Core\Http\Message\Request;
use Maruamyu\Core\Http\Message\Response;
use Maruamyu\Core\Http\Message\UriInterface;

/**
 * HTTPクライアント
 */
class Client
{
    use NormalizeMessageTrait;

    /**
     * @var Header
     */
    protected $defaultHeaders;

    /**
     * @var DriverFactory
     */
    protected $httpDriverFactory = null;

    /**
     * @var Response
     */
    protected $latestResponse = null;

    /**
     * @param array $config 設定
     */
    public function __construct(array $config = [])
    {
        if (isset($config['headers'])) {
            $this->defaultHeaders = new Header($config['headers']);
        } else {
            $this->defaultHeaders = null;
        }
    }

    /**
     * 指定されたリクエストメッセージを送信し, レスポンスを返す.
     *
     * @param Request $request リクエスト情報
     * @return Response レスポンス
     */
    public function send(Request $request)
    {
        if (!$request->hasHeader('User-Agent')) {
            $defaultUserAgent = $this->defaultUserAgent();
            if (strlen($defaultUserAgent) > 0) {
                $request = $request->withHeader('User-Agent', $defaultUserAgent);
            }
        }

        $httpDriver = $this->getHttpDriver($request);
        $response = $httpDriver->execute();

        $this->latestResponse = $response;

        return $response;
    }

    /**
     * 指定されたメソッドとURLでリクエストを行う.
     *
     * @param string $method HTTPメソッド
     * @param string|UriInterface $uri URL
     * @param array $options オプション
     * @return Response レスポンス
     */
    public function request($method, $uri, array $options = [])
    {
        if ($options && isset($options['headers'])) {
            if ($this->defaultHeaders) {
                $headers = clone $this->defaultHeaders;
                $headers->merge($options['headers'], true);
            } else {
                $headers = new Header($options['headers']);
            }
        } else {
            $headers = $this->defaultHeaders;
        }
        $request = new Request($method, $uri, null, $headers);
        return $this->send($request);
    }

    /**
     * 最後のレスポンスを取得する.<commit_msg>HTTPクライアント: bodyを指定できるように<commit_after><?php

namespace Maruamyu\Core\Http;

use Maruamyu\Core\Http\Driver\DriverFactory;
use Maruamyu\Core\Http\Driver\DriverInterface;
use Maruamyu\Core\Http\Message\Header;
use Maruamyu\Core\Http\Message\NormalizeMessageTrait;
use Maruamyu\Core\Http\Message\Request;
use Maruamyu\Core\Http\Message\Response;
use Maruamyu\Core\Http\Message\UriInterface;

/**
 * HTTPクライアント
 */
class Client
{
    use NormalizeMessageTrait;

    /**
     * @var Header
     */
    protected $defaultHeaders;

    /**
     * @var DriverFactory
     */
    protected $httpDriverFactory = null;

    /**
     * @var Response
     */
    protected $latestResponse = null;

    /**
     * @param array $config 設定
     */
    public function __construct(array $config = [])
    {
        if (isset($config['headers'])) {
            $this->defaultHeaders = new Header($config['headers']);
        } else {
            $this->defaultHeaders = null;
        }
    }

    /**
     * 指定されたリクエストメッセージを送信し, レスポンスを返す.
     *
     * @param Request $request リクエスト情報
     * @return Response レスポンス
     */
    public function send(Request $request)
    {
        if (!$request->hasHeader('User-Agent')) {
            $defaultUserAgent = $this->defaultUserAgent();
            if (strlen($defaultUserAgent) > 0) {
                $request = $request->withHeader('User-Agent', $defaultUserAgent);
            }
        }

        $httpDriver = $this->getHttpDriver($request);
        $response = $httpDriver->execute();

        $this->latestResponse = $response;

        return $response;
    }

    /**
     * 指定されたメソッドとURLでリクエストを行う.
     *
     * @param string $method HTTPメソッド
     * @param string|UriInterface $uri URL
     * @param array $options オプション
     * @return Response レスポンス
     */
    public function request($method, $uri, array $options = [])
    {
        if ($options && isset($options['headers'])) {
            if ($this->defaultHeaders) {
                $headers = clone $this->defaultHeaders;
                $headers->merge($options['headers'], true);
            } else {
                $headers = new Header($options['headers']);
            }
        } else {
            $headers = $this->defaultHeaders;
        }
        if ($options && isset($options['body'])) {
            $body = $options['body'];
        } else {
            $body = null;
        }
        $request = new Request($method, $uri, $body, $headers);
        return $this->send($request);
    }

    /**
     * 最後のレスポンスを取得する.
{'fraction_non_alphanumeric': 0.13917841814837523, 'fraction_numerical': 0.0004087471898630697, 'mean_word_length': 2.127156549520767, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3083621', 'n_tokens_mistral': 1580, 'n_tokens_neox': 1551, 'n_words': 270}