diff options
author | Joshua Peek <josh@joshpeek.com> | 2009-08-03 16:03:30 -0500 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2009-08-03 16:03:30 -0500 |
commit | 6ae0a1014c2bfc06ad4d91ea04da5c42be454079 (patch) | |
tree | 8d820e725d0f6e419a6a988c9e5c048e9bd9fce0 | |
parent | 39fec318fbe5bda17eab4aa3d35c2ed30a36583e (diff) | |
download | rack-6ae0a1014c2bfc06ad4d91ea04da5c42be454079.tar.gz |
Add common HTTP strings to Rack::Const
41 files changed, 383 insertions, 319 deletions
diff --git a/lib/rack.rb b/lib/rack.rb index 371d0156..a19ac2db 100644 --- a/lib/rack.rb +++ b/lib/rack.rb @@ -32,6 +32,7 @@ module Rack autoload :Chunked, "rack/chunked" autoload :CommonLogger, "rack/commonlogger" autoload :ConditionalGet, "rack/conditionalget" + autoload :Const, "rack/constants" autoload :ContentLength, "rack/content_length" autoload :ContentType, "rack/content_type" autoload :File, "rack/file" diff --git a/lib/rack/adapter/camping.rb b/lib/rack/adapter/camping.rb index 63bc787f..8eb32318 100644 --- a/lib/rack/adapter/camping.rb +++ b/lib/rack/adapter/camping.rb @@ -6,9 +6,9 @@ module Rack end def call(env) - env["PATH_INFO"] ||= "" - env["SCRIPT_NAME"] ||= "" - controller = @app.run(env['rack.input'], env) + env[Const::ENV_PATH_INFO] ||= "" + env[Const::ENV_SCRIPT_NAME] ||= "" + controller = @app.run(env[Const::RACK_INPUT], env) h = controller.headers h.each_pair do |k,v| if v.kind_of? URI diff --git a/lib/rack/auth/abstract/handler.rb b/lib/rack/auth/abstract/handler.rb index 214df629..a08e5287 100644 --- a/lib/rack/auth/abstract/handler.rb +++ b/lib/rack/auth/abstract/handler.rb @@ -17,8 +17,8 @@ module Rack def unauthorized(www_authenticate = challenge) return [ 401, - { 'Content-Type' => 'text/plain', - 'Content-Length' => '0', + { Const::CONTENT_TYPE => 'text/plain', + Const::CONTENT_LENGTH => '0', 'WWW-Authenticate' => www_authenticate.to_s }, [] ] @@ -26,8 +26,8 @@ module Rack def bad_request return [ 400, - { 'Content-Type' => 'text/plain', - 'Content-Length' => '0' }, + { Const::CONTENT_TYPE => 'text/plain', + Const::CONTENT_LENGTH => '0' }, [] ] end diff --git a/lib/rack/auth/basic.rb b/lib/rack/auth/basic.rb index 95572246..a2fae961 100644 --- a/lib/rack/auth/basic.rb +++ b/lib/rack/auth/basic.rb @@ -20,7 +20,7 @@ module Rack return bad_request unless auth.basic? if valid?(auth) - env['REMOTE_USER'] = auth.username + env[Const::ENV_REMOTE_USER] = auth.username return @app.call(env) end diff --git a/lib/rack/auth/digest/md5.rb b/lib/rack/auth/digest/md5.rb index e579dc96..33a9da06 100644 --- a/lib/rack/auth/digest/md5.rb +++ b/lib/rack/auth/digest/md5.rb @@ -45,7 +45,7 @@ module Rack if auth.nonce.stale? return unauthorized(challenge(:stale => true)) else - env['REMOTE_USER'] = auth.username + env[Const::ENV_REMOTE_USER] = auth.username return @app.call(env) end diff --git a/lib/rack/auth/digest/request.rb b/lib/rack/auth/digest/request.rb index a8aa3bf9..1134b443 100644 --- a/lib/rack/auth/digest/request.rb +++ b/lib/rack/auth/digest/request.rb @@ -8,7 +8,7 @@ module Rack class Request < Auth::AbstractRequest def method - @env['rack.methodoverride.original_method'] || @env['REQUEST_METHOD'] + @env['rack.methodoverride.original_method'] || @env[Const::ENV_REQUEST_METHOD] end def digest? @@ -16,7 +16,7 @@ module Rack end def correct_uri? - (@env['SCRIPT_NAME'].to_s + @env['PATH_INFO'].to_s) == uri + (@env[Const::ENV_SCRIPT_NAME].to_s + @env[Const::ENV_PATH_INFO].to_s) == uri end def nonce diff --git a/lib/rack/auth/openid.rb b/lib/rack/auth/openid.rb index 43cbe4f9..de8babce 100644 --- a/lib/rack/auth/openid.rb +++ b/lib/rack/auth/openid.rb @@ -89,7 +89,7 @@ module Rack # The first argument is an OpenID::Response, the second is a # Rack::Request of the current request, the last is the hash used in # ruby-openid handling, which can be found manually at - # env['rack.session'][:openid]. + # env[Const::RACK_SESSION][:openid]. # # This is useful if you wanted to expand the processing done, such as # setting up user accounts. @@ -98,7 +98,7 @@ module Rack # def oid_app.success oid, request, session # user = Models::User[oid.identity_url] # user ||= Models::User.create_from_openid oid - # request['rack.session'][:user] = user.id + # request[Const::RACK_SESSION][:user] = user.id # redirect MyApp.site_home # end # @@ -133,7 +133,7 @@ module Rack # the current request is used. # # <tt>:session_key</tt> defines the key to the session hash in the env. - # The default is 'rack.session'. + # The default is Const::RACK_SESSION. # # <tt>:openid_param</tt> defines at what key in the request parameters to # find the identifier to resolve. As per the 2.0 spec, the default is @@ -159,7 +159,7 @@ module Rack and realm.fragment.nil? \ and realm.scheme =~ /^https?$/ \ and realm.host =~ /^(\*\.)?#{URI::REGEXP::PATTERN::URIC_NO_SLASH}+/ - realm.path = '/' if realm.path.empty? + realm.path = Const::SLASH if realm.path.empty? @realm = realm.to_s if ruri = options[:return_to] @@ -173,7 +173,7 @@ module Rack @return_to = ruri.to_s end - @session_key = options[:session_key] || 'rack.session' + @session_key = options[:session_key] || Const::RACK_SESSION @openid_param = options[:openid_param] || 'openid_identifier' @store = options[:store] || ::OpenID::Store::Memory.new @immediate = !!options[:immediate] @@ -235,7 +235,7 @@ module Rack # If all parameters fit within the max length of a URI, a 303 redirect # will be returned. Otherwise #confirm_post_params will be called. # - # Any messages from OpenID's request are logged to env['rack.errors'] + # Any messages from OpenID's request are logged to env[Const::RACK_ERRORS] # # <tt>env['rack.auth.openid.request']</tt> is the openid checkid request # instance. @@ -249,7 +249,7 @@ module Rack def check(consumer, session, req) oid = consumer.begin(req.GET[@openid_param], @anonymous) req.env['rack.auth.openid.request'] = oid - req.env['rack.errors'].puts(oid.message) + req.env[Const::RACK_ERRORS].puts(oid.message) p oid if $DEBUG ## Extension support @@ -269,7 +269,7 @@ module Rack end rescue ::OpenID::DiscoveryFailure => e # thrown from inside OpenID::Consumer#begin by yadis stuff - req.env['rack.errors'].puts( [e.message, *e.backtrace]*"\n" ) + req.env[Const::RACK_ERRORS].puts( [e.message, *e.backtrace]*"\n" ) return foreign_server_failure end @@ -278,7 +278,7 @@ module Rack # Data gathered from extensions are stored in session[:openid] with the # extension's namespace uri as the key. # - # Any messages from OpenID's response are logged to env['rack.errors'] + # Any messages from OpenID's response are logged to env[Const::RACK_ERRORS] # # <tt>env['rack.auth.openid.response']</tt> will contain the openid # response. @@ -286,7 +286,7 @@ module Rack def finish(consumer, session, req) oid = consumer.complete(req.GET, req.url) req.env['rack.auth.openid.response'] = oid - req.env['rack.errors'].puts(oid.message) + req.env[Const::RACK_ERRORS].puts(oid.message) p oid if $DEBUG if ValidStatus.include?(oid.status) @@ -366,7 +366,7 @@ module Rack # argument. def redirect(uri) - [ 303, {'Content-Type'=>'text/plain', 'Content-Length'=>'0', + [ 303, {Const::CONTENT_TYPE=>'text/plain', Const::CONTENT_LENGTH=>'0', 'Location' => uri}, [] ] end @@ -374,21 +374,21 @@ module Rack # Returns an empty 400 response. def bad_request - [ 400, {'Content-Type'=>'text/plain', 'Content-Length'=>'0'}, + [ 400, {Const::CONTENT_TYPE=>'text/plain', Const::CONTENT_LENGTH=>'0'}, [''] ] end # Returns a basic unauthorized 401 response. def unauthorized - [ 401, {'Content-Type' => 'text/plain', 'Content-Length' => '13'}, + [ 401, {Const::CONTENT_TYPE => 'text/plain', Const::CONTENT_LENGTH => '13'}, ['Unauthorized.'] ] end # Returns a basic access denied 403 response. def access_denied - [ 403, {'Content-Type' => 'text/plain', 'Content-Length' => '14'}, + [ 403, {Const::CONTENT_TYPE => 'text/plain', Const::CONTENT_LENGTH => '14'}, ['Access denied.'] ] end @@ -396,7 +396,7 @@ module Rack # OpenID server fails. def foreign_server_failure - [ 503, {'Content-Type'=>'text/plain', 'Content-Length' => '23'}, + [ 503, {Const::CONTENT_TYPE=>'text/plain', Const::CONTENT_LENGTH => '23'}, ['Foreign server failure.'] ] end @@ -452,7 +452,7 @@ module Rack def invalid_status(oid, request, session) msg = 'Invalid status returned by the OpenID authorization reponse.' [ 500, - {'Content-Type'=>'text/plain','Content-Length'=>msg.length.to_s}, + {Const::CONTENT_TYPE=>'text/plain',Const::CONTENT_LENGTH=>msg.length.to_s}, [msg] ] end end @@ -463,7 +463,7 @@ module Rack # # use Rack::Session::Pool # use Rack::Auth::OpenIDAuth, realm, openid_options do |env| - # env['rack.session'][:authkey] == a_string + # env[Const::RACK_SESSION][:authkey] == a_string # end # run RackApp # diff --git a/lib/rack/builder.rb b/lib/rack/builder.rb index 295235e5..84257b4d 100644 --- a/lib/rack/builder.rb +++ b/lib/rack/builder.rb @@ -17,7 +17,7 @@ module Rack # # app = Rack::Builder.app do # use Rack::CommonLogger - # lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] } + # lambda { |env| [200, {Const::CONTENT_TYPE => 'text/plain'}, 'OK'] } # end # # +use+ adds a middleware to the stack, +run+ dispatches to an application. diff --git a/lib/rack/chunked.rb b/lib/rack/chunked.rb index 280d89dd..e0d88bac 100644 --- a/lib/rack/chunked.rb +++ b/lib/rack/chunked.rb @@ -15,10 +15,10 @@ module Rack status, headers, body = @app.call(env) headers = HeaderHash.new(headers) - if env['HTTP_VERSION'] == 'HTTP/1.0' || + if env[Const::ENV_HTTP_VERSION] == 'HTTP/1.0' || STATUS_WITH_NO_ENTITY_BODY.include?(status) || - headers['Content-Length'] || - headers['Transfer-Encoding'] + headers[Const::CONTENT_LENGTH] || + headers[Const::TRANSFER_ENCODING] [status, headers.to_hash, body] else dup.chunk(status, headers, body) @@ -27,8 +27,8 @@ module Rack def chunk(status, headers, body) @body = body - headers.delete('Content-Length') - headers['Transfer-Encoding'] = 'chunked' + headers.delete(Const::CONTENT_LENGTH) + headers[Const::TRANSFER_ENCODING] = 'chunked' [status, headers.to_hash, self] end diff --git a/lib/rack/commonlogger.rb b/lib/rack/commonlogger.rb index 880f0fbf..26e0a260 100644 --- a/lib/rack/commonlogger.rb +++ b/lib/rack/commonlogger.rb @@ -26,15 +26,15 @@ module Rack now = Time.now length = extract_content_length(header) - logger = @logger || env['rack.errors'] + logger = @logger || env[Const::RACK_ERRORS] logger.write FORMAT % [ - env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-", - env["REMOTE_USER"] || "-", + env[Const::ENV_HTTP_X_FORWARDED_FOR] || env[Const::ENV_REMOTE_ADDR] || "-", + env[Const::ENV_REMOTE_USER] || "-", now.strftime("%d/%b/%Y %H:%M:%S"), - env["REQUEST_METHOD"], - env["PATH_INFO"], - env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"], - env["HTTP_VERSION"], + env[Const::ENV_REQUEST_METHOD], + env[Const::ENV_PATH_INFO], + env[Const::ENV_QUERY_STRING].empty? ? Const::EMPTY_STRING : "?"+env[Const::ENV_QUERY_STRING], + env[Const::ENV_HTTP_VERSION], status.to_s[0..3], length, now - began_at ] diff --git a/lib/rack/conditionalget.rb b/lib/rack/conditionalget.rb index 046ebdb0..166c1930 100644 --- a/lib/rack/conditionalget.rb +++ b/lib/rack/conditionalget.rb @@ -20,14 +20,14 @@ module Rack end def call(env) - return @app.call(env) unless %w[GET HEAD].include?(env['REQUEST_METHOD']) + return @app.call(env) unless %w[GET HEAD].include?(env[Const::ENV_REQUEST_METHOD]) status, headers, body = @app.call(env) headers = Utils::HeaderHash.new(headers) if etag_matches?(env, headers) || modified_since?(env, headers) status = 304 - headers.delete('Content-Type') - headers.delete('Content-Length') + headers.delete(Const::CONTENT_TYPE) + headers.delete(Const::CONTENT_LENGTH) body = [] end [status, headers, body] @@ -35,12 +35,12 @@ module Rack private def etag_matches?(env, headers) - etag = headers['Etag'] and etag == env['HTTP_IF_NONE_MATCH'] + etag = headers[Const::ETAG] and etag == env[Const::ENV_HTTP_IF_NONE_MATCH] end def modified_since?(env, headers) - last_modified = headers['Last-Modified'] and - last_modified == env['HTTP_IF_MODIFIED_SINCE'] + last_modified = headers[Const::LAST_MODIFIED] and + last_modified == env[Const::ENV_HTTP_IF_MODIFIED_SINCE] end end diff --git a/lib/rack/constants.rb b/lib/rack/constants.rb new file mode 100644 index 00000000..8c9afeda --- /dev/null +++ b/lib/rack/constants.rb @@ -0,0 +1,55 @@ +module Rack + module Const + RACK_VERSION = 'rack.version'.freeze + RACK_INPUT = 'rack.input'.freeze + RACK_ERRORS = 'rack.errors'.freeze + RACK_MULTITHREAD = 'rack.multithread'.freeze + RACK_MULTIPROCESS = 'rack.multiprocess'.freeze + RACK_RUN_ONCE = 'rack.run_once'.freeze + RACK_URL_SCHEME = 'rack.url_scheme'.freeze + RACK_SESSION = 'rack.session'.freeze + RACK_SESSION_OPTIONS = 'rack.session.options'.freeze + + ENV_CONTENT_LENGTH = 'CONTENT_LENGTH'.freeze + ENV_CONTENT_TYPE = 'CONTENT_TYPE'.freeze + ENV_HTTPS = 'HTTPS'.freeze + ENV_HTTP_ACCEPT_ENCODING = 'HTTP_ACCEPT_ENCODING'.freeze + ENV_HTTP_CONTENT_LENGTH = 'HTTP_CONTENT_LENGTH'.freeze + ENV_HTTP_CONTENT_TYPE = 'HTTP_CONTENT_TYPE'.freeze + ENV_HTTP_COOKIE = 'HTTP_COOKIE'.freeze + ENV_HTTP_HOST = 'HTTP_HOST'.freeze + ENV_HTTP_IF_MODIFIED_SINCE = 'HTTP_IF_MODIFIED_SINCE'.freeze + ENV_HTTP_IF_NONE_MATCH = 'HTTP_IF_NONE_MATCH'.freeze + ENV_HTTP_PORT = 'HTTP_PORT'.freeze + ENV_HTTP_REFERER = 'HTTP_REFERER'.freeze + ENV_HTTP_VERSION = 'HTTP_VERSION'.freeze + ENV_HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze + ENV_HTTP_X_REQUESTED_WITH = 'HTTP_X_REQUESTED_WITH'.freeze + ENV_PATH_INFO = 'PATH_INFO'.freeze + ENV_QUERY_STRING = 'QUERY_STRING'.freeze + ENV_REMOTE_ADDR = 'REMOTE_ADDR'.freeze + ENV_REMOTE_USER = 'REMOTE_USER'.freeze + ENV_REQUEST_METHOD = 'REQUEST_METHOD'.freeze + ENV_REQUEST_PATH = 'REQUEST_PATH'.freeze + ENV_REQUEST_URI = 'REQUEST_URI'.freeze + ENV_SCRIPT_NAME = 'SCRIPT_NAME'.freeze + ENV_SERVER_NAME = 'SERVER_NAME'.freeze + ENV_SERVER_PORT = 'SERVER_PORT'.freeze + ENV_SERVER_PROTOCOL = 'SERVER_PROTOCOL'.freeze + + CACHE_CONTROL = 'Cache-Control'.freeze + CONTENT_ENCODING = 'Content-Encoding'.freeze + CONTENT_LENGTH = 'Content-Length'.freeze + CONTENT_TYPE = 'Content-Type'.freeze + DELETE = 'DELETE'.freeze + EMPTY_STRING = ''.freeze + ETAG = 'Etag'.freeze + GET = 'GET'.freeze + HEAD = 'HEAD'.freeze + LAST_MODIFIED = 'Last-Modified'.freeze + POST = 'POST'.freeze + PUT = 'PUT'.freeze + SLASH = '/'.freeze + TRANSFER_ENCODING = 'Transfer-Encoding'.freeze + end +end diff --git a/lib/rack/content_length.rb b/lib/rack/content_length.rb index 1e56d438..a3761295 100644 --- a/lib/rack/content_length.rb +++ b/lib/rack/content_length.rb @@ -14,13 +14,13 @@ module Rack headers = HeaderHash.new(headers) if !STATUS_WITH_NO_ENTITY_BODY.include?(status) && - !headers['Content-Length'] && - !headers['Transfer-Encoding'] && + !headers[Const::CONTENT_LENGTH] && + !headers[Const::TRANSFER_ENCODING] && (body.respond_to?(:to_ary) || body.respond_to?(:to_str)) body = [body] if body.respond_to?(:to_str) # rack 0.4 compat length = body.to_ary.inject(0) { |len, part| len + bytesize(part) } - headers['Content-Length'] = length.to_s + headers[Const::CONTENT_LENGTH] = length.to_s end [status, headers, body] diff --git a/lib/rack/content_type.rb b/lib/rack/content_type.rb index 0c1e1ca3..08fe44ff 100644 --- a/lib/rack/content_type.rb +++ b/lib/rack/content_type.rb @@ -16,7 +16,7 @@ module Rack def call(env) status, headers, body = @app.call(env) headers = Utils::HeaderHash.new(headers) - headers['Content-Type'] ||= @content_type + headers[Const::CONTENT_TYPE] ||= @content_type [status, headers.to_hash, body] end end diff --git a/lib/rack/deflater.rb b/lib/rack/deflater.rb index 14137a94..914c7d57 100644 --- a/lib/rack/deflater.rb +++ b/lib/rack/deflater.rb @@ -16,7 +16,7 @@ module Rack # Skip compressing empty entity body responses and responses with # no-transform set. if Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status) || - headers['Cache-Control'].to_s =~ /\bno-transform\b/ + headers[Const::CACHE_CONTROL].to_s =~ /\bno-transform\b/ return [status, headers, body] end @@ -33,20 +33,20 @@ module Rack case encoding when "gzip" - headers['Content-Encoding'] = "gzip" - headers.delete('Content-Length') - mtime = headers.key?("Last-Modified") ? - Time.httpdate(headers["Last-Modified"]) : Time.now + headers[Const::CONTENT_ENCODING] = "gzip" + headers.delete(Const::CONTENT_LENGTH) + mtime = headers.key?(Const::LAST_MODIFIED) ? + Time.httpdate(headers[Const::LAST_MODIFIED]) : Time.now [status, headers, GzipStream.new(body, mtime)] when "deflate" - headers['Content-Encoding'] = "deflate" - headers.delete('Content-Length') + headers[Const::CONTENT_ENCODING] = "deflate" + headers.delete(Const::CONTENT_LENGTH) [status, headers, DeflateStream.new(body)] when "identity" [status, headers, body] when nil message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found." - [406, {"Content-Type" => "text/plain", "Content-Length" => message.length.to_s}, [message]] + [406, {Const::CONTENT_TYPE => "text/plain", Const::CONTENT_LENGTH => message.length.to_s}, [message]] end end diff --git a/lib/rack/directory.rb b/lib/rack/directory.rb index acdd3029..15a35846 100644 --- a/lib/rack/directory.rb +++ b/lib/rack/directory.rb @@ -55,8 +55,8 @@ table { width:100%%; } def _call(env) @env = env - @script_name = env['SCRIPT_NAME'] - @path_info = Utils.unescape(env['PATH_INFO']) + @script_name = env[Const::ENV_SCRIPT_NAME] + @path_info = Utils.unescape(env[Const::ENV_PATH_INFO]) if forbidden = check_forbidden forbidden @@ -71,7 +71,7 @@ table { width:100%%; } body = "Forbidden\n" size = Rack::Utils.bytesize(body) - return [403, {"Content-Type" => "text/plain","Content-Length" => size.to_s}, [body]] + return [403, {Const::CONTENT_TYPE => "text/plain",Const::CONTENT_LENGTH => size.to_s}, [body]] end def list_directory @@ -95,7 +95,7 @@ table { width:100%%; } @files << [ url, basename, size, type, mtime ] end - return [ 200, {'Content-Type'=>'text/html; charset=utf-8'}, self ] + return [ 200, {Const::CONTENT_TYPE=>'text/html; charset=utf-8'}, self ] end def stat(node, max = 10) @@ -123,7 +123,7 @@ table { width:100%%; } def entity_not_found body = "Entity not found: #{@path_info}\n" size = Rack::Utils.bytesize(body) - return [404, {"Content-Type" => "text/plain", "Content-Length" => size.to_s}, [body]] + return [404, {Const::CONTENT_TYPE => "text/plain", Const::CONTENT_LENGTH => size.to_s}, [body]] end def each diff --git a/lib/rack/file.rb b/lib/rack/file.rb index fe62bd6b..13b16536 100644 --- a/lib/rack/file.rb +++ b/lib/rack/file.rb @@ -26,7 +26,7 @@ module Rack F = ::File def _call(env) - @path_info = Utils.unescape(env["PATH_INFO"]) + @path_info = Utils.unescape(env[Const::ENV_PATH_INFO]) return forbidden if @path_info.include? ".." @path = F.join(@root, @path_info) @@ -44,8 +44,8 @@ module Rack def forbidden body = "Forbidden\n" - [403, {"Content-Type" => "text/plain", - "Content-Length" => body.size.to_s}, + [403, {Const::CONTENT_TYPE => "text/plain", + Const::CONTENT_LENGTH => body.size.to_s}, [body]] end @@ -64,16 +64,16 @@ module Rack end [200, { - "Last-Modified" => F.mtime(@path).httpdate, - "Content-Type" => Mime.mime_type(F.extname(@path), 'text/plain'), - "Content-Length" => size.to_s + Const::LAST_MODIFIED => F.mtime(@path).httpdate, + Const::CONTENT_TYPE => Mime.mime_type(F.extname(@path), 'text/plain'), + Const::CONTENT_LENGTH => size.to_s }, body] end def not_found body = "File not found: #{@path_info}\n" - [404, {"Content-Type" => "text/plain", - "Content-Length" => body.size.to_s}, + [404, {Const::CONTENT_TYPE => "text/plain", + Const::CONTENT_LENGTH => body.size.to_s}, [body]] end diff --git a/lib/rack/handler/cgi.rb b/lib/rack/handler/cgi.rb index f45f3d73..9ba2572a 100644 --- a/lib/rack/handler/cgi.rb +++ b/lib/rack/handler/cgi.rb @@ -11,24 +11,24 @@ module Rack app = ContentLength.new(app) env = ENV.to_hash - env.delete "HTTP_CONTENT_LENGTH" + env.delete Const::ENV_HTTP_CONTENT_LENGTH - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env[Const::ENV_SCRIPT_NAME] = "" if env[Const::ENV_SCRIPT_NAME] == "/" - env.update({"rack.version" => [1,0], - "rack.input" => $stdin, - "rack.errors" => $stderr, + env.update({Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => $stdin, + Const::RACK_ERRORS => $stderr, - "rack.multithread" => false, - "rack.multiprocess" => true, - "rack.run_once" => true, + Const::RACK_MULTITHREAD => false, + Const::RACK_MULTIPROCESS => true, + Const::RACK_RUN_ONCE => true, - "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http" + Const::RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[Const::ENV_HTTPS]) ? "https" : "http" }) - env["QUERY_STRING"] ||= "" - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["REQUEST_PATH"] ||= "/" + env[Const::ENV_QUERY_STRING] ||= "" + env[Const::ENV_HTTP_VERSION] ||= env[Const::ENV_SERVER_PROTOCOL] + env[Const::ENV_REQUEST_PATH] ||= "/" status, headers, body = app.call(env) begin diff --git a/lib/rack/handler/fastcgi.rb b/lib/rack/handler/fastcgi.rb index 11e1fcaa..0cf7a439 100644 --- a/lib/rack/handler/fastcgi.rb +++ b/lib/rack/handler/fastcgi.rb @@ -28,29 +28,29 @@ module Rack app = Rack::ContentLength.new(app) env = request.env - env.delete "HTTP_CONTENT_LENGTH" + env.delete Const::ENV_HTTP_CONTENT_LENGTH - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env[Const::ENV_SCRIPT_NAME] = "" if env[Const::ENV_SCRIPT_NAME] == "/" rack_input = RewindableInput.new(request.in) - env.update({"rack.version" => [1,0], - "rack.input" => rack_input, - "rack.errors" => request.err, + env.update({Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => rack_input, + Const::RACK_ERRORS => request.err, - "rack.multithread" => false, - "rack.multiprocess" => true, - "rack.run_once" => false, + Const::RACK_MULTITHREAD => false, + Const::RACK_MULTIPROCESS => true, + Const::RACK_RUN_ONCE => false, - "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http" + Const::RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[Const::ENV_HTTPS]) ? "https" : "http" }) - env["QUERY_STRING"] ||= "" - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["REQUEST_PATH"] ||= "/" - env.delete "PATH_INFO" if env["PATH_INFO"] == "" - env.delete "CONTENT_TYPE" if env["CONTENT_TYPE"] == "" - env.delete "CONTENT_LENGTH" if env["CONTENT_LENGTH"] == "" + env[Const::ENV_QUERY_STRING] ||= "" + env[Const::ENV_HTTP_VERSION] ||= env[Const::ENV_SERVER_PROTOCOL] + env[Const::ENV_REQUEST_PATH] ||= "/" + env.delete Const::ENV_PATH_INFO if env[Const::ENV_PATH_INFO] == "" + env.delete Const::ENV_CONTENT_TYPE if env[Const::ENV_CONTENT_TYPE] == "" + env.delete Const::ENV_CONTENT_LENGTH if env[Const::ENV_CONTENT_LENGTH] == "" begin status, headers, body = app.call(env) diff --git a/lib/rack/handler/lsws.rb b/lib/rack/handler/lsws.rb index b4ddf4bb..71f41bf2 100644 --- a/lib/rack/handler/lsws.rb +++ b/lib/rack/handler/lsws.rb @@ -13,24 +13,24 @@ module Rack app = Rack::ContentLength.new(app) env = ENV.to_hash - env.delete "HTTP_CONTENT_LENGTH" - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env.delete Const::ENV_HTTP_CONTENT_LENGTH + env[Const::ENV_SCRIPT_NAME] = "" if env[Const::ENV_SCRIPT_NAME] == "/" rack_input = RewindableInput.new($stdin.read.to_s) env.update( - "rack.version" => [1,0], - "rack.input" => rack_input, - "rack.errors" => $stderr, - "rack.multithread" => false, - "rack.multiprocess" => true, - "rack.run_once" => false, - "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http" + Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => rack_input, + Const::RACK_ERRORS => $stderr, + Const::RACK_MULTITHREAD => false, + Const::RACK_MULTIPROCESS => true, + Const::RACK_RUN_ONCE => false, + Const::RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[Const::ENV_HTTPS]) ? "https" : "http" ) - env["QUERY_STRING"] ||= "" - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["REQUEST_PATH"] ||= "/" + env[Const::ENV_QUERY_STRING] ||= "" + env[Const::ENV_HTTP_VERSION] ||= env[Const::ENV_SERVER_PROTOCOL] + env[Const::ENV_REQUEST_PATH] ||= "/" status, headers, body = app.call(env) begin send_headers status, headers diff --git a/lib/rack/handler/mongrel.rb b/lib/rack/handler/mongrel.rb index 7b448261..ee11017b 100644 --- a/lib/rack/handler/mongrel.rb +++ b/lib/rack/handler/mongrel.rb @@ -40,26 +40,26 @@ module Rack def process(request, response) env = {}.replace(request.params) - env.delete "HTTP_CONTENT_TYPE" - env.delete "HTTP_CONTENT_LENGTH" + env.delete Const::ENV_HTTP_CONTENT_TYPE + env.delete Const::ENV_HTTP_CONTENT_LENGTH - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env[Const::ENV_SCRIPT_NAME] = "" if env[Const::ENV_SCRIPT_NAME] == "/" rack_input = request.body || StringIO.new('') rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env.update({"rack.version" => [1,0], - "rack.input" => rack_input, - "rack.errors" => $stderr, + env.update({Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => rack_input, + Const::RACK_ERRORS => $stderr, - "rack.multithread" => true, - "rack.multiprocess" => false, # ??? - "rack.run_once" => false, + Const::RACK_MULTITHREAD => true, + Const::RACK_MULTIPROCESS => false, # ??? + Const::RACK_RUN_ONCE => false, - "rack.url_scheme" => "http", + Const::RACK_URL_SCHEME => "http", }) - env["QUERY_STRING"] ||= "" - env.delete "PATH_INFO" if env["PATH_INFO"] == "" + env[Const::ENV_QUERY_STRING] ||= "" + env.delete Const::ENV_PATH_INFO if env[Const::ENV_PATH_INFO] == "" status, headers, body = @app.call(env) diff --git a/lib/rack/handler/scgi.rb b/lib/rack/handler/scgi.rb index bd860a5d..5c78977f 100644 --- a/lib/rack/handler/scgi.rb +++ b/lib/rack/handler/scgi.rb @@ -25,25 +25,25 @@ module Rack def process_request(request, input_body, socket) env = {}.replace(request) - env.delete "HTTP_CONTENT_TYPE" - env.delete "HTTP_CONTENT_LENGTH" - env["REQUEST_PATH"], env["QUERY_STRING"] = env["REQUEST_URI"].split('?', 2) - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["PATH_INFO"] = env["REQUEST_PATH"] - env["QUERY_STRING"] ||= "" - env["SCRIPT_NAME"] = "" + env.delete Const::ENV_HTTP_CONTENT_TYPE + env.delete Const::ENV_HTTP_CONTENT_LENGTH + env[Const::ENV_REQUEST_PATH], env[Const::ENV_QUERY_STRING] = env[Const::ENV_REQUEST_URI].split('?', 2) + env[Const::ENV_HTTP_VERSION] ||= env[Const::ENV_SERVER_PROTOCOL] + env[Const::ENV_PATH_INFO] = env[Const::ENV_REQUEST_PATH] + env[Const::ENV_QUERY_STRING] ||= "" + env[Const::ENV_SCRIPT_NAME] = "" rack_input = StringIO.new(input_body) rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env.update({"rack.version" => [1,0], - "rack.input" => rack_input, - "rack.errors" => $stderr, - "rack.multithread" => true, - "rack.multiprocess" => true, - "rack.run_once" => false, + env.update({Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => rack_input, + Const::RACK_ERRORS => $stderr, + Const::RACK_MULTITHREAD => true, + Const::RACK_MULTIPROCESS => true, + Const::RACK_RUN_ONCE => false, - "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http" + Const::RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[Const::ENV_HTTPS]) ? "https" : "http" }) status, headers, body = app.call(env) begin diff --git a/lib/rack/handler/webrick.rb b/lib/rack/handler/webrick.rb index 5b9ae740..d4bebf43 100644 --- a/lib/rack/handler/webrick.rb +++ b/lib/rack/handler/webrick.rb @@ -26,25 +26,25 @@ module Rack rack_input = StringIO.new(req.body.to_s) rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env.update({"rack.version" => [1,0], - "rack.input" => rack_input, - "rack.errors" => $stderr, + env.update({Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => rack_input, + Const::RACK_ERRORS => $stderr, - "rack.multithread" => true, - "rack.multiprocess" => false, - "rack.run_once" => false, + Const::RACK_MULTITHREAD => true, + Const::RACK_MULTIPROCESS => false, + Const::RACK_RUN_ONCE => false, - "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http" + Const::RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[Const::ENV_HTTPS]) ? "https" : "http" }) - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["QUERY_STRING"] ||= "" - env["REQUEST_PATH"] ||= "/" - if env["PATH_INFO"] == "" - env.delete "PATH_INFO" + env[Const::ENV_HTTP_VERSION] ||= env[Const::ENV_SERVER_PROTOCOL] + env[Const::ENV_QUERY_STRING] ||= "" + env[Const::ENV_REQUEST_PATH] ||= "/" + if env[Const::ENV_PATH_INFO] == "" + env.delete Const::ENV_PATH_INFO else - path, n = req.request_uri.path, env["SCRIPT_NAME"].length - env["PATH_INFO"] = path[n, path.length-n] + path, n = req.request_uri.path, env[Const::ENV_SCRIPT_NAME].length + env[Const::ENV_PATH_INFO] = path[n, path.length-n] end status, headers, body = @app.call(env) diff --git a/lib/rack/head.rb b/lib/rack/head.rb index deab822a..825b5f51 100644 --- a/lib/rack/head.rb +++ b/lib/rack/head.rb @@ -8,7 +8,7 @@ class Head def call(env) status, headers, body = @app.call(env) - if env["REQUEST_METHOD"] == "HEAD" + if env[Const::ENV_REQUEST_METHOD] == Const::HEAD [status, headers, []] else [status, headers, body] diff --git a/lib/rack/lint.rb b/lib/rack/lint.rb index 796807a0..955ba2ec 100644 --- a/lib/rack/lint.rb +++ b/lib/rack/lint.rb @@ -40,8 +40,8 @@ module Rack assert("No env given") { env } check_env env - env['rack.input'] = InputWrapper.new(env['rack.input']) - env['rack.errors'] = ErrorWrapper.new(env['rack.errors']) + env[Const::RACK_INPUT] = InputWrapper.new(env[Const::RACK_INPUT]) + env[Const::RACK_ERRORS] = ErrorWrapper.new(env[Const::RACK_ERRORS]) ## and returns an Array of exactly three values: status, headers, @body = @app.call(env) @@ -126,7 +126,7 @@ module Rack ## <tt>rack.session</tt>:: A hash like interface for storing request session data. ## The store must implement: - if session = env['rack.session'] + if session = env[Const::RACK_SESSION] ## store(key, value) (aliased as []=); assert("session #{session.inspect} must respond to store and []=") { session.respond_to?(:store) && session.respond_to?(:[]=) @@ -183,50 +183,50 @@ module Rack ## There are the following restrictions: ## * <tt>rack.version</tt> must be an array of Integers. - assert("rack.version must be an Array, was #{env["rack.version"].class}") { - env["rack.version"].instance_of? Array + assert("rack.version must be an Array, was #{env[Const::RACK_VERSION].class}") { + env[Const::RACK_VERSION].instance_of? Array } ## * <tt>rack.url_scheme</tt> must either be +http+ or +https+. - assert("rack.url_scheme unknown: #{env["rack.url_scheme"].inspect}") { - %w[http https].include? env["rack.url_scheme"] + assert("rack.url_scheme unknown: #{env[Const::RACK_URL_SCHEME].inspect}") { + %w[http https].include? env[Const::RACK_URL_SCHEME] } ## * There must be a valid input stream in <tt>rack.input</tt>. - check_input env["rack.input"] + check_input env[Const::RACK_INPUT] ## * There must be a valid error stream in <tt>rack.errors</tt>. - check_error env["rack.errors"] + check_error env[Const::RACK_ERRORS] ## * The <tt>REQUEST_METHOD</tt> must be a valid token. - assert("REQUEST_METHOD unknown: #{env["REQUEST_METHOD"]}") { - env["REQUEST_METHOD"] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/ + assert("REQUEST_METHOD unknown: #{env[Const::ENV_REQUEST_METHOD]}") { + env[Const::ENV_REQUEST_METHOD] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/ } ## * The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt> assert("SCRIPT_NAME must start with /") { - !env.include?("SCRIPT_NAME") || - env["SCRIPT_NAME"] == "" || - env["SCRIPT_NAME"] =~ /\A\// + !env.include?(Const::ENV_SCRIPT_NAME) || + env[Const::ENV_SCRIPT_NAME] == "" || + env[Const::ENV_SCRIPT_NAME] =~ /\A\// } ## * The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt> assert("PATH_INFO must start with /") { - !env.include?("PATH_INFO") || - env["PATH_INFO"] == "" || - env["PATH_INFO"] =~ /\A\// + !env.include?(Const::ENV_PATH_INFO) || + env[Const::ENV_PATH_INFO] == "" || + env[Const::ENV_PATH_INFO] =~ /\A\// } ## * The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only. - assert("Invalid CONTENT_LENGTH: #{env["CONTENT_LENGTH"]}") { - !env.include?("CONTENT_LENGTH") || env["CONTENT_LENGTH"] =~ /\A\d+\z/ + assert("Invalid CONTENT_LENGTH: #{env[Const::ENV_CONTENT_LENGTH]}") { + !env.include?(Const::ENV_CONTENT_LENGTH) || env[Const::ENV_CONTENT_LENGTH] =~ /\A\d+\z/ } ## * One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be ## set. <tt>PATH_INFO</tt> should be <tt>/</tt> if ## <tt>SCRIPT_NAME</tt> is empty. assert("One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)") { - env["SCRIPT_NAME"] || env["PATH_INFO"] + env[Const::ENV_SCRIPT_NAME] || env[Const::ENV_PATH_INFO] } ## <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty. assert("SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'") { - env["SCRIPT_NAME"] != "/" + env[Const::ENV_SCRIPT_NAME] != "/" } end @@ -474,7 +474,7 @@ module Rack bytes += Rack::Utils.bytesize(part) } - if env["REQUEST_METHOD"] == "HEAD" + if env[Const::ENV_REQUEST_METHOD] == Const::HEAD assert("Response body was given for HEAD request, but should be empty") { bytes == 0 } diff --git a/lib/rack/lobster.rb b/lib/rack/lobster.rb index f63f419a..a434b850 100644 --- a/lib/rack/lobster.rb +++ b/lib/rack/lobster.rb @@ -12,7 +12,7 @@ module Rack I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0]) LambdaLobster = lambda { |env| - if env["QUERY_STRING"].include?("flip") + if env[Const::ENV_QUERY_STRING].include?("flip") lobster = LobsterString.split("\n"). map { |line| line.ljust(42).reverse }. join("\n") @@ -26,7 +26,7 @@ module Rack "<pre>", lobster, "</pre>", "<a href='#{href}'>flip!</a>"] length = content.inject(0) { |a,e| a+e.size }.to_s - [200, {"Content-Type" => "text/html", "Content-Length" => length}, content] + [200, {Const::CONTENT_TYPE => "text/html", Const::CONTENT_LENGTH => length}, content] } def call(env) diff --git a/lib/rack/lock.rb b/lib/rack/lock.rb index 93238528..aa0cf7fd 100644 --- a/lib/rack/lock.rb +++ b/lib/rack/lock.rb @@ -1,6 +1,6 @@ module Rack class Lock - FLAG = 'rack.multithread'.freeze + FLAG = Const::RACK_MULTITHREAD.freeze def initialize(app, lock = Mutex.new) @app, @lock = app, lock diff --git a/lib/rack/methodoverride.rb b/lib/rack/methodoverride.rb index 0eed29f4..e0dd1baa 100644 --- a/lib/rack/methodoverride.rb +++ b/lib/rack/methodoverride.rb @@ -10,14 +10,14 @@ module Rack end def call(env) - if env["REQUEST_METHOD"] == "POST" + if env[Const::ENV_REQUEST_METHOD] == Const::POST req = Request.new(env) method = req.POST[METHOD_OVERRIDE_PARAM_KEY] || env[HTTP_METHOD_OVERRIDE_HEADER] method = method.to_s.upcase if HTTP_METHODS.include?(method) - env["rack.methodoverride.original_method"] = env["REQUEST_METHOD"] - env["REQUEST_METHOD"] = method + env["rack.methodoverride.original_method"] = env[Const::ENV_REQUEST_METHOD] + env[Const::ENV_REQUEST_METHOD] = method end end diff --git a/lib/rack/mock.rb b/lib/rack/mock.rb index 7964c447..a4f89dd9 100644 --- a/lib/rack/mock.rb +++ b/lib/rack/mock.rb @@ -1,5 +1,6 @@ require 'uri' require 'stringio' +require 'rack/constants' require 'rack/lint' require 'rack/utils' require 'rack/response' @@ -40,24 +41,24 @@ module Rack end DEFAULT_ENV = { - "rack.version" => [1,0], - "rack.input" => StringIO.new, - "rack.errors" => StringIO.new, - "rack.multithread" => true, - "rack.multiprocess" => true, - "rack.run_once" => false, + Const::RACK_VERSION => [1,0], + Const::RACK_INPUT => StringIO.new, + Const::RACK_ERRORS => StringIO.new, + Const::RACK_MULTITHREAD => true, + Const::RACK_MULTIPROCESS => true, + Const::RACK_RUN_ONCE => false, } def initialize(app) @app = app end - def get(uri, opts={}) request("GET", uri, opts) end - def post(uri, opts={}) request("POST", uri, opts) end - def put(uri, opts={}) request("PUT", uri, opts) end - def delete(uri, opts={}) request("DELETE", uri, opts) end + def get(uri, opts={}) request(Const::GET, uri, opts) end + def post(uri, opts={}) request(Const::POST, uri, opts) end + def put(uri, opts={}) request(Const::PUT, uri, opts) end + def delete(uri, opts={}) request(Const::DELETE, uri, opts) end - def request(method="GET", uri="", opts={}) + def request(method=Const::GET, uri="", opts={}) env = self.class.env_for(uri, opts.merge(:method => method)) if opts[:lint] @@ -66,7 +67,7 @@ module Rack app = @app end - errors = env["rack.errors"] + errors = env[Const::RACK_ERRORS] MockResponse.new(*(app.call(env) + [errors])) end @@ -77,34 +78,34 @@ module Rack env = DEFAULT_ENV.dup - env["REQUEST_METHOD"] = opts[:method] ? opts[:method].to_s.upcase : "GET" - env["SERVER_NAME"] = uri.host || "example.org" - env["SERVER_PORT"] = uri.port ? uri.port.to_s : "80" - env["QUERY_STRING"] = uri.query.to_s - env["PATH_INFO"] = (!uri.path || uri.path.empty?) ? "/" : uri.path - env["rack.url_scheme"] = uri.scheme || "http" - env["HTTPS"] = env["rack.url_scheme"] == "https" ? "on" : "off" + env[Const::ENV_REQUEST_METHOD] = opts[:method] ? opts[:method].to_s.upcase : Const::GET + env[Const::ENV_SERVER_NAME] = uri.host || "example.org" + env[Const::ENV_SERVER_PORT] = uri.port ? uri.port.to_s : "80" + env[Const::ENV_QUERY_STRING] = uri.query.to_s + env[Const::ENV_PATH_INFO] = (!uri.path || uri.path.empty?) ? "/" : uri.path + env[Const::RACK_URL_SCHEME] = uri.scheme || "http" + env[Const::ENV_HTTPS] = env[Const::RACK_URL_SCHEME] == "https" ? "on" : "off" - env["SCRIPT_NAME"] = opts[:script_name] || "" + env[Const::ENV_SCRIPT_NAME] = opts[:script_name] || "" if opts[:fatal] - env["rack.errors"] = FatalWarner.new + env[Const::RACK_ERRORS] = FatalWarner.new else - env["rack.errors"] = StringIO.new + env[Const::RACK_ERRORS] = StringIO.new end if params = opts[:params] - if env["REQUEST_METHOD"] == "GET" + if env[Const::ENV_REQUEST_METHOD] == Const::GET params = Utils.parse_nested_query(params) if params.is_a?(String) - params.update(Utils.parse_nested_query(env["QUERY_STRING"])) - env["QUERY_STRING"] = Utils.build_nested_query(params) + params.update(Utils.parse_nested_query(env[Const::ENV_QUERY_STRING])) + env[Const::ENV_QUERY_STRING] = Utils.build_nested_query(params) elsif !opts.has_key?(:input) - opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded" + opts[Const::ENV_CONTENT_TYPE] = "application/x-www-form-urlencoded" if params.is_a?(Hash) if data = Utils::Multipart.build_multipart(params) opts[:input] = data - opts["CONTENT_LENGTH"] ||= data.length.to_s - opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Utils::Multipart::MULTIPART_BOUNDARY}" + opts[Const::ENV_CONTENT_LENGTH] ||= data.length.to_s + opts[Const::ENV_CONTENT_TYPE] = "multipart/form-data; boundary=#{Utils::Multipart::MULTIPART_BOUNDARY}" else opts[:input] = Utils.build_nested_query(params) end @@ -124,9 +125,9 @@ module Rack end rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env['rack.input'] = rack_input + env[Const::RACK_INPUT] = rack_input - env["CONTENT_LENGTH"] ||= env["rack.input"].length.to_s + env[Const::ENV_CONTENT_LENGTH] ||= env[Const::RACK_INPUT].length.to_s opts.each { |field, value| env[field] = value if String === field diff --git a/lib/rack/recursive.rb b/lib/rack/recursive.rb index bf8b9659..d6c9a777 100644 --- a/lib/rack/recursive.rb +++ b/lib/rack/recursive.rb @@ -14,11 +14,11 @@ module Rack @url = URI(url) @env = env - @env["PATH_INFO"] = @url.path - @env["QUERY_STRING"] = @url.query if @url.query - @env["HTTP_HOST"] = @url.host if @url.host - @env["HTTP_PORT"] = @url.port if @url.port - @env["rack.url_scheme"] = @url.scheme if @url.scheme + @env[Const::ENV_PATH_INFO] = @url.path + @env[Const::ENV_QUERY_STRING] = @url.query if @url.query + @env[Const::ENV_HTTP_HOST] = @url.host if @url.host + @env[Const::ENV_HTTP_PORT] = @url.port if @url.port + @env[Const::RACK_URL_SCHEME] = @url.scheme if @url.scheme super "forwarding to #{url}" end @@ -35,7 +35,7 @@ module Rack end def call(env) - @script_name = env["SCRIPT_NAME"] + @script_name = env[Const::ENV_SCRIPT_NAME] @app.call(env.merge('rack.recursive.include' => method(:include))) rescue ForwardRequest => req call(env.merge(req.env)) @@ -47,10 +47,10 @@ module Rack raise ArgumentError, "can only include below #{@script_name}, not #{path}" end - env = env.merge("PATH_INFO" => path, "SCRIPT_NAME" => @script_name, - "REQUEST_METHOD" => "GET", - "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "", - "rack.input" => StringIO.new("")) + env = env.merge(Const::ENV_PATH_INFO => path, Const::ENV_SCRIPT_NAME => @script_name, + Const::ENV_REQUEST_METHOD => Const::GET, + Const::ENV_CONTENT_LENGTH => "0", Const::ENV_CONTENT_TYPE => "", + Const::RACK_INPUT => StringIO.new("")) @app.call(env) end end diff --git a/lib/rack/request.rb b/lib/rack/request.rb index 248ce18d..5188fc16 100644 --- a/lib/rack/request.rb +++ b/lib/rack/request.rb @@ -21,17 +21,17 @@ module Rack @env = env end - def body; @env["rack.input"] end - def scheme; @env["rack.url_scheme"] end - def script_name; @env["SCRIPT_NAME"].to_s end - def path_info; @env["PATH_INFO"].to_s end - def port; @env["SERVER_PORT"].to_i end - def request_method; @env["REQUEST_METHOD"] end - def query_string; @env["QUERY_STRING"].to_s end - def content_length; @env['CONTENT_LENGTH'] end - def content_type; @env['CONTENT_TYPE'] end - def session; @env['rack.session'] ||= {} end - def session_options; @env['rack.session.options'] ||= {} end + def body; @env[Const::RACK_INPUT] end + def scheme; @env[Const::RACK_URL_SCHEME] end + def script_name; @env[Const::ENV_SCRIPT_NAME].to_s end + def path_info; @env[Const::ENV_PATH_INFO].to_s end + def port; @env[Const::ENV_SERVER_PORT].to_i end + def request_method; @env[Const::ENV_REQUEST_METHOD] end + def query_string; @env[Const::ENV_QUERY_STRING].to_s end + def content_length; @env[Const::ENV_CONTENT_LENGTH] end + def content_type; @env[Const::ENV_CONTENT_TYPE] end + def session; @env[Const::RACK_SESSION] ||= {} end + def session_options; @env[Const::RACK_SESSION_OPTIONS] ||= {} end # The media type (type/subtype) portion of the CONTENT_TYPE header # without any media type parameters. e.g., when CONTENT_TYPE is @@ -65,17 +65,17 @@ module Rack def host # Remove port number. - (@env["HTTP_HOST"] || @env["SERVER_NAME"]).to_s.gsub(/:\d+\z/, '') + (@env[Const::ENV_HTTP_HOST] || @env[Const::ENV_SERVER_NAME]).to_s.gsub(/:\d+\z/, '') end - def script_name=(s); @env["SCRIPT_NAME"] = s.to_s end - def path_info=(s); @env["PATH_INFO"] = s.to_s end + def script_name=(s); @env[Const::ENV_SCRIPT_NAME] = s.to_s end + def path_info=(s); @env[Const::ENV_PATH_INFO] = s.to_s end - def get?; request_method == "GET" end - def post?; request_method == "POST" end - def put?; request_method == "PUT" end - def delete?; request_method == "DELETE" end - def head?; request_method == "HEAD" end + def get?; request_method == Const::GET end + def post?; request_method == Const::POST end + def put?; request_method == Const::PUT end + def delete?; request_method == Const::DELETE end + def head?; request_method == Const::HEAD end # The set of form-data media-types. Requests that do not indicate # one of the media types presents in this list will not be eligible @@ -109,41 +109,46 @@ module Rack PARSEABLE_DATA_MEDIA_TYPES.include?(media_type) end + QUERY_STRING = 'rack.request.query_string'.freeze + QUERY_HASH = 'rack.request.query_hash'.freeze + # Returns the data recieved in the query string. def GET - if @env["rack.request.query_string"] == query_string - @env["rack.request.query_hash"] + if @env[QUERY_STRING] == query_string + @env[QUERY_HASH] else - @env["rack.request.query_string"] = query_string - @env["rack.request.query_hash"] = - Utils.parse_nested_query(query_string) + @env[QUERY_STRING] = query_string + @env[QUERY_HASH] = Utils.parse_nested_query(query_string) end end + FORM_INPUT = 'rack.request.form_input'.freeze + FORM_HASH = 'rack.request.form_hash'.freeze + FORM_VARS = 'rack.request.form_vars'.freeze + # Returns the data recieved in the request body. # # This method support both application/x-www-form-urlencoded and # multipart/form-data. def POST - if @env["rack.input"].nil? + if @env[Const::RACK_INPUT].nil? raise "Missing rack.input" - elsif @env["rack.request.form_input"].eql? @env["rack.input"] - @env["rack.request.form_hash"] + elsif @env[FORM_INPUT].eql? @env[Const::RACK_INPUT] + @env[FORM_HASH] elsif form_data? || parseable_data? - @env["rack.request.form_input"] = @env["rack.input"] - unless @env["rack.request.form_hash"] = - Utils::Multipart.parse_multipart(env) - form_vars = @env["rack.input"].read + @env[FORM_INPUT] = @env[Const::RACK_INPUT] + unless @env[FORM_HASH] = Utils::Multipart.parse_multipart(env) + form_vars = @env[Const::RACK_INPUT].read # Fix for Safari Ajax postings that always append \0 form_vars.sub!(/\0\z/, '') - @env["rack.request.form_vars"] = form_vars - @env["rack.request.form_hash"] = Utils.parse_nested_query(form_vars) + @env[FORM_VARS] = form_vars + @env[FORM_HASH] = Utils.parse_nested_query(form_vars) - @env["rack.input"].rewind + @env[Const::RACK_INPUT].rewind end - @env["rack.request.form_hash"] + @env[FORM_HASH] else {} end @@ -173,25 +178,28 @@ module Rack # the referer of the client or '/' def referer - @env['HTTP_REFERER'] || '/' + @env[Const::ENV_HTTP_REFERER] || '/' end alias referrer referer + COOKIE_STRING = 'rack.request.cookie_string'.freeze + COOKIE_HASH = 'rack.request.cookie_hash'.freeze + def cookies - return {} unless @env["HTTP_COOKIE"] + return {} unless @env[Const::ENV_HTTP_COOKIE] - if @env["rack.request.cookie_string"] == @env["HTTP_COOKIE"] - @env["rack.request.cookie_hash"] + if @env[COOKIE_STRING] == @env[Const::ENV_HTTP_COOKIE] + @env[COOKIE_HASH] else - @env["rack.request.cookie_string"] = @env["HTTP_COOKIE"] + @env[COOKIE_STRING] = @env[Const::ENV_HTTP_COOKIE] # According to RFC 2109: # If multiple cookies satisfy the criteria above, they are ordered in # the Cookie header such that those with more specific Path attributes # precede those with less specific. Ordering with respect to other # attributes (e.g., Domain) is unspecified. - @env["rack.request.cookie_hash"] = - Utils.parse_query(@env["rack.request.cookie_string"], ';,').inject({}) {|h,(k,v)| + @env[COOKIE_HASH] = + Utils.parse_query(@env[COOKIE_STRING], ';,').inject({}) {|h,(k,v)| h[k] = Array === v ? v.first : v h } @@ -199,7 +207,7 @@ module Rack end def xhr? - @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" + @env[Const::ENV_HTTP_X_REQUESTED_WITH] == "XMLHttpRequest" end # Tries to return a remake of the original request URL as a string. @@ -226,7 +234,7 @@ module Rack end def accept_encoding - @env["HTTP_ACCEPT_ENCODING"].to_s.split(/,\s*/).map do |part| + @env[Const::ENV_HTTP_ACCEPT_ENCODING].to_s.split(/,\s*/).map do |part| m = /^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$/.match(part) # From WEBrick if m @@ -238,10 +246,10 @@ module Rack end def ip - if addr = @env['HTTP_X_FORWARDED_FOR'] + if addr = @env[Const::ENV_HTTP_X_FORWARDED_FOR] addr.split(',').last.strip else - @env['REMOTE_ADDR'] + @env[Const::ENV_REMOTE_ADDR] end end end diff --git a/lib/rack/response.rb b/lib/rack/response.rb index d1f6a123..70d3e83e 100644 --- a/lib/rack/response.rb +++ b/lib/rack/response.rb @@ -20,7 +20,7 @@ module Rack def initialize(body=[], status=200, header={}, &block) @status = status - @header = Utils::HeaderHash.new({"Content-Type" => "text/html"}. + @header = Utils::HeaderHash.new({Const::CONTENT_TYPE => "text/html"}. merge(header)) @writer = lambda { |x| @body << x } @@ -70,7 +70,7 @@ module Rack @block = block if [204, 304].include?(status.to_i) - header.delete "Content-Type" + header.delete Const::CONTENT_TYPE [status.to_i, header.to_hash, []] else [status.to_i, header.to_hash, self] @@ -93,7 +93,7 @@ module Rack @length += Rack::Utils.bytesize(s) @writer.call s - header["Content-Length"] = @length.to_s + header[Const::CONTENT_LENGTH] = @length.to_s str end @@ -131,11 +131,11 @@ module Rack end def content_type - headers["Content-Type"] + headers[Const::CONTENT_TYPE] end def content_length - cl = headers["Content-Length"] + cl = headers[Const::CONTENT_LENGTH] cl ? cl.to_i : cl end diff --git a/lib/rack/session/abstract/id.rb b/lib/rack/session/abstract/id.rb index 98746705..ece97b52 100644 --- a/lib/rack/session/abstract/id.rb +++ b/lib/rack/session/abstract/id.rb @@ -18,7 +18,7 @@ module Rack # # All parameters are optional. # * :key determines the name of the cookie, by default it is - # 'rack.session' + # Const::RACK_SESSION # * :path, :domain, :expire_after, :secure, and :httponly set the related # cookie options as by Rack::Response#add_cookie # * :defer will not set a cookie in the response. @@ -29,7 +29,7 @@ module Rack # id will be. # # These options can be set on a per request basis, at the location of - # env['rack.session.options']. Additionally the id of the session can be + # env[Const::RACK_SESSION_OPTIONS]. Additionally the id of the session can be # found within the options hash at the key :id. It is highly not # recommended to change its value. # @@ -50,7 +50,7 @@ module Rack attr_reader :key, :default_options def initialize(app, options={}) @app = app - @key = options[:key] || "rack.session" + @key = options[:key] || Const::RACK_SESSION @default_options = self.class::DEFAULT_OPTIONS.merge(options) end @@ -77,8 +77,8 @@ module Rack # Extracts the session id from provided cookies and passes it and the # environment to #get_session. It then sets the resulting session into - # 'rack.session', and places options and session metadata into - # 'rack.session.options'. + # Const::RACK_SESSION, and places options and session metadata into + # Const::RACK_SESSION_OPTIONS. def load_session(env) request = Rack::Request.new(env) @@ -86,12 +86,12 @@ module Rack begin session_id, session = get_session(env, session_id) - env['rack.session'] = session + env[Const::RACK_SESSION] = session rescue - env['rack.session'] = Hash.new + env[Const::RACK_SESSION] = Hash.new end - env['rack.session.options'] = @default_options. + env[Const::RACK_SESSION_OPTIONS] = @default_options. merge(:id => session_id) end @@ -101,14 +101,14 @@ module Rack # response with the session's id. def commit_session(env, status, headers, body) - session = env['rack.session'] - options = env['rack.session.options'] + session = env[Const::RACK_SESSION] + options = env[Const::RACK_SESSION_OPTIONS] session_id = options[:id] if not session_id = set_session(env, session_id, session, options) - env["rack.errors"].puts("Warning! #{self.class.name} failed to save session. Content dropped.") + env[Const::RACK_ERRORS].puts("Warning! #{self.class.name} failed to save session. Content dropped.") elsif options[:defer] and not options[:renew] - env["rack.errors"].puts("Defering cookie for #{session_id}") if $VERBOSE + env[Const::RACK_ERRORS].puts("Defering cookie for #{session_id}") if $VERBOSE else cookie = Hash.new cookie[:value] = session_id diff --git a/lib/rack/session/cookie.rb b/lib/rack/session/cookie.rb index 240e6c8d..9b742a8b 100644 --- a/lib/rack/session/cookie.rb +++ b/lib/rack/session/cookie.rb @@ -13,7 +13,7 @@ module Rack # # Example: # - # use Rack::Session::Cookie, :key => 'rack.session', + # use Rack::Session::Cookie, :key => Const::RACK_SESSION, # :domain => 'foo.com', # :path => '/', # :expire_after => 2592000, @@ -25,7 +25,7 @@ module Rack def initialize(app, options={}) @app = app - @key = options[:key] || "rack.session" + @key = options[:key] || Const::RACK_SESSION @secret = options[:secret] @default_options = {:domain => nil, :path => "/", @@ -52,16 +52,16 @@ module Rack begin session_data = session_data.unpack("m*").first session_data = Marshal.load(session_data) - env["rack.session"] = session_data + env[Const::RACK_SESSION] = session_data rescue - env["rack.session"] = Hash.new + env[Const::RACK_SESSION] = Hash.new end - env["rack.session.options"] = @default_options.dup + env[Const::RACK_SESSION_OPTIONS] = @default_options.dup end def commit_session(env, status, headers, body) - session_data = Marshal.dump(env["rack.session"]) + session_data = Marshal.dump(env[Const::RACK_SESSION]) session_data = [session_data].pack("m*") if @secret @@ -69,9 +69,9 @@ module Rack end if session_data.size > (4096 - @key.size) - env["rack.errors"].puts("Warning! Rack::Session::Cookie data size exceeds 4K. Content dropped.") + env[Const::RACK_ERRORS].puts("Warning! Rack::Session::Cookie data size exceeds 4K. Content dropped.") else - options = env["rack.session.options"] + options = env[Const::RACK_SESSION_OPTIONS] cookie = Hash.new cookie[:value] = session_data cookie[:expires] = Time.now + options[:expire_after] unless options[:expire_after].nil? diff --git a/lib/rack/session/memcache.rb b/lib/rack/session/memcache.rb index 4a65cbf3..220ac937 100644 --- a/lib/rack/session/memcache.rb +++ b/lib/rack/session/memcache.rb @@ -43,9 +43,9 @@ module Rack def get_session(env, sid) session = @pool.get(sid) if sid - @mutex.lock if env['rack.multithread'] + @mutex.lock if env[Const::RACK_MULTITHREAD] unless sid and session - env['rack.errors'].puts("Session '#{sid.inspect}' not found, initializing...") if $VERBOSE and not sid.nil? + env[Const::RACK_ERRORS].puts("Session '#{sid.inspect}' not found, initializing...") if $VERBOSE and not sid.nil? session = {} sid = generate_sid ret = @pool.add sid, session @@ -58,14 +58,14 @@ module Rack warn $!.inspect return [ nil, {} ] ensure - @mutex.unlock if env['rack.multithread'] + @mutex.unlock if env[Const::RACK_MULTITHREAD] end def set_session(env, session_id, new_session, options) expiry = options[:expire_after] expiry = expiry.nil? ? 0 : expiry + 1 - @mutex.lock if env['rack.multithread'] + @mutex.lock if env[Const::RACK_MULTITHREAD] session = @pool.get(session_id) || {} if options[:renew] or options[:drop] @pool.delete session_id @@ -82,7 +82,7 @@ module Rack warn $!.inspect return false ensure - @mutex.unlock if env['rack.multithread'] + @mutex.unlock if env[Const::RACK_MULTITHREAD] end private diff --git a/lib/rack/session/pool.rb b/lib/rack/session/pool.rb index f6f87408..872bc601 100644 --- a/lib/rack/session/pool.rb +++ b/lib/rack/session/pool.rb @@ -43,9 +43,9 @@ module Rack def get_session(env, sid) session = @pool[sid] if sid - @mutex.lock if env['rack.multithread'] + @mutex.lock if env[Const::RACK_MULTITHREAD] unless sid and session - env['rack.errors'].puts("Session '#{sid.inspect}' not found, initializing...") if $VERBOSE and not sid.nil? + env[Const::RACK_ERRORS].puts("Session '#{sid.inspect}' not found, initializing...") if $VERBOSE and not sid.nil? session = {} sid = generate_sid @pool.store sid, session @@ -53,11 +53,11 @@ module Rack session.instance_variable_set('@old', {}.merge(session)) return [sid, session] ensure - @mutex.unlock if env['rack.multithread'] + @mutex.unlock if env[Const::RACK_MULTITHREAD] end def set_session(env, session_id, new_session, options) - @mutex.lock if env['rack.multithread'] + @mutex.lock if env[Const::RACK_MULTITHREAD] session = @pool[session_id] if options[:renew] or options[:drop] @pool.delete session_id @@ -73,7 +73,7 @@ module Rack warn "#{new_session.inspect} has been lost." warn $!.inspect ensure - @mutex.unlock if env['rack.multithread'] + @mutex.unlock if env[Const::RACK_MULTITHREAD] end private diff --git a/lib/rack/showexceptions.rb b/lib/rack/showexceptions.rb index 697bc41f..ba604af0 100644 --- a/lib/rack/showexceptions.rb +++ b/lib/rack/showexceptions.rb @@ -25,8 +25,8 @@ module Rack rescue StandardError, LoadError, SyntaxError => e backtrace = pretty(env, e) [500, - {"Content-Type" => "text/html", - "Content-Length" => backtrace.join.size.to_s}, + {Const::CONTENT_TYPE => "text/html", + Const::CONTENT_LENGTH => backtrace.join.size.to_s}, backtrace] end @@ -58,9 +58,9 @@ module Rack end }.compact - env["rack.errors"].puts "#{exception.class}: #{exception.message}" - env["rack.errors"].puts exception.backtrace.map { |l| "\t" + l } - env["rack.errors"].flush + env[Const::RACK_ERRORS].puts "#{exception.class}: #{exception.message}" + env[Const::RACK_ERRORS].puts exception.backtrace.map { |l| "\t" + l } + env[Const::RACK_ERRORS].flush [@template.result(binding)] end diff --git a/lib/rack/showstatus.rb b/lib/rack/showstatus.rb index 28258c7c..f2ead40f 100644 --- a/lib/rack/showstatus.rb +++ b/lib/rack/showstatus.rb @@ -19,7 +19,7 @@ module Rack def call(env) status, headers, body = @app.call(env) headers = Utils::HeaderHash.new(headers) - empty = headers['Content-Length'].to_i <= 0 + empty = headers[Const::CONTENT_LENGTH].to_i <= 0 # client or server error, or explicit message if (status.to_i >= 400 && empty) || env["rack.showstatus.detail"] @@ -28,7 +28,7 @@ module Rack detail = env["rack.showstatus.detail"] || message body = @template.result(binding) size = Rack::Utils.bytesize(body) - [status, headers.merge("Content-Type" => "text/html", "Content-Length" => size.to_s), [body]] + [status, headers.merge(Const::CONTENT_TYPE => "text/html", Const::CONTENT_LENGTH => size.to_s), [body]] else [status, headers, body] end diff --git a/lib/rack/static.rb b/lib/rack/static.rb index 168e8f83..d88d7f14 100644 --- a/lib/rack/static.rb +++ b/lib/rack/static.rb @@ -24,7 +24,7 @@ module Rack end def call(env) - path = env["PATH_INFO"] + path = env[Const::ENV_PATH_INFO] can_serve = @urls.any? { |url| path.index(url) == 0 } if can_serve diff --git a/lib/rack/urlmap.rb b/lib/rack/urlmap.rb index fcf6616c..0b80a7e5 100644 --- a/lib/rack/urlmap.rb +++ b/lib/rack/urlmap.rb @@ -34,9 +34,9 @@ module Rack end def call(env) - path = env["PATH_INFO"].to_s.squeeze("/") - script_name = env['SCRIPT_NAME'] - hHost, sName, sPort = env.values_at('HTTP_HOST','SERVER_NAME','SERVER_PORT') + path = env[Const::ENV_PATH_INFO].to_s.squeeze("/") + script_name = env[Const::ENV_SCRIPT_NAME] + hHost, sName, sPort = env.values_at(Const::ENV_HTTP_HOST, Const::ENV_SERVER_NAME, Const::ENV_SERVER_PORT) @mapping.each { |host, location, app| next unless (hHost == host || sName == host \ || (host.nil? && (hHost == sName || hHost == sName+':'+sPort))) @@ -45,11 +45,10 @@ module Rack return app.call( env.merge( - 'SCRIPT_NAME' => (script_name + location), - 'PATH_INFO' => path[location.size..-1])) + Const::ENV_SCRIPT_NAME => (script_name + location), + Const::ENV_PATH_INFO => path[location.size..-1])) } - [404, {"Content-Type" => "text/plain"}, ["Not Found: #{path}"]] + [404, {Const::CONTENT_TYPE => "text/plain"}, ["Not Found: #{path}"]] end end end - diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb index 55f01f3b..1118730a 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -401,7 +401,7 @@ module Rack MULTIPART_BOUNDARY = "AaB03x" def self.parse_multipart(env) - unless env['CONTENT_TYPE'] =~ + unless env[Const::ENV_CONTENT_TYPE] =~ %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|n nil else @@ -409,8 +409,8 @@ module Rack params = {} buf = "" - content_length = env['CONTENT_LENGTH'].to_i - input = env['rack.input'] + content_length = env[Const::ENV_CONTENT_LENGTH].to_i + input = env[Const::RACK_INPUT] input.rewind boundary_size = Utils.bytesize(boundary) + EOL.size |