Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
The HttpKernelInterface is a lie (confoo)
Search
Igor Wiedler
February 27, 2014
Programming
390
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
The HttpKernelInterface is a lie (confoo)
Igor Wiedler
February 27, 2014
More Decks by Igor Wiedler
See All by Igor Wiedler
Redis Bedtime Stories
igorw
1
380
Wide Event Analytics (LISA19)
igorw
4
960
a day in the life of a request
igorw
0
180
production: an owner's manual
igorw
0
200
The Power of 2
igorw
0
360
LISP 1.5 Programmer's Manual: A Dramatic Reading
igorw
0
500
The Moral Character of Software
igorw
1
330
interdisciplinary computing (domcode)
igorw
0
330
miniKanren (clojure berlin)
igorw
1
340
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
510
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
110
Domain-Driven Transformation
hschwentner
2
2.3k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
570
The Rails Doctrine Decade
koic
2
540
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
350
R8 の設定見直しでアプリサイズ削減
andpad
0
190
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
510
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
360
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
140
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
160
SREの越境 / SRE Collaboration
y0hgi
2
300
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
860
Writing Fast Ruby
sferik
630
63k
Code Reviewing Like a Champion
maltzj
529
40k
4 Signs Your Business is Dying
shpigford
187
23k
Color Theory Basics | Prateek | Gurzu
gurzu
1
480
The Invisible Side of Design
smashingmag
301
52k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Into the Great Unknown - MozCon
thekraken
41
2.8k
The Curse of the Amulet
leimatthew05
3
15k
How to make the Groovebox
asonas
2
2.5k
Between Models and Reality
mayunak
4
490
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Transcript
the HttpKernelInterface is a lie
@igorwhiletrue
None
None
“Interface” Protocol Communication Message passing
Simon Child, from The Noun Project
Paulo Sá Ferreira - Purple Matter, from The Noun Project
hi!
None
10010101110100100
1001010111010010000110101 Massimiliano Mauro, from The Noun Project
Sergey Shmidt, from The Noun Project aloha!
yay!
00101000011101100102
None
None
None
None
Universal Interface
None
10010111001010001011
1234 4321
foo bar baz foo baz Patrick n Hawaii, from The
Noun Project
foo moo Anuar Zhumaev, from The Noun Project
find src -name '*.php' | grep -iv tests | cut
-f2- -d/ | cut -f1 -d\. | awk '{ print length, $0 }' | sort -n | tr / \\ ;
Tim Boelaars, from The Noun Project
None
nc
/\_/\ / 0 0 \ ====v==== \ W / |
| _ / ___ \ / / / \ \ | (((-----)))-' / ( ___ \__.=|___E /
None
data Dmitry Baranovskiy, from The Noun Project
xinetd
None
/etc/xinet.d/<service> service <service> { disable = no socket_type = stream
protocol = tcp user = <user> wait = no server = /usr/local/bin/<program> }
/etc/xinet.d/fortune service fortune { disable = no socket_type = stream
protocol = tcp user = xinetd wait = no server = /usr/local/bin/my- fortune.sh }
#!/bin/bash # my-fortune.sh fortune | cowsay
$ nc <host> 7777
$ nc <host> 7777 ______________________________________ < Eat right, stay fit,
and die anyway. > -------------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
/etc/xinet.d/cowsay service cowsay { disable = no socket_type = stream
protocol = tcp user = xinetd wait = no server = /usr/games/cowsay }
$ echo 'moo' | nc <host> 7778
$ echo 'moo' | nc <host> 7778 _____ < moo
> ----- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
#!/usr/bin/php <?php ! while (!feof(STDIN)) { echo transform(fgets(STDIN)); }
cgi
The Common Gateway Interface (CGI) [22]! allows an HTTP [1],
[4] server and a CGI! script to share responsibility for responding! to client requests. RFC 3875
xinetd tcp http httpd
http httpd script cgi
script env vars data headers data
GET / HTTP/1.1 Host: igor.io Accept: */* REQUEST_METHOD = GET
PATH_INFO = / HTTP_HOST = igor.io HTTP_ACCEPT = */* SERVER_NAME = igor.io
Content-Type: text/html ! <!DOCTYPE html> <html> ... </html>
fcgi
script
sockets are the new pipes
• 1991: HTTP • 1993: CGI • 1995: PHP •
1996: FastCGI
• 1997: Java Servlet • 2003: Python WSGI • 2007:
Ruby Rack • 2009: Perl PSGI • 2011: Symfony2 HttpKernelInterface
rack
class HelloWorld def call(env) [ 200, {"Content-Type" => "text/plain"}, ["Hello
world!"] ] end end
sapi
$_SERVER header echo exit
HttpKernelInterface
interface HttpKernelInterface! {! /*** @return Response */! public function handle(Request
$request);! }
sapi kernel
None
“legacy” apps: it’s all great until exit;
myths: !
myths: caching
myths: caching (use varnish)
myths: caching (use varnish) functional tests
CgiHttpKernel adapter from kernel to cgi functional test “legacy” apps
kernel CGI
kernel CGI anything!
$kernel = new CgiHttpKernel(__DIR__.'/app'); ! $request = Request::create('/index.php'); $response =
$kernel->handle($request); ! var_dump($response->getContent());
use Symfony\Component\HttpKernel\Client; ! $client = new Client($kernel); ! $crawler =
$client->request('GET', '/index.php');
caution: it’s slow (WIP: FcgiHttpKernel)
Where is the value?
REQ REP
fcgi roles
authorizer httpd responder filter
rack middlewares
HttpKernel middlewares
$app = new CallableHttpKernel(function ($request) { return new Response('Hello World!');
});
class Logger implements HttpKernelInterface { private $app; private $logger; !
public function __construct(HttpKernelInterface $app, LoggerInterface $logger) { $this->app = $app; $this->logger = $logger; } ! public function handle(Request $request, ...) { $response = $this->app->handle($request, $type, $catch); ! $this->log($request, $response); ! return $response; } ! private function log(Request $request, Response $response) { ... } }
$app = new Logger( $app, new Monolog\Logger() );
use Symfony\Component\HttpKernel\HttpCache\HttpCache; use Symfony\Component\HttpKernel\HttpCache\Store; $app = new HttpCache( $app, new
Store(__DIR__.'/cache') );
use Symfony\Component\HttpKernel\HttpCache\HttpCache; use Symfony\Component\HttpKernel\HttpCache\Store; $app = new HttpCache( $app, new
Store(__DIR__.'/cache') ); use varnish!
None
None
do something before or after every request
different take on event listeners
class Foo implements HttpKernelInterface { private $app; ! public function
__construct(HttpKernelInterface $app) { $this->app = $app; } ! public function handle(Request $request, ...) { $response = $this->app->handle($request, $type, $catch); ! return $response; } } 1 2 3
UrlMap $blog = new Silex\Application(); ! $blog->get('/', function () {
return 'This is the blog!'; }); ! $app = new Stack\UrlMap($app, [ '/blog' => $blog, ]);
Session $app = new CallableHttpKernel(function ($request) { $session = $request->getSession();
... }); ! $app = new Stack\Session($app);
OAuth $app = new Igorw\Stack\OAuth($app, [ 'key' => 'foo', 'secret'
=> 'bar', 'callback_url' => 'http://localhost:8080/auth/verify', 'success_url' => '/', 'failure_url' => '/auth', ]); ! $app = new Stack\Session($app);
OAuth $request->attributes->get('oauth.token');
Composition!
$stack = (new Stack\Builder()) ->push('Stack\Session') ->push('Igorw\Stack\OAuth', [...]) ->push('Foo'); ! $app
= $stack->resolve($app);
• GeoIp • IpRestrict • Backstage • Basic Authentication •
Hawk • CORS Community
It doesn’t stop there
• Authentication • Debug toolbar • Injected routes • Signed
cookies • Asset management • Force SSL • Error handling
( )
Choose wisely
Michael Rowe, from The Noun Project
• stackphp.com • @stackphp • @igorwhiletrue • github.com/igorw/CgiHttpKernel