2013-07-01 7 views
19

Ich kenne einen Rack-Middleware-Filter ist eine Ruby-Klasse mit einer Initialisierungs- und einer Aufrufmethode. Ich weiß, dass die Aufrufmethode ein Argument "env" verwendet. So etwas wie das:Was ist die Variable "env" in Rack-Middleware?

Meine Frage ist: Was genau ist das "env" -Argument an "Anruf" gesendet? Ist dies das gleiche wie die Rails ENV-Umgebung (dh Entwicklung, Test, Produktion).

Danke!

Antwort

32

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, überprüfen Sie die Rack Specification.

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

Und es leichter zu benutzen, Kasse Rack::Request, die es einfacher für den Zugriff auf die Werte innerhalb des env Hash macht.

8

Ich schlage vor, dass Sie versuchen können, die 'env' Variable mit einer einfachen Programmierung zu 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: 3000

+0

genial, danke! – User314159

+0

gibt es nichts Besseres als Lernen von Beispielen, danke! –

5

Die env Variable ist ein Hash, das eine Menge nützlicher Informationen einschließlich Anforderungsheader und Körper, und die Laufzeitumgebung Daten enthält, die stromaufwärts hinzugefügt wurden durch Middleware.

+0

danke für die Antwort! – User314159

0

Mit Blick auf die source code je nachdem, welchen Webserver Sie haben, können Sie verschiedene Werte in Ihrem Env-Hash erhalten. Ich empfehle nur mit was ist in der documentation.

Grundsätzlich ist das env eine Hash-Version des für den Webserver spezifischen Anfrageobjekts. Rack arbeitet an einer normalisierten Umgebung, damit sich die Middleware konsistent über Webserver hinweg verhält.