forked from minkphp/driver-testsuite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFixturesKernel.php
99 lines (76 loc) · 2.71 KB
/
FixturesKernel.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
namespace Behat\Mink\Tests\Driver\Util;
use Behat\Mink\Tests\Driver\TestCase;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class FixturesKernel implements HttpKernelInterface
{
public function handle(Request $request, $type = 1 /* self::MAIN_REQUEST */ , $catch = true): Response
{
$this->prepareSession($request);
$response = $this->handleFixtureRequest($request);
$this->saveSession($request, $response);
$response->prepare($request);
return $response;
}
private function handleFixtureRequest(Request $request): Response
{
$fixturesDir = realpath(TestCase::WEB_FIXTURES_DIR);
$overwriteDir = realpath(TestCase::KERNEL_FIXTURES_DIR);
require_once $fixturesDir . '/utils.php';
$file = $request->getPathInfo();
$path = file_exists($overwriteDir . $file) ? $overwriteDir . $file : $fixturesDir . $file;
/** @var Response|null $resp */
$resp = null;
ob_start();
require $path;
$content = ob_get_clean();
\assert($content !== false);
if ($resp instanceof Response) {
if ('' === $resp->getContent()) {
$resp->setContent($content);
}
return $resp;
}
return new Response($content);
}
private function prepareSession(Request $request): void
{
$session = new Session(new MockFileSessionStorage());
$request->setSession($session);
$cookies = $request->cookies;
$value = $cookies->get($session->getName());
if ($value !== null) {
$session->setId($value);
} else {
$session->migrate(false);
}
}
private function saveSession(Request $request, Response $response): void
{
if (!$request->hasSession()) {
return;
}
$session = $request->getSession();
if ($session->isStarted()) {
$session->save();
$params = session_get_cookie_params();
$cookie = Cookie::create(
$session->getName(),
$session->getId(),
0 === $params['lifetime']
? 0
: time() + $params['lifetime'],
$params['path'],
$params['domain'],
$params['secure'],
$params['httponly']
);
$response->headers->setCookie($cookie);
}
}
}