• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

valkyrjaio / valkyrja / 15659546660

15 Jun 2025 04:39AM UTC coverage: 47.202% (-0.4%) from 47.589%
15659546660

push

github

MelechMizrachi
Update Config.

5331 of 11294 relevant lines covered (47.2%)

16.11 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Valkyrja/Http/Routing/Middleware/RequestStructMiddleware.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the Valkyrja Framework package.
7
 *
8
 * (c) Melech Mizrachi <melechmizrachi@gmail.com>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13

14
namespace Valkyrja\Http\Routing\Middleware;
15

16
use Valkyrja\Http\Message\Enum\StatusCode;
17
use Valkyrja\Http\Message\Request\Contract\ServerRequest;
18
use Valkyrja\Http\Message\Response\Contract\Response;
19
use Valkyrja\Http\Message\Response\Response as HttpResponse;
20
use Valkyrja\Http\Middleware\Contract\RouteMatchedMiddleware;
21
use Valkyrja\Http\Middleware\Handler\Contract\RouteMatchedHandler;
22
use Valkyrja\Http\Routing\Model\Contract\Route;
23
use Valkyrja\Http\Struct\Request\Contract\RequestStruct;
24
use Valkyrja\Validation\Contract\Validate;
25

26
use function assert;
27
use function is_a;
28

29
/**
30
 * Class RequestStructMiddleware.
31
 *
32
 * @author Melech Mizrachi
33
 */
34
class RequestStructMiddleware implements RouteMatchedMiddleware
35
{
36
    /**
37
     * @inheritDoc
38
     */
39
    public function routeMatched(ServerRequest $request, Route $route, RouteMatchedHandler $handler): Route|Response
40
    {
41
        $message = $route->getRequestStruct();
×
42

43
        if ($message !== null) {
×
44
            $this->ensureIsStruct($message);
×
45

46
            $response = $this->ensureRequestConformsToMessage($request, $route, $message);
×
47
        }
48

49
        /**
50
         * @psalm-suppress MixedReturnStatement No clue what Psalm is confused about here. $response is either a Response or null, and routeMatched() returns a
51
         * Route or Response
52
         */
53
        return $response
×
54
            ?? $handler->routeMatched($request, $route);
×
55
    }
56

57
    /**
58
     * Ensure a message is a message.
59
     *
60
     * @param string $message The message
61
     *
62
     * @return void
63
     */
64
    protected function ensureIsStruct(string $message): void
65
    {
66
        assert($this->determineIsStruct($message));
×
67
    }
68

69
    /**
70
     * Determine if a dependency is a message.
71
     *
72
     * @param string $struct The message
73
     *
74
     * @return bool
75
     */
76
    protected function determineIsStruct(string $struct): bool
77
    {
78
        return is_a($struct, RequestStruct::class, true);
×
79
    }
80

81
    /**
82
     * @param ServerRequest               $request      The request
83
     * @param Route                       $matchedRoute The matched route
84
     * @param class-string<RequestStruct> $struct       The message class name
85
     *
86
     * @return Response|null
87
     */
88
    protected function ensureRequestConformsToMessage(ServerRequest $request, Route $matchedRoute, string $struct): Response|null
89
    {
90
        return $this->ensureRequestHasNoExtraData($request, $matchedRoute, $struct)
×
91
            ?? $this->ensureRequestIsValid($request, $matchedRoute, $struct)
×
92
            ?? null;
×
93
    }
94

95
    /**
96
     * @param ServerRequest               $request      The request
97
     * @param Route                       $matchedRoute The matched route
98
     * @param class-string<RequestStruct> $struct       The message class name
99
     *
100
     * @return Response|null
101
     */
102
    protected function ensureRequestHasNoExtraData(ServerRequest $request, Route $matchedRoute, string $struct): Response|null
103
    {
104
        // If there is extra data
105
        if ($struct::determineIfRequestContainsExtraData($request)) {
×
106
            // Then the payload is too large
107
            return $this->getExtraDataErrorResponse($request, $matchedRoute, $struct);
×
108
        }
109

110
        return null;
×
111
    }
112

113
    /**
114
     * @param ServerRequest               $request      The request
115
     * @param Route                       $matchedRoute The matched route
116
     * @param class-string<RequestStruct> $struct       The message class name
117
     *
118
     * @return Response
119
     */
120
    protected function getExtraDataErrorResponse(ServerRequest $request, Route $matchedRoute, string $struct): Response
121
    {
122
        return new HttpResponse(
×
123
            statusCode: StatusCode::PAYLOAD_TOO_LARGE,
×
124
        );
×
125
    }
126

127
    /**
128
     * @param ServerRequest               $request      The request
129
     * @param Route                       $matchedRoute The matched route
130
     * @param class-string<RequestStruct> $struct       The message class name
131
     *
132
     * @return Response|null
133
     */
134
    protected function ensureRequestIsValid(ServerRequest $request, Route $matchedRoute, string $struct): Response|null
135
    {
136
        $validate = $struct::validate($request);
×
137

138
        if (! $validate->rules()) {
×
139
            return $this->getValidationErrorsResponse($request, $matchedRoute, $validate, $struct);
×
140
        }
141

142
        return null;
×
143
    }
144

145
    /**
146
     * @param ServerRequest               $request      The request
147
     * @param Route                       $matchedRoute The matched route
148
     * @param Validate                    $validate     The validation object
149
     * @param class-string<RequestStruct> $struct       The message class name
150
     *
151
     * @return Response
152
     */
153
    protected function getValidationErrorsResponse(ServerRequest $request, Route $matchedRoute, Validate $validate, string $struct): Response
154
    {
155
        return new HttpResponse(
×
156
            statusCode: StatusCode::BAD_REQUEST,
×
157
        );
×
158
    }
159
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc