rack middleware

175
Rack Middleware

Upload: littlebigruby

Post on 15-Jan-2015

3.837 views

Category:

Documents


6 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Rack Middleware

RackMiddleware

Page 2: Rack Middleware

\m/

Page 3: Rack Middleware

NEED

Page 4: Rack Middleware

CHOICE

Page 5: Rack Middleware

Jon Crosby

http://joncrosby.me

Page 6: Rack Middleware

CloudKithttp://getcloudkit.com

Page 7: Rack Middleware

rack-contrib

http://github.com/rack/rack-contrib

Page 8: Rack Middleware
Page 9: Rack Middleware

Engine Yard Solo

“The platform foron-demand management of your

Ruby on Rails applicationin the cloud.”

Page 10: Rack Middleware

Free during HackFest

Page 11: Rack Middleware

Discount for Sign Up

Page 12: Rack Middleware

CGI

Page 13: Rack Middleware

app.cgi

Page 14: Rack Middleware

WARNING

Page 15: Rack Middleware

Contains Perl

Page 16: Rack Middleware

old skool perl cgi

Page 17: Rack Middleware

if ($cgi->param(‘action’) eq ‘all’) { my $sql = “select * from customer”; my $rows = $dbh->selectall_arrayref($sql); if (@$rows) { print “<table border=1>” . “<th>name</th>” ....

Page 18: Rack Middleware

if ($cgi->param(‘action’) eq ‘all’) { my $sql = “select * from customer”; my $rows = $dbh->selectall_arrayref($sql); if (@$rows) { print “<table border=1>” . “<th>name</th>” ....

Page 19: Rack Middleware

if ($cgi->param(‘action’) eq ‘all’) { my $sql = “select * from customer”; my $rows = $dbh->selectall_arrayref($sql); if (@$rows) { print “<table border=1>” . “<th>name</th>” ....

Page 20: Rack Middleware

if ($cgi->param(‘action’) eq ‘all’) { my $sql = “select * from customer”; my $rows = $dbh->selectall_arrayref($sql); if (@$rows) { print “<table border=1>” . “<th>name</th>” ....

Page 21: Rack Middleware

if ($cgi->param(‘action’) eq ‘all’) { my $sql = “select * from customer”; my $rows = $dbh->selectall_arrayref($sql); if (@$rows) { print “<table border=1>” . “<th>name</th>” ....

Page 22: Rack Middleware

if ($cgi->param(‘action’) eq ‘all’) { my $sql = “select * from customer”; my $rows = $dbh->selectall_arrayref($sql); if (@$rows) { print “<table border=1>” . “<th>name</th>” ....

Page 23: Rack Middleware

Monolith

Page 24: Rack Middleware

:-(

Page 25: Rack Middleware

Rails

Page 26: Rack Middleware

MerbSinatraMack

RamazeWaves

Page 27: Rack Middleware

Authentication

Page 28: Rack Middleware

Single Sign-On

Page 29: Rack Middleware

Caching

Page 30: Rack Middleware

Authentication Example:OpenID + OAuth

Page 31: Rack Middleware

Install Auth Plugin(s)

Page 32: Rack Middleware

Install Auth Plugin(s)Generate Controllers

Page 33: Rack Middleware

Install Auth Plugin(s)Generate ControllersGenerate Models

Page 34: Rack Middleware

Install Auth Plugin(s)Generate ControllersGenerate ModelsGenerate Migrations

Page 35: Rack Middleware

Install Auth Plugin(s)Generate ControllersGenerate ModelsGenerate MigrationsModify Existing Controllers

Page 36: Rack Middleware

Install Auth Plugin(s)Generate ControllersGenerate ModelsGenerate MigrationsModify Existing ControllersMonkey Patch Rails

Page 37: Rack Middleware

:-(

Page 38: Rack Middleware

The Web

Page 39: Rack Middleware
Page 40: Rack Middleware

HTTP

Page 41: Rack Middleware

HTTP

Intermediaries

Page 42: Rack Middleware

HTTP

Intermediaries App

Page 43: Rack Middleware

HTTP

Intermediaries App

Page 44: Rack Middleware

Rack

Page 45: Rack Middleware
Page 46: Rack Middleware

HTTP

Page 47: Rack Middleware

HTTP

Intermediaries

Page 48: Rack Middleware

HTTP

Middleware

Page 49: Rack Middleware

HTTP

Middleware App

Page 50: Rack Middleware

Rack is the Web

Page 51: Rack Middleware

The Web is Rack

Page 52: Rack Middleware

WSGI

Page 53: Rack Middleware

SPEC

Page 54: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 55: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 56: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 57: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 58: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 59: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 60: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 61: Rack Middleware

run lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 62: Rack Middleware

config.ru

Page 63: Rack Middleware

$ rackup config.ru

Page 64: Rack Middleware

$ curl http://localhost:9292

Page 65: Rack Middleware

Hello

Page 66: Rack Middleware

class App def call(env) [200, {...}, [...]] endend

Page 67: Rack Middleware

SPEC

Page 68: Rack Middleware

$ rake SPEC

Page 69: Rack Middleware

Rack::Lint

Page 70: Rack Middleware

lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ]}

Page 71: Rack Middleware

env

Page 72: Rack Middleware

REQUEST_METHOD

Page 73: Rack Middleware

env[‘REQUEST_METHOD’]

Page 74: Rack Middleware

GETPUTPOSTDELETEHEADOPTIONSTRACE

Page 75: Rack Middleware

PATH_INFO

Page 76: Rack Middleware

/items/123

Page 77: Rack Middleware

HTTP_*

Page 78: Rack Middleware

HTTP_ACCEPT

Page 79: Rack Middleware

application/json

Page 80: Rack Middleware

rack.*

Page 81: Rack Middleware

rack.input

(the input stream)

Page 82: Rack Middleware

#gets#each#read#rewind

Page 83: Rack Middleware

yournamespace.*

Page 84: Rack Middleware

request = Rack::Request.new(env)

Page 85: Rack Middleware

request.post?

Page 86: Rack Middleware

request.params[‘id’]

Page 87: Rack Middleware

request[‘HTTP_IF_MATCH’]

Page 88: Rack Middleware

\m/

Page 89: Rack Middleware

HTTP

Middleware App

Page 90: Rack Middleware

use MiddlewareAuse MiddlewareBuse MiddlewareCrun app

Page 91: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 92: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 93: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 94: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 95: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 96: Rack Middleware

rack-contrib

http://github.com/rack/rack-contrib

Page 97: Rack Middleware

Rack::Profiler

Page 98: Rack Middleware

Rack::MailExceptions

Page 99: Rack Middleware

Rack::JSONP

Page 100: Rack Middleware

Rack::CSSHTTPRequest

Page 101: Rack Middleware

Rack::Cache

http://github.com/rtomayko/rack-cache

Page 102: Rack Middleware

Rack::NotFound

Page 103: Rack Middleware

404

Page 104: Rack Middleware

HTTP

Middleware App

Page 105: Rack Middleware

use MiddlewareAuse MiddlewareBuse MiddlewareCrun app

Page 106: Rack Middleware

class App def call(env) [200, {...}, [...]] endend

Page 107: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 108: Rack Middleware

class GoSlower def initialize(app) @app = app end

def call(env) sleep(1) @app.call(env) endend

Page 109: Rack Middleware

use MiddlewareAuse MiddlewareBuse MiddlewareCrun app

Page 110: Rack Middleware

HTTP

Middleware App

Page 111: Rack Middleware

HTTP

Middleware App

Page 112: Rack Middleware

Cooperative Middleware

Page 113: Rack Middleware

URI Space

Page 114: Rack Middleware

/*

Page 115: Rack Middleware

/just-what-it-needs

Page 116: Rack Middleware

CloudKit

Page 117: Rack Middleware

Open WebJSON

Appliance

Page 118: Rack Middleware

expose :notes, :todos

Page 119: Rack Middleware

expose :notes, :todos

Page 120: Rack Middleware

contain :notes, :todos

Page 121: Rack Middleware

use Rack::Pool::Sessionuse CloudKit::OAuthFilteruse CloudKit::OpenIDFilteruse CloudKit::Service, :collections => [:notes, :todos](run DefaultApp)

Page 122: Rack Middleware

CloudKit::OAuthFilter

/oauth/*

Page 123: Rack Middleware

CloudKit::OpenIDFilter

/login/logout/openid_complete

Page 124: Rack Middleware

CloudKit::Service

/notes/*/todos/*

Page 125: Rack Middleware

?

Page 126: Rack Middleware

OAuth OpenID Service

Browser

Page 127: Rack Middleware

OAuth OpenID Service

Browser

Page 128: Rack Middleware

OAuth OpenID Service

Browser

{...}

Page 129: Rack Middleware

OAuth OpenID Service

Browser

Page 130: Rack Middleware

OAuth OpenID Service

Browser

Login

{...}

Page 131: Rack Middleware

OAuth OpenID Service

Browser

Page 132: Rack Middleware

OAuth OpenID Service

Browser

Page 133: Rack Middleware

OAuth OpenID Service

Browser

Page 134: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 135: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 136: Rack Middleware

OAuth OpenID Service

Service or Desktop App

{...}

Page 137: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 138: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Login

{...}

Page 139: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 140: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 141: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 142: Rack Middleware

OAuth OpenID Service

Service or Desktop App

Page 143: Rack Middleware

AnnouncingMiddlewarePresence

Page 144: Rack Middleware

HTTP

Via

Page 145: Rack Middleware

Via: 1.0 ricky, 1.1 ethel, 1.1 fred

Page 146: Rack Middleware

Via: 1.0 ricky, 1.1 ethel, 1.1 fred

Page 147: Rack Middleware

Via: 1.0 ricky, 1.1 ethel, 1.1 fred

Page 148: Rack Middleware

Via: 1.0 ricky, 1.1 ethel, 1.1 fred

Page 149: Rack Middleware

env[‘cloudkit.auth’] = 1

Page 150: Rack Middleware

env[‘cloudkit.via’] << ‘cloudkit.filter.oauth’

Page 151: Rack Middleware

env[‘cloudkit.via’] << ‘cloudkit.filter.openid’

Page 152: Rack Middleware

env[‘cloudkit.user’] = ‘http://joncrosby.me’

Page 153: Rack Middleware

Alternative Stacks

Page 154: Rack Middleware

Rack::Map

Page 155: Rack Middleware

map “/” do run Blog::Publicend

map “/db” do run Blog::DBAdminend

Page 156: Rack Middleware

Rack::Map + Sinatra

Page 157: Rack Middleware

require ‘sinatra/base’

module Blog class Public < Sinatra::Base get ‘/’ do erb :index end endend

Page 158: Rack Middleware

require ‘sinatra/base’

module Blog class Public < Sinatra::Base get ‘/’ do erb :index end endend

Page 159: Rack Middleware

require ‘sinatra/base’

module Blog class Public < Sinatra::Base get ‘/’ do erb :index end endend

Page 160: Rack Middleware

require ‘sinatra’

for “apps”

/* URI space

Page 161: Rack Middleware

require ‘sinatra/base’

MyClass < Sinatra::Base

Minimal Sinatra (routing, rendering, etc.)

Page 162: Rack Middleware

\m/

Page 163: Rack Middleware

use MySinatraApprun SomeOtherApp

Page 164: Rack Middleware

Rack::Cascade

Page 165: Rack Middleware

app1 = lambda { ... }app2 = lambda { ... }run Rack::Cascade.new([app1, app2])

Page 166: Rack Middleware

Sinatra as Middlewarein Rails

Page 167: Rack Middleware

class X < Sinatra::Base get ‘/what’ do ‘what’ endend

Rails::Initializer.run do |config| config.use.middleware ‘X’end

Page 168: Rack Middleware

CloudKit in Rails

Page 169: Rack Middleware

Rails::Initializer.run do |config| config.use.middleware ‘CloudKit::Service’, :collections => [:notes, :todos]end

Page 170: Rack Middleware

HTTP

Middleware App

Page 171: Rack Middleware

HTTP

Middleware App

Rails

Page 172: Rack Middleware

HTTP

Middleware App

Rails Merb

Page 173: Rack Middleware

HTTP

Middleware App

Rails Merb *

Page 174: Rack Middleware

New Unit of Composition

Page 175: Rack Middleware

\m/