読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Plackコードリーディングした時のメモ

Plackをコードリーディングしたのだけれど、適当にメモしたのを公開しておく。

PSGI

env
response
  • [status, [headers], [content]]

Plack::Request

  • env受け取る
    • それっぽいやつを返す
  • cookieのparse
  • _parse_request_body
    • inputからbodyを読み込んで行く処理

Plack::Response

  • responseを作るUtilityのみ

Plack::TempBuffer

  • Request bodyなどを処理するための一時buffer
  • サイズが小さければPerlIO(scalarに値を保存しておく)、大きければFile?

Plack::Handler

  • Plack::RunnerとPSGI serverをつなぐadapter
    • Plack::Handler::Apache2, Plack::Handler::CGIとか
  • StarletやStarmanにもPlack::Handler::*がついてくる
  • newとrunを実装すれば、plackupで起動できる

Plack::Runner

  • plackup実体
  • やっていることとしては
    • optionのparse
    • appの用意
      • CODE or app.psgiなどから、appのための準備をする
    • loaderを利用してappを読み込む
      • Plack::Loader->prepare_appでbuilderからappを作る
    • serverを読み込んでrunを実行する
      • load_serverして、loaderがserverをrunしているだけ

Plack::Loader

  • Plack::HandlerからServerを立ち上げる役割
  • preload_appでBuilderによってつくられたものからappを作る
  • runはserver->runを実行しているだけ
  • subclassでrunとかpreload_appとかいじれば、モジュールの遅延ロードとか、serverの自動再起動とかが実装可能

Plack::Middleware

  • PlackのMiddlewareを実装するbase class
  • callとresponse_cbを使ってMiddlewareを実装できる
    • response_cbを使う理由はresがarrayrefとcoderef両方共使えるから

Plack::Builder

  • builderは逆順にwrapしていく

Hash::MultiValue

  • keys : 配列, values : 配列
    • 配列位置によるvalueの特定
    • inside out object的に作られている
    • private

Plack::Middleware::AccessLog

  • psgi.errorsに適当に出力しているだけ

Plack::Middleware::ReverseProxy

  • Plack::Middleware::ReverseProxyを通して以下のようなのをproxyで指定しておくと、良い感じにしてくれる
proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host              $http_host;