Passed
Pull Request — master (#5629)
by Angel Fernando Quiroz
08:49
created

AlternateRequestSyntaxListener::onKernelRequest()   B

Complexity

Conditions 9
Paths 11

Size

Total Lines 49
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 9
eloc 29
c 1
b 0
f 0
nc 11
nop 1
dl 0
loc 49
rs 8.0555
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the xAPI package.
7
 *
8
 * (c) Christian Flothmann <[email protected]>
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 XApi\LrsBundle\EventListener;
15
16
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
17
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
18
19
/**
20
 * @author Jérôme Parmentier <[email protected]>
21
 */
22
class AlternateRequestSyntaxListener
23
{
24
    public function onKernelRequest(GetResponseEvent $event): void
25
    {
26
        if (!$event->isMasterRequest()) {
27
            return;
28
        }
29
30
        $request = $event->getRequest();
31
32
        if (!$request->attributes->has('xapi_lrs.route')) {
33
            return;
34
        }
35
36
        if ('POST' !== $request->getMethod()) {
37
            return;
38
        }
39
40
        if (null === $method = $request->query->get('method')) {
41
            return;
42
        }
43
44
        if ($request->query->count() > 1) {
45
            throw new BadRequestHttpException('Including other query parameters than "method" is not allowed. You have to send them as POST parameters inside the request body.');
46
        }
47
48
        $request->setMethod($method);
49
        $request->query->remove('method');
50
51
        if (null !== $content = $request->request->get('content')) {
52
            $request->request->remove('content');
53
54
            $request->initialize(
55
                $request->query->all(),
56
                $request->request->all(),
57
                $request->attributes->all(),
58
                $request->cookies->all(),
59
                $request->files->all(),
60
                $request->server->all(),
61
                $content
62
            );
63
        }
64
65
        foreach ($request->request as $key => $value) {
66
            if (\in_array($key, ['Authorization', 'X-Experience-API-Version', 'Content-Type', 'Content-Length', 'If-Match', 'If-None-Match'], true)) {
67
                $request->headers->set($key, $value);
68
            } else {
69
                $request->query->set($key, $value);
70
            }
71
72
            $request->request->remove($key);
73
        }
74
    }
75
}
76