Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
35 / 35
100.00% covered (success)
100.00%
8 / 8
CRAP
100.00% covered (success)
100.00%
1 / 1
TwigExtension
100.00% covered (success)
100.00%
35 / 35
100.00% covered (success)
100.00%
8 / 8
14
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getFunctions
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 dumpHttpLog
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
4
 parseBody
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 parseHeaders
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 formatRequest
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 formatResponse
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3/**
4 * @package   BO Slim
5 * @copyright BerlinOnline Stadtportal GmbH & Co. KG
6 **/
7
8namespace BO\Zmsclient;
9
10use BO\Mellon\Validator;
11use Psr\Container\ContainerInterface;
12
13/**
14  * Extension for Twig and Slim
15  *
16  *  @SuppressWarnings(PublicMethod)
17  *  @SuppressWarnings(TooManyMethods)
18  */
19class TwigExtension extends \Twig\Extension\AbstractExtension
20{
21    /**
22     * @var ContainerInterface
23     */
24    private $container;
25
26    public function __construct($container)
27    {
28        $this->container = $container;
29    }
30
31    public function getName()
32    {
33        return 'bozmsclientExtension';
34    }
35
36    public function getFunctions()
37    {
38        $safe = array('is_safe' => array('html'));
39        return array(
40            new \Twig\TwigFunction('dumpHttpLog', array($this, 'dumpHttpLog'), $safe),
41        );
42    }
43
44    public function dumpHttpLog()
45    {
46        $output = '<h2>HTTP API-Log</h2>'
47            . ' <p>For debugging: This log contains HTTP calls. <strong>DISABLE FOR PRODUCTION!</strong></p>';
48        foreach (Http::$log as $entry) {
49            if ($entry instanceof \Psr\Http\Message\RequestInterface) {
50                $entry = $this->formatRequest($entry);
51            } elseif ($entry instanceof \Psr\Http\Message\ResponseInterface) {
52                $entry = $this->formatResponse($entry);
53            }
54
55            $output .= \Tracy\Debugger::dump($entry, true);
56        }
57        return $output;
58    }
59
60    protected function parseBody($body, $allowEmpty = false)
61    {
62        $content = Validator::value((string)$body)->isJson();
63        if ($content->hasFailed() && !$allowEmpty) {
64            $output =
65                'API-Call failed, JSON parsing with error: ' . $content->getMessages()
66                    . ' - Snippet: ' . substr(\strip_tags((string)$body), 0, 2000) . '...'
67            ;
68        } else {
69            $output = $content->getValue();
70        }
71        return $output;
72    }
73
74    protected function parseHeaders(\Psr\Http\Message\MessageInterface $message)
75    {
76        $headers = [];
77        foreach ($message->getHeaders() as $name => $header) {
78            $headers[$name] = implode("|doubled|", $header);
79        }
80        return $headers;
81    }
82
83    protected function formatRequest(\Psr\Http\Message\RequestInterface $request)
84    {
85        $output = [];
86        $output['header'] = $this->parseHeaders($request);
87        $output['body'] = $this->parseBody($request->getBody(), true);
88        return $output;
89    }
90
91    protected function formatResponse(\Psr\Http\Message\ResponseInterface $response)
92    {
93        $output = [];
94        $output['header'] = $this->parseHeaders($response);
95        $output['body'] = $this->parseBody($response->getBody());
96        return $output;
97    }
98}