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