edde-framework/edde-framework

View on GitHub
src/Edde/Common/Http/Message.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php
    declare(strict_types=1);

    namespace Edde\Common\Http;

    use Edde\Api\Http\HttpMessageException;
    use Edde\Api\Http\IHeaderList;
    use Edde\Api\Http\IMessage;
    use Edde\Common\Config\ConfigurableTrait;
    use Edde\Common\Object;

    class Message extends Object implements IMessage {
        use ConfigurableTrait;
        /**
         * @var string
         */
        protected $message;
        /**
         * @var string
         */
        protected $headers;
        /**
         * @var IHeaderList
         */
        protected $headerList;
        /**
         * @var IMessage[]
         */
        protected $messageList = [];

        /**
         * Message constructor.
         *
         * @param string $message
         * @param string $headers
         */
        public function __construct(string $message, string $headers) {
            $this->message = $message;
            $this->headers = $headers;
        }

        /**
         * @inheritdoc
         */
        public function getHeaderList(): IHeaderList {
            return $this->headerList;
        }

        /**
         * @inheritdoc
         */
        public function getContentType(string $default = ''): string {
            return $this->headerList->getContentType()->getMime($default);
        }

        /**
         * @inheritdoc
         */
        public function getContentList(): array {
            return array_keys($this->messageList);
        }

        /**
         * @inheritdoc
         */
        public function getMessageList(): array {
            return $this->messageList;
        }

        /**
         * @inheritdoc
         * @throws HttpMessageException
         */
        public function getMessage(string $contentId): IMessage {
            if (isset($this->messageList[$contentId]) === false) {
                throw new HttpMessageException(sprintf('Requested unknown content id [%s] in http message.', $contentId));
            }
            return $this->messageList[$contentId];
        }

        /**
         * @inheritdoc
         */
        public function getBody(): string {
            return $this->message;
        }

        /**
         * @inheritdoc
         */
        public function getContentId() {
            return trim($this->headerList->get('Content-ID'), '<>');
        }

        /**
         * @inheritdoc
         */
        protected function handleInit() {
            parent::handleInit();
            $this->headerList = new HeaderList();
            $this->headerList->put(HttpUtils::headerList($this->headers, false));
            $contentType = $this->headerList->getContentType();
            if ($contentType->has('boundary')) {
                foreach (array_slice(explode('--' . $contentType->get('boundary'), $this->message), 1, -1) as $boundary) {
                    list($headers, $message) = explode("\r\n\r\n", $boundary);
                    $message = new self($message, $headers);
                    $message->setup();
                    if ($contentId = $message->getContentId()) {
                        $this->messageList[$contentId] = $message;
                    }
                }
            }
        }
    }