Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
48 / 48
100.00% covered (success)
100.00%
8 / 8
CRAP
100.00% covered (success)
100.00%
1 / 1
RequestHandler
100.00% covered (success)
100.00%
48 / 48
100.00% covered (success)
100.00%
8 / 8
18
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 setRequest
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getRequest
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 request
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasRequest
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 prepare
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
4
 prepareMessage
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 log
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2/**
3 * Pop PHP Framework (https://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/popphp-framework
6 * @author     Nick Sagona, III <dev@noladev.com>
7 * @copyright  Copyright (c) 2009-2026 NOLA Interactive, LLC.
8 * @license    https://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Debug\Handler;
15
16use Pop\Http\Server\Request;
17use Pop\Http\Uri;
18use Pop\Log\Logger;
19use Pop\Session\Session;
20
21/**
22 * Debug request handler class
23 *
24 * @category   Pop
25 * @package    Pop\Debug
26 * @author     Nick Sagona, III <dev@noladev.com>
27 * @copyright  Copyright (c) 2009-2026 NOLA Interactive, LLC.
28 * @license    https://www.popphp.org/license     New BSD License
29 * @version    3.0.0
30 */
31class RequestHandler extends AbstractHandler
32{
33
34    /**
35     * Request
36     * @var ?Request
37     */
38    protected ?Request $request = null;
39
40    /**
41     * Constructor
42     *
43     * Instantiate a request handler object
44     *
45     * @param ?Request $request
46     * @param ?string  $name
47     */
48    public function __construct(?Request $request = null, ?string $name = null, ?Logger $logger = null, array $loggingParams = [])
49    {
50        parent::__construct($name, $logger, $loggingParams);
51        if ($request === null) {
52            $request = new Request(new Uri());
53        }
54        $this->setRequest($request);
55    }
56
57    /**
58     * Set request
59     *
60     * @param  Request $request
61     * @return RequestHandler
62     */
63    public function setRequest(Request $request): RequestHandler
64    {
65        $this->request = $request;
66        return $this;
67    }
68
69    /**
70     * Get request
71     *
72     * @return Request
73     */
74    public function getRequest(): Request
75    {
76        return $this->request;
77    }
78
79    /**
80     * Get request (alias)
81     *
82     * @return Request
83     */
84    public function request(): Request
85    {
86        return $this->request;
87    }
88
89    /**
90     * Has request
91     *
92     * @return bool
93     */
94    public function hasRequest(): bool
95    {
96        return ($this->request !== null);
97    }
98
99    /**
100     * Prepare handler data for storage
101     *
102     * @return array
103     */
104    public function prepare(): array
105    {
106        Session::getInstance();
107
108        if (!$this->hasEnd()) {
109            $this->setEnd();
110        }
111
112        $requestData = [
113            'uri'     => $this->request->getUri()->getUri(),
114            'method'  => $this->request->getMethod(),
115            'headers' => $this->request->getHeaders(),
116            'server'  => $this->request->getServer(),
117            'env'     => $this->request->getEnv(),
118            'get'     => $this->request->getQuery(),
119            'post'    => $this->request->getPost(),
120            'put'     => $this->request->getPut(),
121            'patch'   => $this->request->getPatch(),
122            'delete'  => $this->request->getDelete(),
123            'files'   => $this->request->getFiles(),
124            'cookie'  => (isset($_COOKIE)) ? $_COOKIE : [],
125            'session' => (isset($_SESSION)) ? $_SESSION : [],
126            'raw'     => $this->request->getRawData(),
127            'parsed'  => $this->request->getParsedData(),
128        ];
129
130        return $requestData;
131    }
132
133    /**
134     * Prepare handler message
135     *
136     * @param  ?array $context
137     * @return string
138     */
139    public function prepareMessage(?array $context = null): string
140    {
141        return (!empty($this->request)) ?
142            "The HTTP request '" .  $this->request->getUri()->getUri() . "' was received." :
143            "An HTTP request was received.";
144    }
145
146    /**
147     * Trigger handler logging
148     *
149     * @throws Exception
150     * @return void
151     */
152    public function log(): void
153    {
154        if (($this->hasLogger()) && ($this->hasLoggingParams())) {
155            $logLevel  = $this->loggingParams['level'] ?? null;
156            $timeLimit = $this->loggingParams['limit'] ?? null;
157
158            if ($logLevel !== null) {
159                $context = $this->prepare();
160                if ($timeLimit !== null) {
161                    $elapsedTime = $this->getElapsed();
162                    if ($elapsedTime >= $timeLimit) {
163                        $this->logger->log($logLevel, 'The request \'' . $this->request->getUri()->getUri() .
164                            '\' has exceeded the time limit of ' . $timeLimit . ' second(s) by ' .
165                            $elapsedTime - $timeLimit . ' second(s). The request was a total of ' . $elapsedTime . ' second(s).',
166                            $context
167                        );
168                    }
169                } else {
170                    $this->logger->log($logLevel, $this->prepareMessage(), $context);
171                }
172            } else {
173                throw new Exception('Error: The log level parameter was not set.');
174            }
175        }
176    }
177
178}