Rails: arquitetura Rack
O curso acompanha a camada Rack que fica por baixo de uma aplicação Rails 8.1. Ele lê o código do ActionDispatch::MiddlewareStack#build e do MiddlewareStackProxy, que grava as chamadas a config.middleware para aplicá-las no fim do boot. Mostra como o Rack::Builder avalia o config.ru e como o Puma transforma HTTP cru no Hash env e escreve a resposta de volta. Explica por que um body Rack só precisa responder a each. Também trata do Rack::Response, do mixin Rack::Request::Helpers no ActionDispatch::Request e de um desafio de parsing de query string.
O que você vai aprender
- ✓Como o MiddlewareStack#build envolve os middlewares com reverse e inject
- ✓Como o MiddlewareStackProxy grava as chamadas a config.middleware e as aplica no boot
- ✓Como o Rack::Builder avalia o config.ru e o que fazem run, use e map
- ✓Como o Puma transforma HTTP cru no env e escreve a resposta no socket
- ✓Por que o body Rack precisa de each, como funciona o streaming e para que serve o Rack::Response
- ✓Como o ActionDispatch::Request ganha o Rack::Request::Helpers por composição
A máquina real por trás do config.middleware
O desafio final do curso passado pedia uma função run_chain(env, middlewares, final_app). Ela começa por final_app, percorre a lista de middlewares de trás para frente e envolve cada um em volta da aplicação atual. Se a sua solução ficou parecida com middlewares.reverse_each { |mw| app =…
Ler a aula completa grátis →Currículo
7 aulasA máquina real por trás do config.middleware
O ActionDispatch::MiddlewareStack#build inverte a lista de middlewares e envolve cada entrada com klass.new(app, *args, &block).
Gravar em vez de aplicar: o MiddlewareStackProxy
As chamadas a config.middleware guardam lambdas em arrays, e o merge_into as aplica no fim do boot sobre a pilha padrão.
Rack::Builder e o config.ru
O Rack::Builder avalia o config.ru com um builder no papel de self, então run, use e map são métodos dele.
Do socket ao env: como o Puma constrói o Hash
O Puma interpreta a requisição HTTP crua, monta o Hash env, chama a aplicação e escreve a resposta de volta.
O contrato do body, streaming, e o Rack::Response
O body Rack só precisa de each, o que permite streaming, e o Rack::Response monta a tripla status, headers e body.
Rack::Request: o wrapper por trás de request.path
O ActionDispatch::Request inclui o Rack::Request::Helpers como mixin, e por isso path, ip e post? vêm do Rack.
Juntando tudo: rastreando uma requisição real
Uma requisição GET é acompanhada por todos os mecanismos, e um desafio transforma uma query string crua num Hash.