Slide 1

Slide 1 text

ͪΐͬͱΘ͔Δ

Slide 2

Slide 2 text

Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App

Slide 3

Slide 3 text

Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD

Slide 4

Slide 4 text

Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD ͜ͷ*'ɺͲ͏͢Δʁ

Slide 5

Slide 5 text

Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD ڞ௨*'3BDL 3BDL"QQMJDBUJPO

Slide 6

Slide 6 text

call(env)

Slide 7

Slide 7 text

def call(env) ... end 3FRVFTUΛ౉͞ΕΔ 3FTQPOTFΛฦ͢ [status, headers, response_body]

Slide 8

Slide 8 text

ৄࡉ͸41&$Ͱ http://rack.rubyforge.org/doc/SPEC.html

Slide 9

Slide 9 text

4JOBUSBͷ৔߹

Slide 10

Slide 10 text

# Rack call interface. def call(env) dup.call!(env) end attr_accessor :env, :request, :response, :params def call!(env) # :nodoc: @env = env @request = Request.new(env) @response = Response.new @params = indifferent_params(@request.params) template_cache.clear if settings.reload_templates force_encoding(@params) @response['Content-Type'] = nil invoke { dispatch! } invoke { error_block!(response.status) } unless @response['Content-Type'] if Array === body and body[0].respond_to? :content_type content_type body[0].content_type else content_type :html end end @response.finish end

Slide 11

Slide 11 text

SBDLVQ

Slide 12

Slide 12 text

rackup config.ru ΞϓϦͷೖΓޱΛఆٛ Rack::Builder.new { }.to_app ʹ౉͢

Slide 13

Slide 13 text

#config.ru require ‘rack’ require ‘myapp’ run MyApp.new 3BDL"QQMJDBUJPO JFJNQMFNFOUTcall(env)

Slide 14

Slide 14 text

# Minimum config.ru require ‘rack’ run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"] ] } TUBUVT IFBEFST CPEZ

Slide 15

Slide 15 text

3BDL.JEEMFXBSF

Slide 16

Slide 16 text

Web Server App Server IUUQ DBMMSVCZ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD 3BDL*' 3BDL"QQMJDBUJPO Middleware Middleware 3BDL*' 3BDL*' .JEEMFXBSFΛૠೖ ^

Slide 17

Slide 17 text

w $43' w 3FEJSFDUJPO w -PHHJOH w 4FTTJPO.BOBHFNFOU w "VUIFOUJDBUJPO w &NCFE(PPHMF"OBMZUJDT FUD

Slide 18

Slide 18 text

class Middleware def initialize(app) @app = app end def call(env) # do something response = @app.call(env) # do something end end ࣍ʹݺͿ"QQ.JEEMFXBSF 3FRVFTUΛ͍͡Δ 3FTQPOTFΛ͍͡Δ

Slide 19

Slide 19 text

&YBNQMFSBDL@DTSG

Slide 20

Slide 20 text

def call(env) unless env['rack.session'] raise SessionUnavailable.new('Rack::Csrf depends on session middleware') end self.class.token(env) req = Rack::Request.new(env) untouchable = skip_checking(req) || !@http_methods.include?(req.request_method) || req.params[self.class.field] == env['rack.session'][self.class.key] || req.env[self.class.rackified_header] == env['rack.session'][self.class.key] if untouchable @app.call(env) else raise InvalidCsrfToken if @raisable [403, {'Content-Type' => 'text/html', 'Content-Length' => '0'}, []] end end $43'νΣοΫࣦഊͨ͠Βɺ ͙͢ʹ3FTQPOTFฦ͢ 3FRVFTUʹ$43'ରࡦUPLFOΛνΣοΫ ௨ͬͨΒɺͦͷ··࣍΁

Slide 21

Slide 21 text

6TJOH.JEEMFXBSF

Slide 22

Slide 22 text

#config.ru require ‘rack’ require ‘myapp’ class Middleware def initialize(app) @app = app end def call(env) env["rack.some_header"] = "setting an example" @app.call(env) end end use Middleware run MyApp.new 3BDL಺෦Ͱ!VTF഑ྻʹૠೖ 3BDL#VJMEFSʹCJOE͞ΕͯΔ