Passed
Push — master ( bdfe16...bd3b7f )
by Andreas
10:59
created

subscriber::on_response()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 4.944

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 4
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 9
ccs 2
cts 5
cp 0.4
crap 4.944
rs 10
1
<?php
2
/**
3
 * @package midcom.routing
4
 * @author CONTENT CONTROL http://www.contentcontrol-berlin.de/
5
 * @copyright CONTENT CONTROL http://www.contentcontrol-berlin.de/
6
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License
7
 */
8
9
namespace midcom\httpkernel;
10
11
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
12
use midcom_response_styled;
13
use midcom_baseclasses_components_handler;
14
use Symfony\Component\HttpKernel\KernelEvents;
15
use midcom\routing\resolver;
16
use Symfony\Component\HttpFoundation\Request;
17
use midcom;
18
use midcom_connection;
19
use midcom_core_context;
20
use Symfony\Component\HttpKernel\Event\RequestEvent;
21
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
22
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
23
use Symfony\Component\HttpKernel\Event\ViewEvent;
24
use Symfony\Component\HttpKernel\Event\TerminateEvent;
25
use Symfony\Component\HttpKernel\Event\ControllerEvent;
26
use Symfony\Component\HttpFoundation\StreamedResponse;
27
use Symfony\Component\HttpKernel\Event\ResponseEvent;
28
29
/**
30
 * @package midcom.httpkernel
31
 */
32
class subscriber implements EventSubscriberInterface
33
{
34
    public static function getSubscribedEvents()
35
    {
36
        return [
37
            KernelEvents::REQUEST => ['on_request'],
38
            KernelEvents::CONTROLLER => ['on_controller'],
39
            KernelEvents::CONTROLLER_ARGUMENTS => ['on_arguments'],
40
            KernelEvents::VIEW => ['on_view'],
41
            KernelEvents::RESPONSE => ['on_response'],
42
            KernelEvents::EXCEPTION => ['on_exception'],
43
            KernelEvents::TERMINATE => ['on_terminate']
44
        ];
45
    }
46
47
    private function initialize(Request $request)
48
    {
49
        $midcom = midcom::get();
50
        $midcom->debug->log("Start of MidCOM run " . $request->server->get('REQUEST_URI', ''));
51
        $request->setSession($midcom->session);
52
        if ($response = $midcom->auth->check_for_login_session($request)) {
53
            return $response;
54
        }
55
56
        // Initialize Context Storage
57
        $context = midcom_core_context::enter(midcom_connection::get_url('uri'));
58
        $request->attributes->set('context', $context);
59
60
        // Initialize the UI message stack from session
61
        $midcom->uimessages->initialize($request);
62
63
        $midcom->dispatcher->addListener(KernelEvents::REQUEST, [$midcom->cache->content, 'on_request'], 10);
64
        $midcom->dispatcher->addListener(KernelEvents::RESPONSE, [$midcom->cache->content, 'on_response'], -10);
65
    }
66
67 350
    public function on_request(RequestEvent $event)
68
    {
69 350
        $request = $event->getRequest();
70 350
        if (   $event->isMainRequest()
71 350
            && $response = $this->initialize($request)) {
72
            $event->setResponse($response);
73
            return;
74
        }
75
76 350
        $resolver = new resolver($request);
77 350
        if ($resolver->process_midcom()) {
78
            return;
79
        }
80
81 350
        $resolver->process_component();
82 350
        $request->attributes->set('data', '__request_data__');
83
    }
84
85 350
    public function on_controller(ControllerEvent $event)
86
    {
87 350
        $request = $event->getRequest();
88 350
        $attributes = $request->attributes->all();
89 350
        if (!empty($attributes['__viewer'])) {
90 350
            $controller = $event->getController();
91 350
            $attributes['__viewer']->prepare_handler($controller[0], $attributes);
92 350
            unset($attributes['__viewer']);
93 350
            $request->attributes->set('handler_id', $attributes['_route']);
94 350
            $request->attributes->set('__handler', $controller);
95
        }
96
    }
97
98 350
    public function on_arguments(ControllerArgumentsEvent $event)
99
    {
100 350
        $arguments = $event->getArguments();
101 350
        $i = array_search('__request_data__', $arguments, true);
102 350
        if ($i !== false) {
103 219
            $context = $event->getRequest()->attributes->get('context');
104 219
            $arguments[$i] =& $context->get_custom_key('request_data');
105 219
            $event->setArguments($arguments);
106
        }
107
    }
108
109 59
    public function on_view(ViewEvent $event)
110
    {
111 59
        $attributes = $event->getRequest()->attributes;
112 59
        $controller = $attributes->get('__handler');
113 59
        if ($controller[0] instanceof midcom_baseclasses_components_handler) {
114 59
            $controller[0]->populate_breadcrumb_line();
115
        }
116 59
        $event->setResponse(new midcom_response_styled($attributes->get('context')));
117
    }
118
119 350
    public function on_response(ResponseEvent $event)
120
    {
121 350
        if ($event->isMainRequest()) {
122
            $response = $event->getResponse();
123
            if ($response instanceof StreamedResponse) {
124
                // if we have a streamed response, we need to send right away
125
                // otherwise exceptions in the callback won't be caught by the kernel
126
                // which means e.g. that a midcom-exec script couldn't show a login screen
127
                $response->send();
128
            }
129
        }
130
    }
131
132
    public function on_exception(ExceptionEvent $event)
133
    {
134
        $event->allowCustomResponseCode();
135
        $handler = new \midcom_exception_handler($event->getThrowable());
136
        $event->setResponse($handler->render());
137
    }
138
139
    public function on_terminate(TerminateEvent $event)
140
    {
141
        debug_add("End of MidCOM run: " . $event->getRequest()->server->get('REQUEST_URI'));
142
    }
143
}