SlideShare a Scribd company logo
1 of 29
Download to read offline
Angelos github.com/dann dann
How to develop
Modern WAF
dann
techmemo@gmail.com
YAPC::Asia 2009 2009/09/10
Angelos github.com/dann dann
About Me
•Dann
•Creator of Angelos
•Yet Another WAF
•http://github.com/dann/
Angelos github.com/dann dann
Presentation Overview
•What is modern web application
framework?
•How to develop the minimal
elements of modern WAF
•How to develop the plugin
architecture of WAF
Angelos github.com/dann dann
What is modern WAF?
•Fullstack like Rails
•Pluggable like Plagger
•Server Abstraction like WSGI
•Separete WAF and App
Usability
Extendability
Testability
Angelos github.com/dann dann
How to develop
the basic elements
of WAF
Angelos github.com/dann dann
The basic elements
Component
ManagerDispatcher
Engine
recieve a request and return a
response
(Server Abstraction)
URL to Controller
resolver Load and search component
Angelos github.com/dann dann
Basic Sequence of WAF
②
①
③
④
⑤
⑥
Angelos github.com/dann dann
Engine - Angelos::Engine
sub build_engine {
my $self = shift;
my $request_handler = $self->request_handler;
$request_handler ||= $self->build_request_handler;
return Angelos::PSGI::Engine->new(
interface => {
module => $self->server,
....
},
psgi_handler => $request_handler,
);
} psgi handler which is passed to
the server gateay
the type of server
gateway
Angelos github.com/dann dann
Engine - Angelos::PSGI::Engine
use Mouse;
use Angelos::Types qw( ServerGateway );
 
has 'interface' => (
    is => 'ro',
    isa => ServerGateway,
    coerce => 1,
);
 
has 'psgi_handler' => ( is => 'rw', );
 
sub run {
    my $self = shift;
    $self->interface->run( $self->psgi_handler );
}
pass psgi handler to server
gateway
Create Server Gateway
Angelos github.com/dann dann
Create Server Gateway
package Angelos::PSGI::ServerGatewayBuilder;
use strict;
use warnings;
use Plack::Loader;
sub build {
my ( $class, $module, $args ) = @_;
my $server_gateway = Plack::Loader->load( $module,
%{$args} );
$server_gateway;
}
Create server gateway with
Plack::Loader
Angelos github.com/dann dann
psgi handler s code
...
sub {
my $env = shift;
my $req = Angelos::Request->new($env);
my $res = $self->handle_request($req);
my $psgi_res = $self->finalize_response($res);
return $psgi_res;
}
... return PSGI response
recieve PSGI env
and convert it to WAF Request
Angelos github.com/dann dann
Request Handler - Angelos::Engine::Base
sub handle_request {
my ( $self, $req ) = @_;
eval { $self->DISPATCH($req); };
if ( my $e = Exception::Class->caught() ) {
$self->HANDLE_EXCEPTION($e);
}
# return response
return $self->context->res;
}
②dispatch request to
Dispatcher
①recive a request
Angelos github.com/dann dann
Dispatching
sub DISPATCH {
my ( $self, $req ) = @_;
my $dispatch = $self->dispatcher->dispatch($req);
...
$dispatch->run;
# return response
$c->res;
}
② Dispatch a request do
dispatcher
Angelos github.com/dann dann
Angelos::Dispatcher
sub dispatch {
my ( $self, $request ) = @_;
my $match = $self->router->match($request);
my $dispatch = $self->dispatch_class->new( match =>
$match );
return $dispatch;
}
③ <URL to Controller>
search controller name
based on the request path
with HTTP::Router
④ Create dispatch
instance
Angelos github.com/dann dann
Angelos::Dispatcher::Dispatch
my $controller = $match->params->{controller};
my $controller_instance = $self-
>find_controller_instance(
{ context => $c,
controller => $controller,
}
);
...
$controller_instance->_dispatch_action( $action,
$params );
⑤ search a controller
instance from Component
Manager
⑥ execute Controller’s
action and return response.
Angelos github.com/dann dann
Routing
HTTP::Router->define(
sub {
$_->match('/')->to( { controller => 'Root', action
=> 'index' } );
$_->resources('Book');
}
);
conf/routes.pl- define routing information
Angelos github.com/dann dann
Routing Table
.----------------------------------------------+------------+------------+--------------.
| path | method | controller | action |
+---------------------------------------------+------------+------------+------------+
| / | | Root | index |
| /book.{format} | POST | Books | create |
| /book | POST | Books | create |
| /book.{format} | GET | Books | index |
| /book | GET | Books | index |
| /book/new.{format} | GET | Books | post |
| /book/new | GET | Books | post |
| /book/{book_id}.{format} | GET | Books | show |
| /book.{format} | POST | Books | create |
| /book | POST | Books | create |
| /book.{format} | GET | Books | index |
| /book.{bookk_id}.{format} | DELETE | Books | destroy |
| /book/{book_id} | DELETE | Books | destroy |
| /book/{book_id}.{format} | PUT | Books | update |
| /book/{book_id} | PUT | Books | update |
'-----------------------------------------------+------------+------------+-------------
Angelos github.com/dann dann
Finished developing basic
elements of WAF
•It’s really easy to develop basic
elements of WAF
•You can develop simple WAF
like Sinatra in 4 or 5 hours
Angelos github.com/dann dann
How to develop the plugin
architecture of WAF
Angelos github.com/dann dann
How to development the plugin
architecture of WAF
• What the plugin architecture of WAF
SHOULD be
• The type of Plugins
• How to develop plugin architecture of
WAF
• Example: the plugin of Angelos
Angelos github.com/dann dann
What the plugin architecture of WAF SHOULD
• the core elements of WAF should be as
small as possible and the all parts of WAF
should be extendable and pluggable
• The scope of plugin should be limeted
• Controller,View, Middleware, Request,
Response
• Extension point must be declaretive
Angelos github.com/dann dann
The types of Plugins
•Hook WAF’s Lifecycle
•Add methods to WAF’s class
Angelos github.com/dann dann
Plugin Implementation
• Hook WAF’s lifecycle
• Mouse’s Role + method modifier
• Class::Trigger
• MouseX::Object::Pluggable
• Add methods to WAF’s classes
• Mouse’s Role
• Exporter
• Multiple inheritance
Angelos github.com/dann dann
How to develop plugin in Angelos
• Make Plugin as Role
• User consume plugins in the WAF Component
• Hook WAF’s lifecycle with method modifier
• hook Component’s hook point
• Declare hook point method with CAPITAL
character
Angelos github.com/dann dann
Hook point example
sub _dispatch_action {
my ( $self, $action, $params ) = @_;
...
eval { $self->ACTION( $self->context, $action, $params ); };
...
}
Declare hook point with
Capital character
Angelos github.com/dann dann
the code of Plugin
before 'ACTION' => sub {
my ( $self, $c, $action, $params ) = @_;
$self->__action_start_time( time() );
};
after 'ACTION' => sub {
my ( $self, $c, $action, $params ) = @_;
$self->__action_end_time( time() );
my $elapsed = $self->__action_end_time - $self-
>__action_start_time;
my $message
= "action processing time:naction: $action ntime : $elapsed
secsn";
$self->log->info($message);
};
Angelos github.com/dann dann
What The WAF developer should do
• WAF developer should make default plugin sets
which user should use
• if there aren’t default plugins sets...
• How can I use Unicode in WAF?
• ... UseXXX,YYY...
• How can I inflate datetime? ...
Angelos github.com/dann dann
Conclusion
• The basic elements of WAF
• Engine, Dispatcher, Component Loader
• WAF’s plugin
• Hook WAF Lifecycle or add a Method to the
Component of WAF
• Plugin Scope must be limited
• the plugin and plugins default sets should be
provided by WAF developer
Angelos github.com/dann dann
Fin.
• It’s really easy to implement WAF now
• Let’s develop modern WAF with us ;)
• Repository
• http://github.com/dann/angelos/tree/master

More Related Content

What's hot

Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
diego_k
 
Silex: From nothing to an API
Silex: From nothing to an APISilex: From nothing to an API
Silex: From nothing to an API
chrisdkemper
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
Jeremy Kendall
 
Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)
Kris Wallsmith
 
ISUCONアプリを Pythonで書いてみた
ISUCONアプリを Pythonで書いてみたISUCONアプリを Pythonで書いてみた
ISUCONアプリを Pythonで書いてみた
memememomo
 

What's hot (20)

Developing apps using Perl
Developing apps using PerlDeveloping apps using Perl
Developing apps using Perl
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
Silex: From nothing to an API
Silex: From nothing to an APISilex: From nothing to an API
Silex: From nothing to an API
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojo
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
 
Complex Sites with Silex
Complex Sites with SilexComplex Sites with Silex
Complex Sites with Silex
 
Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)Introducing Assetic (NYPHP)
Introducing Assetic (NYPHP)
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Inside Bokete: Web Application with Mojolicious and others
Inside Bokete:  Web Application with Mojolicious and othersInside Bokete:  Web Application with Mojolicious and others
Inside Bokete: Web Application with Mojolicious and others
 
10 tips for making Bash a sane programming language
10 tips for making Bash a sane programming language10 tips for making Bash a sane programming language
10 tips for making Bash a sane programming language
 
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...Building Modern and Secure PHP Applications – Codementor Office Hours with Be...
Building Modern and Secure PHP Applications – Codementor Office Hours with Be...
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack Support
 
dotCloud and go
dotCloud and godotCloud and go
dotCloud and go
 
ISUCONアプリを Pythonで書いてみた
ISUCONアプリを Pythonで書いてみたISUCONアプリを Pythonで書いてみた
ISUCONアプリを Pythonで書いてみた
 
Asynchronous programming patterns in Perl
Asynchronous programming patterns in PerlAsynchronous programming patterns in Perl
Asynchronous programming patterns in Perl
 
Slim RedBeanPHP and Knockout
Slim RedBeanPHP and KnockoutSlim RedBeanPHP and Knockout
Slim RedBeanPHP and Knockout
 
RESTful web services
RESTful web servicesRESTful web services
RESTful web services
 
Mojo as a_client
Mojo as a_clientMojo as a_client
Mojo as a_client
 
Putting the Cat in the Catalogue: A Feline-Inspired OPAC Theme For Koha
Putting the Cat in the Catalogue: A Feline-Inspired OPAC Theme For KohaPutting the Cat in the Catalogue: A Feline-Inspired OPAC Theme For Koha
Putting the Cat in the Catalogue: A Feline-Inspired OPAC Theme For Koha
 

Viewers also liked

Web of knowledge advanced features
Web of knowledge advanced featuresWeb of knowledge advanced features
Web of knowledge advanced features
Lisa Hartman
 
WATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINS
WATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINSWATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINS
WATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINS
Glorynel Ojeda-Matos
 
Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...
Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...
Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...
CWS_2010
 

Viewers also liked (20)

I know how to search the internet,
I know how to search the internet,I know how to search the internet,
I know how to search the internet,
 
Calculate your Water Footprint at H2O Conserve
Calculate your Water Footprint at H2O ConserveCalculate your Water Footprint at H2O Conserve
Calculate your Water Footprint at H2O Conserve
 
The Modern Web, Part 1: Mobility
The Modern Web, Part 1: MobilityThe Modern Web, Part 1: Mobility
The Modern Web, Part 1: Mobility
 
How to search the Internet, a guide to save time and effort
How to search the Internet, a guide to save time and effortHow to search the Internet, a guide to save time and effort
How to search the Internet, a guide to save time and effort
 
Google webmaster guide for starters
Google webmaster guide for startersGoogle webmaster guide for starters
Google webmaster guide for starters
 
Windows 8 and the Cloud
Windows 8 and the CloudWindows 8 and the Cloud
Windows 8 and the Cloud
 
Web of knowledge advanced features
Web of knowledge advanced featuresWeb of knowledge advanced features
Web of knowledge advanced features
 
WATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINS
WATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINSWATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINS
WATER FOOTPRINT ACCOUNTING FOR CATCHMENTS AND RIVER BASINS
 
Internet Search Tips featuring Google
Internet Search Tips featuring GoogleInternet Search Tips featuring Google
Internet Search Tips featuring Google
 
Internet Search
Internet SearchInternet Search
Internet Search
 
The Modern Web Part 3: Social Networking
The Modern Web Part 3: Social NetworkingThe Modern Web Part 3: Social Networking
The Modern Web Part 3: Social Networking
 
Internet Search Tips (Google)
Internet Search Tips (Google)Internet Search Tips (Google)
Internet Search Tips (Google)
 
Debugging and Tuning Mobile Web Sites with Modern Web Browsers
Debugging and Tuning Mobile Web Sites with Modern Web BrowsersDebugging and Tuning Mobile Web Sites with Modern Web Browsers
Debugging and Tuning Mobile Web Sites with Modern Web Browsers
 
Bad websites
Bad websitesBad websites
Bad websites
 
Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...
Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...
Manuele Margni, CIRAIG - Behind the Water Footprint Stream: Metrics and Initi...
 
The Modern Web, Part 2: HTML5
The Modern Web, Part 2: HTML5The Modern Web, Part 2: HTML5
The Modern Web, Part 2: HTML5
 
Using the internet for search
Using the internet for searchUsing the internet for search
Using the internet for search
 
Affordable web design
Affordable web designAffordable web design
Affordable web design
 
When worlds Collide: HTML5 Meets the Cloud
When worlds Collide: HTML5 Meets the CloudWhen worlds Collide: HTML5 Meets the Cloud
When worlds Collide: HTML5 Meets the Cloud
 
The water footprint of humanity – the global dimension of water management
The water footprint of humanity – the global dimension of water managementThe water footprint of humanity – the global dimension of water management
The water footprint of humanity – the global dimension of water management
 

Similar to How to develop modern web application framework

Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Paulo Ragonha
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Yehuda Katz
 
20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev
Frank Rousseau
 
Curscatalyst
CurscatalystCurscatalyst
Curscatalyst
Kar Juan
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Tatsuhiko Miyagawa
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Atlassian
 
Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3
Clinton Dreisbach
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
tomcopeland
 

Similar to How to develop modern web application framework (20)

Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Laravel 101
Laravel 101Laravel 101
Laravel 101
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev
 
Curscatalyst
CurscatalystCurscatalyst
Curscatalyst
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Sprockets
SprocketsSprockets
Sprockets
 
Ling framework
Ling frameworkLing framework
Ling framework
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 
Using WordPress as your application stack
Using WordPress as your application stackUsing WordPress as your application stack
Using WordPress as your application stack
 
All I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkAll I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web Framework
 
Quality Use Of Plugin
Quality Use Of PluginQuality Use Of Plugin
Quality Use Of Plugin
 
Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605
 
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
 
Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3Migrating Legacy Rails Apps to Rails 3
Migrating Legacy Rails Apps to Rails 3
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fastHow Bitbucket Pipelines Loads Connect UI Assets Super-fast
How Bitbucket Pipelines Loads Connect UI Assets Super-fast
 

Recently uploaded

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 

Recently uploaded (20)

The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 

How to develop modern web application framework

  • 1. Angelos github.com/dann dann How to develop Modern WAF dann techmemo@gmail.com YAPC::Asia 2009 2009/09/10
  • 2. Angelos github.com/dann dann About Me •Dann •Creator of Angelos •Yet Another WAF •http://github.com/dann/
  • 3. Angelos github.com/dann dann Presentation Overview •What is modern web application framework? •How to develop the minimal elements of modern WAF •How to develop the plugin architecture of WAF
  • 4. Angelos github.com/dann dann What is modern WAF? •Fullstack like Rails •Pluggable like Plagger •Server Abstraction like WSGI •Separete WAF and App Usability Extendability Testability
  • 5. Angelos github.com/dann dann How to develop the basic elements of WAF
  • 6. Angelos github.com/dann dann The basic elements Component ManagerDispatcher Engine recieve a request and return a response (Server Abstraction) URL to Controller resolver Load and search component
  • 7. Angelos github.com/dann dann Basic Sequence of WAF ② ① ③ ④ ⑤ ⑥
  • 8. Angelos github.com/dann dann Engine - Angelos::Engine sub build_engine { my $self = shift; my $request_handler = $self->request_handler; $request_handler ||= $self->build_request_handler; return Angelos::PSGI::Engine->new( interface => { module => $self->server, .... }, psgi_handler => $request_handler, ); } psgi handler which is passed to the server gateay the type of server gateway
  • 9. Angelos github.com/dann dann Engine - Angelos::PSGI::Engine use Mouse; use Angelos::Types qw( ServerGateway );   has 'interface' => (     is => 'ro',     isa => ServerGateway,     coerce => 1, );   has 'psgi_handler' => ( is => 'rw', );   sub run {     my $self = shift;     $self->interface->run( $self->psgi_handler ); } pass psgi handler to server gateway Create Server Gateway
  • 10. Angelos github.com/dann dann Create Server Gateway package Angelos::PSGI::ServerGatewayBuilder; use strict; use warnings; use Plack::Loader; sub build { my ( $class, $module, $args ) = @_; my $server_gateway = Plack::Loader->load( $module, %{$args} ); $server_gateway; } Create server gateway with Plack::Loader
  • 11. Angelos github.com/dann dann psgi handler s code ... sub { my $env = shift; my $req = Angelos::Request->new($env); my $res = $self->handle_request($req); my $psgi_res = $self->finalize_response($res); return $psgi_res; } ... return PSGI response recieve PSGI env and convert it to WAF Request
  • 12. Angelos github.com/dann dann Request Handler - Angelos::Engine::Base sub handle_request { my ( $self, $req ) = @_; eval { $self->DISPATCH($req); }; if ( my $e = Exception::Class->caught() ) { $self->HANDLE_EXCEPTION($e); } # return response return $self->context->res; } ②dispatch request to Dispatcher ①recive a request
  • 13. Angelos github.com/dann dann Dispatching sub DISPATCH { my ( $self, $req ) = @_; my $dispatch = $self->dispatcher->dispatch($req); ... $dispatch->run; # return response $c->res; } ② Dispatch a request do dispatcher
  • 14. Angelos github.com/dann dann Angelos::Dispatcher sub dispatch { my ( $self, $request ) = @_; my $match = $self->router->match($request); my $dispatch = $self->dispatch_class->new( match => $match ); return $dispatch; } ③ <URL to Controller> search controller name based on the request path with HTTP::Router ④ Create dispatch instance
  • 15. Angelos github.com/dann dann Angelos::Dispatcher::Dispatch my $controller = $match->params->{controller}; my $controller_instance = $self- >find_controller_instance( { context => $c, controller => $controller, } ); ... $controller_instance->_dispatch_action( $action, $params ); ⑤ search a controller instance from Component Manager ⑥ execute Controller’s action and return response.
  • 16. Angelos github.com/dann dann Routing HTTP::Router->define( sub { $_->match('/')->to( { controller => 'Root', action => 'index' } ); $_->resources('Book'); } ); conf/routes.pl- define routing information
  • 17. Angelos github.com/dann dann Routing Table .----------------------------------------------+------------+------------+--------------. | path | method | controller | action | +---------------------------------------------+------------+------------+------------+ | / | | Root | index | | /book.{format} | POST | Books | create | | /book | POST | Books | create | | /book.{format} | GET | Books | index | | /book | GET | Books | index | | /book/new.{format} | GET | Books | post | | /book/new | GET | Books | post | | /book/{book_id}.{format} | GET | Books | show | | /book.{format} | POST | Books | create | | /book | POST | Books | create | | /book.{format} | GET | Books | index | | /book.{bookk_id}.{format} | DELETE | Books | destroy | | /book/{book_id} | DELETE | Books | destroy | | /book/{book_id}.{format} | PUT | Books | update | | /book/{book_id} | PUT | Books | update | '-----------------------------------------------+------------+------------+-------------
  • 18. Angelos github.com/dann dann Finished developing basic elements of WAF •It’s really easy to develop basic elements of WAF •You can develop simple WAF like Sinatra in 4 or 5 hours
  • 19. Angelos github.com/dann dann How to develop the plugin architecture of WAF
  • 20. Angelos github.com/dann dann How to development the plugin architecture of WAF • What the plugin architecture of WAF SHOULD be • The type of Plugins • How to develop plugin architecture of WAF • Example: the plugin of Angelos
  • 21. Angelos github.com/dann dann What the plugin architecture of WAF SHOULD • the core elements of WAF should be as small as possible and the all parts of WAF should be extendable and pluggable • The scope of plugin should be limeted • Controller,View, Middleware, Request, Response • Extension point must be declaretive
  • 22. Angelos github.com/dann dann The types of Plugins •Hook WAF’s Lifecycle •Add methods to WAF’s class
  • 23. Angelos github.com/dann dann Plugin Implementation • Hook WAF’s lifecycle • Mouse’s Role + method modifier • Class::Trigger • MouseX::Object::Pluggable • Add methods to WAF’s classes • Mouse’s Role • Exporter • Multiple inheritance
  • 24. Angelos github.com/dann dann How to develop plugin in Angelos • Make Plugin as Role • User consume plugins in the WAF Component • Hook WAF’s lifecycle with method modifier • hook Component’s hook point • Declare hook point method with CAPITAL character
  • 25. Angelos github.com/dann dann Hook point example sub _dispatch_action { my ( $self, $action, $params ) = @_; ... eval { $self->ACTION( $self->context, $action, $params ); }; ... } Declare hook point with Capital character
  • 26. Angelos github.com/dann dann the code of Plugin before 'ACTION' => sub { my ( $self, $c, $action, $params ) = @_; $self->__action_start_time( time() ); }; after 'ACTION' => sub { my ( $self, $c, $action, $params ) = @_; $self->__action_end_time( time() ); my $elapsed = $self->__action_end_time - $self- >__action_start_time; my $message = "action processing time:naction: $action ntime : $elapsed secsn"; $self->log->info($message); };
  • 27. Angelos github.com/dann dann What The WAF developer should do • WAF developer should make default plugin sets which user should use • if there aren’t default plugins sets... • How can I use Unicode in WAF? • ... UseXXX,YYY... • How can I inflate datetime? ...
  • 28. Angelos github.com/dann dann Conclusion • The basic elements of WAF • Engine, Dispatcher, Component Loader • WAF’s plugin • Hook WAF Lifecycle or add a Method to the Component of WAF • Plugin Scope must be limited • the plugin and plugins default sets should be provided by WAF developer
  • 29. Angelos github.com/dann dann Fin. • It’s really easy to implement WAF now • Let’s develop modern WAF with us ;) • Repository • http://github.com/dann/angelos/tree/master