<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

declare(strict_types=1);

namespace Magento\Framework\HTTP\AsyncClient;

/**
 * Request to send.
 *
 * @api
 */
class Request
{
    public const METHOD_GET = 'GET';

    public const METHOD_POST = 'POST';

    public const METHOD_HEAD = 'HEAD';

    public const METHOD_PUT = 'PUT';

    public const METHOD_DELETE = 'DELETE';

    public const METHOD_CONNECT = 'CONNECT';

    public const METHOD_PATCH = 'PATCH';

    public const METHOD_OPTIONS = 'OPTIONS';

    public const METHOD_PROPFIND = 'PROPFIND';

    public const METHOD_TRACE = 'TRACE';

    /**
     * @var string
     */
    private $url;

    /**
     * @var string
     */
    private $method;

    /**
     * @var string[]
     */
    private $headers;

    /**
     * @var string|null
     */
    private $body;

    /**
     * @param string $url
     * @param string $method
     * @param string[] $headers
     * @param string $body
     */
    public function __construct(string $url, string $method, array $headers, ?string $body)
    {
        $this->url = $url;
        $this->method = $method;
        $this->headers = $headers;
        $this->body = $body;
    }

    /**
     * URL to send request to.
     *
     * @return string
     */
    public function getUrl(): string
    {
        return $this->url;
    }

    /**
     * HTTP method to use.
     *
     * @return string
     */
    public function getMethod(): string
    {
        return $this->method;
    }

    /**
     * Headers to send.
     *
     * Keys - header names, values - array of header values.
     *
     * @return string[][]
     */
    public function getHeaders(): array
    {
        return $this->headers;
    }

    /**
     * Body to send
     *
     * @return string|null
     */
    public function getBody(): ?string
    {
        return $this->body;
    }
}
