example awesome ruby-on-rails rack middleware

ruby on rails - awesome - ¿Qué es la variable "env" en el middleware de Rack?



grape swagger (4)

Sé que un filtro de middleware de Rack es una clase de Ruby con un método de inicialización y de llamada. Sé que el método de llamada toma un argumento "env". Algo como esto:

class MyFilter def initialize(app) end def call(env) end end

Mi pregunta es: ¿qué es exactamente el argumento "env" enviado a "call"? Es lo mismo que el entorno de Rails ENV (es decir, desarrollo, pruebas, producción).

¡Gracias!


La variable env es un hash, que contiene una gran cantidad de información útil, incluidos los encabezados y el cuerpo de la solicitud, y los datos del entorno de tiempo de ejecución que pueden haber sido agregados por el middleware ascendente.


Le sugiero que intente imprimir la variable ''env'' escribiendo una programación simple.

require "rubygems" require "rack" def pp(hash) hash.map {|key,value| "#{key} => #{value}"}.sort.join("<br/>") end Rack::Handler::WEBrick.run lambda {|env| [200,{},[pp(env)]]} , :Port=>3000

entrar en el enlace localhost: 3000


Mirando el código fuente, dependiendo de qué servidor web tenga, puede obtener diferentes valores en su env hash. Recomiendo solo usar lo que está en la documentación .

Básicamente, env es una versión hash del objeto de solicitud específico para el servidor web. Rack hace un poco de trabajo para proporcionar un entorno normalizado para que el middleware pueda comportarse de manera consistente en los servidores web.


env es solo un hash Rack en sí y varios middlewares agregan valores a él.

Para comprender cuáles son las distintas claves en el hash, consulte la Especificación de Rack .

Y aquí hay una muestra de hash env:

{ "GATEWAY_INTERFACE" => "CGI/1.1", "PATH_INFO" => "/index.html", "QUERY_STRING" => "", "REMOTE_ADDR" => "::1", "REMOTE_HOST" => "localhost", "REQUEST_METHOD" => "GET", "REQUEST_URI" => "http://localhost:3000/index.html", "SCRIPT_NAME" => "", "SERVER_NAME" => "localhost", "SERVER_PORT" => "3000", "SERVER_PROTOCOL" => "HTTP/1.1", "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)", "HTTP_HOST" => "localhost:3000", "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0", "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3", "HTTP_ACCEPT_ENCODING" => "gzip, deflate", "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61", "HTTP_CONNECTION" => "keep-alive", "HTTP_CACHE_CONTROL" => "max-age=0", "rack.version" => [1, 2], "rack.input" => #<StringIO:0x007fa1bce039f8>, "rack.errors" => #<IO:<STDERR>>, "rack.multithread" => true, "rack.multiprocess" => false, "rack.run_once" => false, "rack.url_scheme" => "http", "HTTP_VERSION" => "HTTP/1.1", "REQUEST_PATH" => "/index.html" }

Y para que sea más fácil de usar, marque Rack::Request que facilita el acceso a los valores dentro del hash env.