Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the "env" variable in Rack middleware?

Tags:

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:

class MyFilter   def initialize(app)   end    def call(env)   end end 

My question is: what exactly is the "env" argument sent to "call"? Is this the same as the Rails ENV environment (ie. development, testing, production).

Thanks!

like image 259
User314159 Avatar asked Jul 01 '13 02:07

User314159


People also ask

What is environment variables in Rails?

Environment variables contain a name and value, and provide a simple way to share configuration settings between multiple applications and processes in Linux. For example, Cloud 66 creates environment variables for your database server address, which can be referenced in your code.

How to check environment variables in Rails?

Use command ENV in rails console. That will return a hash of your environmental values you can access. Alternatively, you can access your environmental variables from your apps root path using the same command and the variables will be returned formatted.

What are environment variables in linux?

Linux environment variables are dynamic variables used by a shell and its child processes. Environment variables define a variety of aspects related to how a Linux system works. For example, a user's default shell is defined in the SHELL variable.


1 Answers

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.

like image 81
lulalala Avatar answered Oct 19 '22 21:10

lulalala