<commit_before><?php

namespace Maruamyu\Core\Http\Message;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UploadedFileInterface;

/**
 * Webアプリから利用するリクエストコンテキストデータ
 */
class ServerRequest extends Request implements ServerRequestInterface
{
    /**
     * @var array
     */
    protected $serverParams;

    /**
     * @var array
     */
    protected $cookieParams;

    /**
     * @var array
     */
    protected $queryParams;

    /**
     * @var array
     */
    protected $parsedBody;

    /**
     * @var UploadedFileInterface[]
     */
    protected $uploadedFiles;

    /**
     * @var array
     */
    protected $attributes;

    /**
     * サーバーのパラメータを返す.
     *
     * @return array $_SERVER
     */
    public function getServerParams()
    {
        return $this->serverParams;
    }

    /**
     * Cookieを返す.
     *
     * @return array $_COOKIE
     */
    public function getCookieParams()
    {
        return $this->cookieParams;
    }

    /**
     * 指定されたCookieデータを設定した新しいインスタンスを返す.
     *
     * @param array $cookieParams パラメータ
     * @return static パラメータを設定した新しいインスタンス
     */
    public function withCookieParams(array $cookieParams)
    {
        $newInstance = clone $this;
        $newInstance->cookieParams = $cookieParams;
        return $newInstance;
    }

    /**
     * QUERY_STRINGの内容をパースして返す.
     * ({parse_str()}を使ったPHP互換形式)
     *
     * @return array QUERY_STRINGの内容
     */
    public function getQueryParams()
    {
        return $this->queryParams;
    }

    /**
     * 指定されたQUERY_STRINGデータを設定した新しいインスタンスを返す.
     * ({parse_str()}を使ったPHP互換形式)
     *
     * @param array $queryParams パラメータ
     * @return static パラメータを設定した新しいインスタンス
     */
    public function withQueryParams(array $queryParams)
    {
        $newInstance = clone $this;
        $newInstance->queryParams = $queryParams;
        return $newInstance;
    }

    /**
     * アップロードされたファイルのリストを取得する.
     *
     * @return UploadedFileInterface[] アップロードファイルのリスト
     */
    public function getUploadedFiles()
    {
        return $this->uploadedFiles;
    }

    /**
     * アップロードされたファイルのリストを設定した新しいインスタンスを返す.
     *
     * @param UploadedFileInterface[] $uploadedFiles アップロードファイルのリスト
     * @return static パラメータを設定した新しいインスタンス
     * @throws \InvalidArgumentException 入力データが正しくないとき
     */
    public function withUploadedFiles(array $uploadedFiles)
    {
        $newInstance = clone $this;
        $newInstance->uploadedFiles = [];
        foreach ($uploadedFiles as $uploadedFile) {
            if (!($uploadedFile instanceof UploadedFileInterface)) {
                throw new \InvalidArgumentException('invalid uploaded files.');
            }
            $newInstance->uploadedFiles[] = clone $uploadedFile;
        }
        return $newInstance;
    }

    /**
     * POSTパラメータの内容をパースして返す.
     * ({parse_str()}または{json_decode()}を使ったPHP互換形式)
     *
     * @return null|array|object POSTパラメータの内容
     */
    public function getParsedBody()
    {
        return $this->parsedBody;
    }

    /**
     * POSTパラメータの内容を設定した新しいインスタンスを返す.
     * ({parse_str()}または{json_decode()}を使ったPHP互換形式)
     *
     * @param null|array|object $parsedBody POSTデータ
     * @return static POSTデータを設定した新しいインスタンス
     * @throws \InvalidArgumentException POSTデータが正しくないとき
     */
    public function withParsedBody($parsedBody)
    {
        if (!(is_null($parsedBody)) && !(is_array($parsedBody)) && !(is_object($parsedBody))) {
            throw new \InvalidArgumentException('invalid params: ' . gettype($parsedBody));
        }
        $newInstance = clone $this;
        $newInstance->parsedBody = $parsedBody;
        return $newInstance;
    }

    /**
     * リクエストの属性情報を取得する.
     *
     * @return array Attributes derived from the request.
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * リクエストの属性値を取得する.
     *
     * @param string $name 属性名
     * @param mixed $default デフォルト値
     * @return mixed 属性値
     * @see getAttributes()
     */
    public function getAttribute($name, $default = null)
    {
        if (isset($this->attributes[$name])) {
            return $this->attributes[$name];
        } else {
            return $default;
        }
    }

    /**
     * リクエストの属性情報を設定した新しいインスタンスを返す.
     *
     * @param string $name 属性名
     * @param mixed $value 属性値
     * @return static 属性情報を設定した新しいインスタンス
     * @see getAttributes()
     */
    public function withAttribute($name, $value)
    {
        $newInstance = clone $this;
        $newInstance->attributes[$name] = $value;
        return $newInstance;
    }

    /**
     * リクエストの属性情報を削除した新しいインスタンスを返す.
     *
     * @param string $name 属性名
     * @return static 属性情報から属性名を削除した新しいインスタンス
     * @see getAttributes()
     */
    public function withoutAttribute($name)
    {
        $newInstance = clone $this;
        if (isset($newInstance->attributes[$name])) {
            unset($newInstance->attributes[$name]);
        }
        return $newInstance;
    }

    /**
     * @return static instance from $_SERVER, $_COOKIE, $_POST, $_GET, $_FILES
     */
    public static function fromEnvironment()
    {
        $serverRequest = new static();

        # Message protocolVersion
        if (isset($_SERVER['SERVER_PROTOCOL'])) {
            if (preg_match('#^HTTP/([0-9\.]+)#u', $_SERVER['SERVER_PROTOCOL'], $matches)) {
                $serverRequest->protocolVersion = strval($matches[1]);
            }
        }

        # Message headers
        $headers = new Headers();
        foreach ($_SERVER as $rawHeaderName => $headerValue) {
            if (($pos = strpos($rawHeaderName, 'HTTP_')) === 0) {
                $headerName = strtr(substr($rawHeaderName, ($pos + 5)), '_', '-');
                $headers->set($headerName, $headerValue);
            }
        }
        if (isset($_SERVER['CONTENT_TYPE'])) {
            $headers->set('Content-Type', $_SERVER['CONTENT_TYPE']);
        }
        if (isset($_SERVER['CONTENT_LENGTH'])) {
            $headers->set('Content-Length', $_SERVER['CONTENT_LENGTH']);
        }
        $serverRequest->headers = $headers;

        # Message body
        # this library required (PHP >= 5.6). php://input is re-useful.
        $serverRequest->body = Stream::fromFilePath('php://input', 'rb');

        # Request method
        if (isset($_SERVER['REQUEST_METHOD'])) {
            $serverRequest->method = $_SERVER['REQUEST_METHOD'];
        }

        # Request uri
        if (isset($_SERVER['REQUEST_URI'])) {
            $url = '';
            if (isset($_SERVER['SERVER_NAME'])) {
                $url .= (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] !== 'off')) ? 'https' : 'http';
                $url .= '://' . $_SERVER['SERVER_NAME'];
            }
            $url .= strval($_SERVER['REQUEST_URI']);
            $serverRequest->uri = new Uri($url);
        }<commit_msg>HTTP Message : improve ServerRequest<commit_after><?php

namespace Maruamyu\Core\Http\Message;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UploadedFileInterface;

/**
 * Webアプリから利用するリクエストコンテキストデータ
 */
class ServerRequest extends Request implements ServerRequestInterface
{
    /**
     * @var array
     */
    protected $serverParams;

    /**
     * @var array
     */
    protected $cookieParams;

    /**
     * @var array
     */
    protected $queryParams;

    /**
     * @var array
     */
    protected $parsedBody;

    /**
     * @var UploadedFileInterface[]
     */
    protected $uploadedFiles;

    /**
     * @var array
     */
    protected $attributes;

    /**
     * サーバーのパラメータを返す.
     *
     * @return array $_SERVER
     */
    public function getServerParams()
    {
        return $this->serverParams;
    }

    /**
     * Cookieを返す.
     *
     * @return array $_COOKIE
     */
    public function getCookieParams()
    {
        return $this->cookieParams;
    }

    /**
     * 指定されたCookieデータを設定した新しいインスタンスを返す.
     *
     * @param array $cookieParams パラメータ
     * @return static パラメータを設定した新しいインスタンス
     */
    public function withCookieParams(array $cookieParams)
    {
        $newInstance = clone $this;
        $newInstance->cookieParams = $cookieParams;
        return $newInstance;
    }

    /**
     * QUERY_STRINGの内容をパースして返す.
     * ({parse_str()}を使ったPHP互換形式)
     *
     * @return array QUERY_STRINGの内容
     */
    public function getQueryParams()
    {
        return $this->queryParams;
    }

    /**
     * 指定されたQUERY_STRINGデータを設定した新しいインスタンスを返す.
     * ({parse_str()}を使ったPHP互換形式)
     *
     * @param array $queryParams パラメータ
     * @return static パラメータを設定した新しいインスタンス
     */
    public function withQueryParams(array $queryParams)
    {
        $newInstance = clone $this;
        $newInstance->queryParams = $queryParams;
        return $newInstance;
    }

    /**
     * アップロードされたファイルのリストを取得する.
     *
     * @return UploadedFileInterface[] アップロードファイルのリスト
     */
    public function getUploadedFiles()
    {
        return $this->uploadedFiles;
    }

    /**
     * アップロードされたファイルのリストを設定した新しいインスタンスを返す.
     *
     * @param UploadedFileInterface[] $uploadedFiles アップロードファイルのリスト
     * @return static パラメータを設定した新しいインスタンス
     * @throws \InvalidArgumentException 入力データが正しくないとき
     */
    public function withUploadedFiles(array $uploadedFiles)
    {
        $newInstance = clone $this;
        $newInstance->uploadedFiles = [];
        foreach ($uploadedFiles as $uploadedFile) {
            if (!($uploadedFile instanceof UploadedFileInterface)) {
                throw new \InvalidArgumentException('invalid uploaded files.');
            }
            $newInstance->uploadedFiles[] = clone $uploadedFile;
        }
        return $newInstance;
    }

    /**
     * POSTパラメータの内容をパースして返す.
     * ({parse_str()}または{json_decode()}を使ったPHP互換形式)
     *
     * @return null|array|object POSTパラメータの内容
     */
    public function getParsedBody()
    {
        return $this->parsedBody;
    }

    /**
     * POSTパラメータの内容を設定した新しいインスタンスを返す.
     * ({parse_str()}または{json_decode()}を使ったPHP互換形式)
     *
     * @param null|array|object $parsedBody POSTデータ
     * @return static POSTデータを設定した新しいインスタンス
     * @throws \InvalidArgumentException POSTデータが正しくないとき
     */
    public function withParsedBody($parsedBody)
    {
        if (!(is_null($parsedBody)) && !(is_array($parsedBody)) && !(is_object($parsedBody))) {
            throw new \InvalidArgumentException('invalid params: ' . gettype($parsedBody));
        }
        $newInstance = clone $this;
        $newInstance->parsedBody = $parsedBody;
        return $newInstance;
    }

    /**
     * リクエストの属性情報を取得する.
     *
     * @return array Attributes derived from the request.
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * リクエストの属性値を取得する.
     *
     * @param string $name 属性名
     * @param mixed $default デフォルト値
     * @return mixed 属性値
     * @see getAttributes()
     */
    public function getAttribute($name, $default = null)
    {
        if (isset($this->attributes[$name])) {
            return $this->attributes[$name];
        } else {
            return $default;
        }
    }

    /**
     * リクエストの属性情報を設定した新しいインスタンスを返す.
     *
     * @param string $name 属性名
     * @param mixed $value 属性値
     * @return static 属性情報を設定した新しいインスタンス
     * @see getAttributes()
     */
    public function withAttribute($name, $value)
    {
        $newInstance = clone $this;
        $newInstance->attributes[$name] = $value;
        return $newInstance;
    }

    /**
     * リクエストの属性情報を削除した新しいインスタンスを返す.
     *
     * @param string $name 属性名
     * @return static 属性情報から属性名を削除した新しいインスタンス
     * @see getAttributes()
     */
    public function withoutAttribute($name)
    {
        $newInstance = clone $this;
        if (isset($newInstance->attributes[$name])) {
            unset($newInstance->attributes[$name]);
        }
        return $newInstance;
    }

    /**
     * @return static instance from $_SERVER, $_COOKIE, $_POST, $_GET, $_FILES
     */
    public static function fromEnvironment()
    {
        $serverRequest = new static();

        # Message protocolVersion
        if (isset($_SERVER['SERVER_PROTOCOL'])) {
            if (preg_match('#^HTTP/([0-9\.]+)#u', $_SERVER['SERVER_PROTOCOL'], $matches)) {
                $serverRequest->protocolVersion = strval($matches[1]);
            }
        }

        # Message headers
        $headers = new Headers();
        if (function_exists('apache_request_headers')) {
            $apacheRequestHeaders = apache_request_headers();
            if ($apacheRequestHeaders) {
                foreach ($apacheRequestHeaders as $headerName => $headerValue) {
                    $headers->set($headerName, $headerValue);
                }
            }
        }
        foreach ($_SERVER as $rawHeaderName => $headerValue) {
            if (strpos($rawHeaderName, 'HTTP_') === 0) {
                $headerName = strtr(substr($rawHeaderName, 5), '_', '-');
                $headers->set($headerName, $headerValue);
            }
        }
        if (isset($_SERVER['CONTENT_TYPE'])) {
            $headers->set('Content-Type', $_SERVER['CONTENT_TYPE']);
        }
        if (isset($_SERVER['CONTENT_LENGTH'])) {
            $headers->set('Content-Length', $_SERVER['CONTENT_LENGTH']);
        }
        $serverRequest->headers = $headers;

        # Message body
        # this library required (PHP >= 5.6). php://input is re-useful.
        $serverRequest->body = Stream::fromFilePath('php://input', 'rb');

        # Request method
        if (isset($_SERVER['REQUEST_METHOD'])) {
            $serverRequest->method = $_SERVER['REQUEST_METHOD'];
        }

        # Request uri
        if (isset($_SERVER['REQUEST_URI'])) {
            $url = '';
            if (isset($_SERVER['SERVER_NAME'])) {
                $protocol = 'http';
                if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
                    $protocol = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']);
                } elseif (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] !== 'off')) {
                    $protocol = 'https';
                }
                $url = $protocol . '://' . $_SERVER['SERVER_NAME'];
            }
            $url .= strval($_SERVER['REQUEST_URI']);
            $serverRequest->uri = new Uri($url);
        }
{'fraction_non_alphanumeric': 0.130668341007395, 'fraction_numerical': 0.0009766987581972932, 'mean_word_length': 2.13128003494976, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 57, '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': '7052196', 'n_tokens_mistral': 4912, 'n_tokens_neox': 4782, 'n_words': 767}