it-swarm.com.de

Was ist die Variable "env" in der Rack-Middleware?

Ich weiß, dass ein Rack-Middleware-Filter eine Ruby-Klasse mit einer Initialisierungs- und einer Aufrufmethode ist. Ich weiß, dass die Aufrufmethode ein "env" -Argument akzeptiert. Etwas wie das:

class MyFilter
  def initialize(app)
  end

  def call(env)
  end
end

Meine Frage ist: Was genau wird das Argument "env" an "call" gesendet? Entspricht dies der Rails ENV-Umgebung (dh Entwicklung, Test, Produktion)?.

Vielen Dank!

20
User314159

env ist nur ein Hash. Rack selbst und verschiedene Middlewares fügen Werte hinzu.

Um zu verstehen, was die verschiedenen Schlüssel im Hash sind, lesen Sie die Rack-Spezifikation .

Und hier ist ein Beispiel-Env-Hash:

{
  "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"
}

Um die Verwendung zu erleichtern, checkout Rack :: Request , wodurch der Zugriff auf die Werte im env-Hash vereinfacht wird.

35
lulalala

Ich schlage vor, dass Sie versuchen können, die 'env'-Variable zu drucken, indem Sie eine einfache Programmierung schreiben.

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

geben Sie den Link localhost ein: 3000 

9
Joy Hu

Die Variable env ist ein Hash, der viele nützliche Informationen enthält, darunter Anforderungsheader und -körper sowie Daten zur Laufzeitumgebung, die möglicherweise von der Upstream-Middleware hinzugefügt wurden.

5
rossta

Betrachten Sie den Quellcode Je nachdem, welchen Webserver Sie verwenden, können Sie unterschiedliche Werte in Ihrem Env-Hash erhalten. Ich empfehle only mit dem, was in der Dokumentation steht .

Im Grunde handelt es sich bei der env um eine Hash-Version des für den Webserver spezifischen Anforderungsobjekts. Rack führt einige Arbeit aus, um eine normalisierte Umgebung zu schaffen, damit sich die Middleware konsistent auf Webservern verhalten kann. 

0
Garry Polley