Je sais qu'un filtre middleware Rack est une classe Ruby avec une méthode d'initialisation et d'appel. Je sais que la méthode call utilise un argument "env". Quelque chose comme ça:
class MyFilter
def initialize(app)
end
def call(env)
end
end
Ma question est la suivante: quel est exactement l'argument "env" envoyé à "call"? S'agit-il de l'environnement Rails ENV (développement, test, production)?.
Merci!
env
est juste un hash. Le rack lui-même et divers middlewares y ajoutent des valeurs.
Pour comprendre la nature des différentes clés dans le hachage, consultez le Spécification du rack .
Et voici un exemple 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"
}
Et pour le rendre plus facile à utiliser, checkout Rack :: Request , ce qui facilite l'accès aux valeurs contenues dans le hachage env.
Je suggère que vous pouvez essayer d'imprimer la variable 'env' en écrivant une programmation 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
entrez le lien localhost: 3000
La variable env
est un hachage, qui contient de nombreuses informations utiles, notamment les en-têtes et le corps de la requête, ainsi que des données d’environnement d’exécution pouvant avoir été ajoutées par le middleware en amont.
En regardant le code source } en fonction du serveur Web que vous avez, vous pouvez obtenir différentes valeurs dans votre hachage env. Je recommande only en utilisant le contenu de la documentation } _.
En gros, env est une version hachée de l'objet de requête spécifique au serveur Web. Rack s'efforce de donner un environnement normalisé afin que le middleware puisse se comporter de manière cohérente sur tous les serveurs Web.