Opis stosu Racka w Rails 3.2

Właśnie wyszły stabilne Railsy 3.2. Przy tej okazji przyjrzałem się stosowi Racka.

Za co odpowiedzialne są poszczególne middleware’y?

Stos Rails 3.2 wygląda następująco (kolejność od najwcześniej do najpóźniej uruchamianych middleware’ów, jak przy rake middleware):


# Serwuje statyczne pliki
use ActionDispatch::Static

# Synchronizuje obsługę żądania na muteksie
use Rack::Lock

# Instancjuje backend cache'a (LocalStore.new)
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002964ba8>

# Mierzy czas żądania i dokleja nagłówek X-Runtime
use Rack::Runtime

# Nadpisuje prawdziwą methodę HTTP parametrem _method 
# lub nagłówkiem HTTP X_HTTP_METHOD_OVERRIDE
use Rack::MethodOverride

# Loguje pierwszą wzmiankę o żądaniu, np.: 
# Started GET "/dupa" for 127.0.0.1 at 2012-01-21 12:18:28 +0100
use Rails::Rack::Logger

# Przekazuje nagłówek X-Request-Id z żądania do odpowiedzi aby umożliwić 
# śledzenie żądania przez stos firewalli, load balancerów, serwerów itp.
use ActionDispatch::RequestId

# Łapie wszelkie wyjątki aplikacji.
# Robi rescue Exception, a więc także SyntaxError, NoMemoryError itd.
# Dla żądań zdalnych renderuje statyczne strony błędów (np. public/500.html).
use ActionDispatch::ShowExceptions

# Łapie wszelkie wyjątki aplikacji.
# Robi rescue Exception, a więc także SyntaxError, NoMemoryError itd.
# Dla żądań lokalnych renderuje deweloperski stack trace.
# Dla żądań zdalnych propaguje wyjątek w górę stosu czyli w praktyce do
# ActionDispatch::ShowExceptions.
use ActionDispatch::DebugExceptions

# Usiłuje ustalić oryginalne IP klienta odsiewając lokalne i zdalne proxy
use ActionDispatch::RemoteIp

# Ustawia nagłówek odpowiedzi X-Sendfile w przypadku serwowania
# statycznego pliku aby przerzucić pracę na serwer, który zrobi
# to wydajniej niż Ruby (o ile jest do tego skonfigurowany).
use Rack::Sendfile

# Odpowiada za reloading kodu w trybie deweloperskim.
use ActionDispatch::Reloader

# Woła callbacki before, after i around akcji kontrolera
use ActionDispatch::Callbacks

# Zwraca połączenie do puli jeśli pojawi się wyjątek 
# (o ile request nie pochodzi z testów integracyjnych)
use ActiveRecord::ConnectionAdapters::ConnectionManagement

# Klasyczny cache zapytaniowy. Kluczem są Stringi z ostatecznymi 
# zapytaniami SQL.
use ActiveRecord::QueryCache

# Renderuje ciastka ustawione w kontrolerze do nagłówków HTTP 
# Robi to z pomocą Rack::Utils
use ActionDispatch::Cookies

# Zapisuje dane sesji do skonfigurowanego backendu, np. do ciastka
use ActionDispatch::Session::CookieStore

# Usuwa wiadomość flash po użyciu
use ActionDispatch::Flash

# Buduje Hasha params zgodnie z railsowymi konwencjami 
# przekazywania parametrów
use ActionDispatch::ParamsParser

# Usuwa body dla żądań metodą HEAD
use ActionDispatch::Head

# Porównuje nagłówki ETag (żądania z odpowiedzią) oraz Last-Modified
# dążąc do zwrócenia 304 Not Modified i wyzerowania body
use Rack::ConditionalGet

# Oblicza i dokleja nagłówek ETag odpowiedzi
use Rack::ETag

# Dodaje nagłówek X-UA-Compatible do odpowiedzi w zależności od opcji
# config.action_dispatch.best_standards_support za pomocą której
# można wymusić tryb quirks lub strict dla IE.
use ActionDispatch::BestStandardsSupport
Akcja "Oświeć Przyjaciół", podziel się znaleziskiem:
  • Wykop
  • Facebook
  • Twitter
  • Blip
  • email
  • del.icio.us
  • Blogger.com
  • Google Bookmarks
  • Śledzik
  • RSS
This entry was posted in polskie, programowanie, rails, ruby, technologia. Bookmark the permalink.

7 Responses to Opis stosu Racka w Rails 3.2

  1. Super lista! Trochę się przy okazji dowiedziałem nowego :)

  2. Sebastian says:

    ActiveRecord::ConnectionAdapters::ConnectionManagement zwraca połączenie do puli jeśli pojawi się wyjątek, jeśli request nie pochodzi z testów integracyjnych.

  3. Wielkie dzięki :) ładnie i treściwie opisane.

  4. qertoip says:

    To ja się męczyłem rozkminiając cały ten stos, czytając źródła, a dwa dni później wyszedł RailsCast… http://railscasts.com/episodes/319-rails-middleware-walkthrough

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>