Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ちょっとわかるrack
Search
Leonard Chin
May 24, 2012
Programming
10
1.2k
ちょっとわかるrack
初心者向けrackの簡単な紹介
・rackとは何か
・rackアプリの作り方
・rack middlewareの作り方・使い方
※2012/5/14の会社内LTで使用した資料
Leonard Chin
May 24, 2012
Tweet
Share
More Decks by Leonard Chin
See All by Leonard Chin
生鮮ECのタイムセールを 耐え抜いてきた話 / Handling high traffic sale days at Cookpad Mart
lchin
3
12k
Performance as a Product Feature
lchin
5
1.9k
Database Performance for Ruby on Rails Applications
lchin
7
1.3k
Database Performance for Rails Applications
lchin
5
690
How to Survive and thrive as an engineer in a foreign land
lchin
4
1.2k
#eachを使ったら負け
lchin
7
1.6k
Other Decks in Programming
See All in Programming
ローコードサービスの進化のためのモノレポ移行
taro28
1
240
AWS CDKにおけるL2 Constructの仕組み / aws-cdk-l2-construct
gotok365
4
870
良いコードレビューとは
danimal141
10
10k
RecSys2024 参加報告
unonao
1
170
Functional APIから再考するLangGraphを使う理由
os1ma
4
610
Google Cloudとo11yで実現するアプリケーション開発者主体のDB改善
nnaka2992
1
200
JAWS Days 2025のインフラ
komakichi
1
430
読もう! Android build ドキュメント
andpad
1
190
AIレビュー導入によるCIツールとの共存と最適化
kamo26sima
1
1.5k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
110
令和トラベルにおけるコンテンツ生成AIアプリケーション開発の実践
ippo012
1
220
CQRS+ES勉強会#1
rechellatek
0
330
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
41
2.6k
RailsConf 2023
tenderlove
29
1k
4 Signs Your Business is Dying
shpigford
183
22k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Product Roadmaps are Hard
iamctodd
PRO
51
11k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.7k
Facilitating Awesome Meetings
lara
53
6.3k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Fireside Chat
paigeccino
37
3.3k
Site-Speed That Sticks
csswizardry
4
440
GraphQLとの向き合い方2022年版
quramy
44
14k
Transcript
ͪΐͬͱΘ͔Δ
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD ͜ͷ*'ɺͲ͏͢Δʁ
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD ڞ௨*'3BDL 3BDL"QQMJDBUJPO
call(env)
def call(env) ... end 3FRVFTUΛ͞ΕΔ 3FTQPOTFΛฦ͢ [status, headers, response_body]
ৄࡉ41&$Ͱ http://rack.rubyforge.org/doc/SPEC.html
4JOBUSBͷ߹
# 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
SBDLVQ
rackup config.ru ΞϓϦͷೖΓޱΛఆٛ Rack::Builder.new { <config.ru> }.to_app ʹ͢
#config.ru require ‘rack’ require ‘myapp’ run MyApp.new 3BDL"QQMJDBUJPO JFJNQMFNFOUTcall(env)
# Minimum config.ru require ‘rack’ run lambda { |env| [200,
{ "Content-Type" => "text/plain" }, ["OK"] ] } TUBUVT IFBEFST CPEZ
3BDL.JEEMFXBSF
Web Server App Server IUUQ DBMMSVCZ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD
3BDL*' 3BDL"QQMJDBUJPO Middleware Middleware 3BDL*' 3BDL*' .JEEMFXBSFΛૠೖ ^
w $43' w 3FEJSFDUJPO w -PHHJOH w 4FTTJPO.BOBHFNFOU w "VUIFOUJDBUJPO
w &NCFE(PPHMF"OBMZUJDT FUD
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Λ͍͡Δ
&YBNQMFSBDL@DTSG
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ΛνΣοΫ ௨ͬͨΒɺͦͷ··࣍
6TJOH.JEEMFXBSF
#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͞ΕͯΔ