JSONServiceProvider::sanitizeExceptionCode()   B
last analyzed

Complexity

Conditions 6
Paths 4

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 3 Features 0
Metric Value
c 5
b 3
f 0
dl 0
loc 16
rs 8.8571
cc 6
eloc 10
nc 4
nop 2
1
<?php
2
3
namespace ETNA\Silex\Provider\JSON;
4
5
use Silex\Application;
6
use Silex\ServiceProviderInterface;
7
use Symfony\Component\HttpFoundation\Request;
8
9
/**
10
 *
11
 */
12
class JSONServiceProvider implements ServiceProviderInterface
13
{
14
    private $app;
15
16
    public function boot(Application $app)
17
    {
18
    }
19
20
    public function register(Application $app)
21
    {
22
        $this->app = $app;
23
24
        $app->before([$this, "jsonInputHandler"]);
25
        $app->error([$this, "errorHandler"]);
26
    }
27
28
    /**
29
     * Gère le JSON dans le body d'une requête
30
     *
31
     * @param Request $request
32
     */
33
    public function jsonInputHandler(Request $request)
34
    {
35
        // on ne s'interese qu'aux requêtes de type "application/json"
36
        if (0 !== strpos($request->headers->get('Content-Type'), 'application/json')) {
37
            return;
38
        }
39
40
        $params = json_decode($request->getContent(), true);
41
        if (false === is_array($params)) {
42
            $this->app->abort(400, "Invalid JSON data");
43
        }
44
45
        // OUF, on peut enfin faire ce qu'on a à faire...
46
        $request->request->replace($params);
47
    }
48
49
    /**
50
     * Gère les erreurs et retourne un truc standardisé
51
     *
52
     * Le code d'erreur HTTP est gardé, mais pas forcément le message, et sera encapsuler dans une réponse JSON
53
     * Le message de l'exception n'est retourné que si ce n'est pas une erreur 500
54
     * ou que le `debug` est activé
55
     *
56
     * @param \Exception $exception
57
     * @param integer $code HTTP status code (100 <= $code <= 50x)
58
     * @return \Symfony\Component\HttpFoundation\JsonResponse
59
     */
60
    public function errorHandler(\Exception $exception, $code)
61
    {
62
        $code = $this->sanitizeExceptionCode($code, $exception);
63
64
        switch (true) {
65
            case 100 <= $code && $code < 500:
66
            case $this->app["debug"] === true:
67
                $message = $exception->getMessage();
68
                break;
69
70
            default:
71
                $message = null;
72
                break;
73
        }
74
75
        return $this->app->json($message, $code);
76
    }
77
78
    /**
79
     * @param integer $code
80
     * @param null|\Exception $exception
81
     * @return integer
82
     */
83
    private function sanitizeExceptionCode($code, \Exception $exception = null)
84
    {
85
        switch (true) {
86
            case $exception instanceof \InvalidArgumentException:
87
                return 400;
88
89
            case null !== $exception && !$exception instanceof \Symfony\Component\HttpKernel\Exception\HttpException:
90
                return $this->sanitizeExceptionCode($exception->getCode());
91
92
            case 100 <= $code && $code < 600:
93
                return $code;
94
95
            default:
96
                return 500;
97
        }
98
    }
99
}
100