1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Bridges\HttpDI;
9:
10: use Nette;
11:
12:
13: 14: 15:
16: class HttpExtension extends Nette\DI\CompilerExtension
17: {
18: public $defaults = [
19: 'proxy' => [],
20: 'headers' => [
21: 'X-Powered-By' => 'Nette Framework',
22: 'Content-Type' => 'text/html; charset=utf-8',
23: ],
24: 'frames' => 'SAMEORIGIN',
25: ];
26:
27:
28: private $cliMode;
29:
30:
31: public function __construct($cliMode = FALSE)
32: {
33: $this->cliMode = $cliMode;
34: }
35:
36:
37: public function loadConfiguration()
38: {
39: $builder = $this->getContainerBuilder();
40: $config = $this->validateConfig($this->defaults);
41:
42: $builder->addDefinition($this->prefix('requestFactory'))
43: ->setClass(Nette\Http\RequestFactory::class)
44: ->addSetup('setProxy', [$config['proxy']]);
45:
46: $builder->addDefinition($this->prefix('request'))
47: ->setClass(Nette\Http\Request::class)
48: ->setFactory('@Nette\Http\RequestFactory::createHttpRequest');
49:
50: $builder->addDefinition($this->prefix('response'))
51: ->setClass(Nette\Http\Response::class);
52:
53: $builder->addDefinition($this->prefix('context'))
54: ->setClass(Nette\Http\Context::class)
55: ->addSetup('::trigger_error', ['Service http.context is deprecated.', E_USER_DEPRECATED]);
56:
57: if ($this->name === 'http') {
58: $builder->addAlias('nette.httpRequestFactory', $this->prefix('requestFactory'));
59: $builder->addAlias('nette.httpContext', $this->prefix('context'));
60: $builder->addAlias('httpRequest', $this->prefix('request'));
61: $builder->addAlias('httpResponse', $this->prefix('response'));
62: }
63: }
64:
65:
66: public function afterCompile(Nette\PhpGenerator\ClassType $class)
67: {
68: if ($this->cliMode) {
69: return;
70: }
71:
72: $initialize = $class->getMethod('initialize');
73: $config = $this->getConfig();
74:
75: if (isset($config['frames']) && $config['frames'] !== TRUE) {
76: $frames = $config['frames'];
77: if ($frames === FALSE) {
78: $frames = 'DENY';
79: } elseif (preg_match('#^https?:#', $frames)) {
80: $frames = "ALLOW-FROM $frames";
81: }
82: $initialize->addBody('header(?);', ["X-Frame-Options: $frames"]);
83: }
84:
85: foreach ($config['headers'] as $key => $value) {
86: if ($value != NULL) {
87: $initialize->addBody('header(?);', ["$key: $value"]);
88: }
89: }
90: }
91:
92: }
93: