What is the “env” variable in Rack middleware?

前端 未结 4 824
心在旅途
心在旅途 2021-01-01 11:56

I know a Rack middleware filter is a Ruby class with an initialize and a call method. I know the call method takes an \"env\" argument. Something like this:



        
相关标签:
4条回答
  • 2021-01-01 12:16

    Looking at the source code depending on which web server you have you can get different values in your env hash. I recommend only using what's in the documentation.

    Basically the env is a hash version of the request object specific to the web server. Rack does some work to give a normalized env so the middleware can behave consistently across web servers.

    0 讨论(0)
  • 2021-01-01 12:20

    I suggest that you can try to print the 'env' variable with writing a simple programming.

    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
    

    enter the link localhost:3000

    0 讨论(0)
  • 2021-01-01 12:26

    env is just a hash. Rack itself and various middlewares add values into it.

    To understand what the various keys are in the hash, check out the Rack Specification.

    And here is a sample 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"
    }
    

    And to make it easier to use, checkout Rack::Request which makes it easier to access the values inside the env hash.

    0 讨论(0)
  • 2021-01-01 12:33

    The env variable is a hash, which contains a lot of useful information including request headers and body, and run-time environment data that may have been added by upstream middleware.

    0 讨论(0)
提交回复
热议问题