web-dev-qa-db-fra.com

Quelle est la variable "env" dans le middleware Rack?

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!

20
User314159

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.

35
lulalala

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 

9
Joy Hu

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.

5
rossta

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. 

0
Garry Polley