From 5cc047e0ecad8ff225a58e41b3d43b4820c4e7ae Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 29 Dec 2008 23:30:51 -0600 Subject: [PATCH] Add common HTTP strings to Rack::Const --- lib/rack.rb | 1 + lib/rack/adapter/camping.rb | 6 +- lib/rack/auth/basic.rb | 2 +- lib/rack/auth/digest/md5.rb | 2 +- lib/rack/auth/digest/request.rb | 4 +- lib/rack/auth/openid.rb | 12 +++--- lib/rack/commonlogger.rb | 16 ++++---- lib/rack/conditionalget.rb | 6 +- lib/rack/constants.rb | 40 +++++++++++++++++++ lib/rack/directory.rb | 2 +- lib/rack/file.rb | 4 +- lib/rack/handler/cgi.rb | 24 ++++++------ lib/rack/handler/fastcgi.rb | 30 +++++++------- lib/rack/handler/lsws.rb | 24 ++++++------ lib/rack/handler/mongrel.rb | 24 ++++++------ lib/rack/handler/scgi.rb | 28 +++++++------- lib/rack/handler/webrick.rb | 22 +++++----- lib/rack/head.rb | 2 +- lib/rack/lint.rb | 42 ++++++++++---------- lib/rack/lobster.rb | 2 +- lib/rack/methodoverride.rb | 4 +- lib/rack/mock.rb | 37 +++++++++--------- lib/rack/recursive.rb | 20 +++++----- lib/rack/reloader.rb | 2 +- lib/rack/request.rb | 81 +++++++++++++++++++++------------------ lib/rack/session/abstract/id.rb | 2 +- lib/rack/session/cookie.rb | 2 +- lib/rack/session/memcache.rb | 2 +- lib/rack/session/pool.rb | 2 +- lib/rack/showexceptions.rb | 6 +- lib/rack/static.rb | 2 +- lib/rack/urlmap.rb | 8 ++-- lib/rack/utils.rb | 6 +- 33 files changed, 258 insertions(+), 209 deletions(-) create mode 100644 lib/rack/constants.rb diff --git a/lib/rack.rb b/lib/rack.rb index 59e0128..40580eb 100644 --- a/lib/rack.rb +++ b/lib/rack.rb @@ -30,6 +30,7 @@ module Rack autoload :Cascade, "rack/cascade" autoload :CommonLogger, "rack/commonlogger" autoload :ConditionalGet, "rack/conditionalget" + autoload :Const, "rack/constants" autoload :ContentLength, "rack/content_length" autoload :File, "rack/file" autoload :Deflater, "rack/deflater" diff --git a/lib/rack/adapter/camping.rb b/lib/rack/adapter/camping.rb index 63bc787..190b329 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::PATH_INFO] ||= "" + env[Const::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/basic.rb b/lib/rack/auth/basic.rb index 9557224..76f6f19 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::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 6d2bd29..c5c36b2 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::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 a022754..efbff8a 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['REQUEST_METHOD'] + @env[Const::REQUEST_METHOD] end def digest? @@ -16,7 +16,7 @@ module Rack end def correct_uri? - @env['PATH_INFO'] == uri + @env[Const::PATH_INFO] == uri end def nonce diff --git a/lib/rack/auth/openid.rb b/lib/rack/auth/openid.rb index 2bd064e..124e598 100644 --- a/lib/rack/auth/openid.rb +++ b/lib/rack/auth/openid.rb @@ -216,18 +216,18 @@ module Rack elsif request.params[@options[:openid_param]] check consumer, session, request else - env['rack.errors'].puts "No valid params provided." + env[Const::RACK_ERRORS].puts "No valid params provided." bad_request end rescue NoSession - env['rack.errors'].puts($!.message, *$@) + env[Const::RACK_ERRORS].puts($!.message, *$@) @options. ### Missing or incompatible session fetch :no_session, [ 500, {'Content-Type'=>'text/plain'}, $!.message ] rescue - env['rack.errors'].puts($!.message, *$@) + env[Const::RACK_ERRORS].puts($!.message, *$@) if not @options[:catch_error] raise($!) @@ -253,7 +253,7 @@ module Rack pp oid if $DEBUG req.env['rack.auth.openid.request'] = oid - session[:site_return] ||= req.env['HTTP_REFERER'] + session[:site_return] ||= req.env[Const::HTTP_REFERER] # SETUP_NEEDED check! # see OpenID::Consumer::CheckIDRequest docs @@ -285,7 +285,7 @@ module Rack end rescue ::OpenID::DiscoveryFailure => e # thrown from inside OpenID::Consumer#begin by yadis stuff - req.env['rack.errors'].puts($!.message, *$@) + req.env[Const::RACK_ERRORS].puts($!.message, *$@) @options. ### Foreign server failed fetch :auth_fail, [ 503, @@ -341,7 +341,7 @@ module Rack when ::OpenID::Consumer::FAILURE session.clear session['authenticated'] = false - req.env['rack.errors'].puts oid.message + req.env[Const::RACK_ERRORS].puts oid.message goto = @options[:login_fail] if @option.key? :login_fail body << "Authentication unsuccessful.\n" diff --git a/lib/rack/commonlogger.rb b/lib/rack/commonlogger.rb index 5e68ac6..6de1fb8 100644 --- a/lib/rack/commonlogger.rb +++ b/lib/rack/commonlogger.rb @@ -27,8 +27,8 @@ module Rack # By default, log to rack.errors. def <<(str) - @env["rack.errors"].write(str) - @env["rack.errors"].flush + @env[Const::RACK_ERRORS].write(str) + @env[Const::RACK_ERRORS].flush end def each @@ -45,13 +45,13 @@ module Rack # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % @logger << %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n} % [ - @env['HTTP_X_FORWARDED_FOR'] || @env["REMOTE_ADDR"] || "-", - @env["REMOTE_USER"] || "-", + @env[Const::HTTP_X_FORWARDED_FOR] || @env[Const::REMOTE_ADDR] || "-", + @env[Const::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::REQUEST_METHOD], + @env[Const::PATH_INFO], + @env[Const::QUERY_STRING].empty? ? "" : "?"+@env[Const::QUERY_STRING], + @env[Const::HTTP_VERSION], @status.to_s[0..3], (length.zero? ? "-" : length.to_s), @now - @time diff --git a/lib/rack/conditionalget.rb b/lib/rack/conditionalget.rb index e7eb586..bd3ea1c 100644 --- a/lib/rack/conditionalget.rb +++ b/lib/rack/conditionalget.rb @@ -18,7 +18,7 @@ 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::REQUEST_METHOD]) status, headers, body = @app.call(env) headers = Utils::HeaderHash.new(headers) @@ -31,12 +31,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::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 == env[Const::HTTP_IF_MODIFIED_SINCE] end end diff --git a/lib/rack/constants.rb b/lib/rack/constants.rb new file mode 100644 index 0000000..d85ef57 --- /dev/null +++ b/lib/rack/constants.rb @@ -0,0 +1,40 @@ +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 + + HTTP_ACCEPT_ENCODING = 'HTTP_ACCEPT_ENCODING'.freeze + HTTP_CONTENT_LENGTH = 'HTTP_CONTENT_LENGTH'.freeze + HTTP_CONTENT_TYPE = 'HTTP_CONTENT_TYPE'.freeze + HTTP_COOKIE = 'HTTP_COOKIE'.freeze + HTTP_HOST = 'HTTP_HOST'.freeze + HTTP_IF_MODIFIED_SINCE = 'HTTP_IF_MODIFIED_SINCE'.freeze + HTTP_IF_NONE_MATCH = 'HTTP_IF_NONE_MATCH'.freeze + HTTP_PORT = 'HTTP_PORT'.freeze + HTTP_REFERER = 'HTTP_REFERER'.freeze + HTTP_VERSION = 'HTTP_VERSION'.freeze + HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze + HTTP_X_REQUESTED_WITH = 'HTTP_X_REQUESTED_WITH'.freeze + + CONTENT_LENGTH = 'CONTENT_LENGTH'.freeze + CONTENT_TYPE = 'CONTENT_TYPE'.freeze + ETAG = 'Etag'.freeze + HTTPS = 'HTTPS'.freeze + PATH_INFO = 'PATH_INFO'.freeze + QUERY_STRING = 'QUERY_STRING'.freeze + REMOTE_ADDR = 'REMOTE_ADDR'.freeze + REMOTE_USER = 'REMOTE_USER'.freeze + REQUEST_METHOD = 'REQUEST_METHOD'.freeze + REQUEST_PATH = 'REQUEST_PATH'.freeze + REQUEST_URI = 'REQUEST_URI'.freeze + SCRIPT_NAME = 'SCRIPT_NAME'.freeze + SERVER_NAME = 'SERVER_NAME'.freeze + SERVER_PORT = 'SERVER_PORT'.freeze + SERVER_PROTOCOL = 'SERVER_PROTOCOL'.freeze + end +end diff --git a/lib/rack/directory.rb b/lib/rack/directory.rb index bbeb4a2..3cec222 100644 --- a/lib/rack/directory.rb +++ b/lib/rack/directory.rb @@ -54,7 +54,7 @@ table { width:100%%; } def _call(env) @env = env - @path_info, @script_name = env.values_at('PATH_INFO', 'SCRIPT_NAME') + @path_info, @script_name = env.values_at(Const::PATH_INFO, Const::SCRIPT_NAME) if forbidden = check_forbidden forbidden diff --git a/lib/rack/file.rb b/lib/rack/file.rb index 9e22b67..7dc68e7 100644 --- a/lib/rack/file.rb +++ b/lib/rack/file.rb @@ -23,9 +23,9 @@ module Rack F = ::File def _call(env) - return forbidden if env["PATH_INFO"].include? ".." + return forbidden if env[Const::PATH_INFO].include? ".." - @path = F.join(@root, Utils.unescape(env["PATH_INFO"])) + @path = F.join(@root, Utils.unescape(env[Const::PATH_INFO])) begin if F.file?(@path) && F.readable?(@path) diff --git a/lib/rack/handler/cgi.rb b/lib/rack/handler/cgi.rb index 1922402..23ee52d 100644 --- a/lib/rack/handler/cgi.rb +++ b/lib/rack/handler/cgi.rb @@ -7,24 +7,24 @@ module Rack def self.serve(app) env = ENV.to_hash - env.delete "HTTP_CONTENT_LENGTH" + env.delete Const::HTTP_CONTENT_LENGTH - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env[Const::SCRIPT_NAME] = "" if env[Const::SCRIPT_NAME] == "/" - env.update({"rack.version" => [0,1], - "rack.input" => STDIN, - "rack.errors" => STDERR, + env.update({ Const::RACK_VERSION => [0,1], + 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::HTTPS]) ? "https" : "http" }) - env["QUERY_STRING"] ||= "" - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["REQUEST_PATH"] ||= "/" + env[Const::QUERY_STRING] ||= "" + env[Const::HTTP_VERSION] ||= env[Const::SERVER_PROTOCOL] + env[Const::REQUEST_PATH] ||= "/" status, headers, body = app.call(env) begin diff --git a/lib/rack/handler/fastcgi.rb b/lib/rack/handler/fastcgi.rb index 75b94e9..edc56b1 100644 --- a/lib/rack/handler/fastcgi.rb +++ b/lib/rack/handler/fastcgi.rb @@ -30,29 +30,29 @@ module Rack def self.serve(request, app) env = request.env - env.delete "HTTP_CONTENT_LENGTH" + env.delete Const::HTTP_CONTENT_LENGTH request.in.extend ProperStream - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env[Const::SCRIPT_NAME] = "" if env[Const::SCRIPT_NAME] == "/" - env.update({"rack.version" => [0,1], - "rack.input" => request.in, - "rack.errors" => request.err, + env.update({ Const::RACK_VERSION => [0,1], + Const::RACK_INPUT => request.in, + 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::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::QUERY_STRING] ||= "" + env[Const::HTTP_VERSION] ||= env[Const::SERVER_PROTOCOL] + env[Const::REQUEST_PATH] ||= "/" + env.delete Const::PATH_INFO if env[Const::PATH_INFO] == "" + env.delete Const::CONTENT_TYPE if env[Const::CONTENT_TYPE] == "" + env.delete Const::CONTENT_LENGTH if env[Const::CONTENT_LENGTH] == "" status, headers, body = app.call(env) begin diff --git a/lib/rack/handler/lsws.rb b/lib/rack/handler/lsws.rb index 48b82b5..66b13d7 100644 --- a/lib/rack/handler/lsws.rb +++ b/lib/rack/handler/lsws.rb @@ -10,19 +10,19 @@ module Rack end def self.serve(app) env = ENV.to_hash - env.delete "HTTP_CONTENT_LENGTH" - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" - env.update({"rack.version" => [0,1], - "rack.input" => STDIN, - "rack.errors" => STDERR, - "rack.multithread" => false, - "rack.multiprocess" => true, - "rack.run_once" => false, - "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http" + env.delete Const::HTTP_CONTENT_LENGTH + env[Const::SCRIPT_NAME] = "" if env[Const::SCRIPT_NAME] == "/" + env.update({ Const::RACK_VERSION => [0,1], + Const::RACK_INPUT => STDIN, + 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::HTTPS]) ? "https" : "http" }) - env["QUERY_STRING"] ||= "" - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["REQUEST_PATH"] ||= "/" + env[Const::QUERY_STRING] ||= "" + env[Const::HTTP_VERSION] ||= env[Const::SERVER_PROTOCOL] + env[Const::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 5673598..ca30ffb 100644 --- a/lib/rack/handler/mongrel.rb +++ b/lib/rack/handler/mongrel.rb @@ -38,23 +38,23 @@ module Rack def process(request, response) env = {}.replace(request.params) - env.delete "HTTP_CONTENT_TYPE" - env.delete "HTTP_CONTENT_LENGTH" + env.delete Const::HTTP_CONTENT_TYPE + env.delete Const::HTTP_CONTENT_LENGTH - env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" + env[Const::SCRIPT_NAME] = "" if env[Const::SCRIPT_NAME] == "/" - env.update({"rack.version" => [0,1], - "rack.input" => request.body || StringIO.new(""), - "rack.errors" => STDERR, + env.update({ Const::RACK_VERSION => [0,1], + Const::RACK_INPUT => request.body || StringIO.new(""), + 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::QUERY_STRING] ||= "" + env.delete Const::PATH_INFO if env[Const::PATH_INFO] == "" status, headers, body = @app.call(env) diff --git a/lib/rack/handler/scgi.rb b/lib/rack/handler/scgi.rb index 0e14339..82b1b46 100644 --- a/lib/rack/handler/scgi.rb +++ b/lib/rack/handler/scgi.rb @@ -23,22 +23,22 @@ 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.update({"rack.version" => [0,1], - "rack.input" => StringIO.new(input_body), - "rack.errors" => STDERR, + env.delete Const::HTTP_CONTENT_TYPE + env.delete Const::HTTP_CONTENT_LENGTH + env[Const::REQUEST_PATH], env[Const::QUERY_STRING] = env[Const::REQUEST_URI].split('?', 2) + env[Const::HTTP_VERSION] ||= env[Const::SERVER_PROTOCOL] + env[Const::PATH_INFO] = env[Const::REQUEST_PATH] + env[Const::QUERY_STRING] ||= "" + env[Const::SCRIPT_NAME] = "" + env.update({ Const::RACK_VERSION => [0,1], + Const::RACK_INPUT => StringIO.new(input_body), + Const::RACK_ERRORS => STDERR, - "rack.multithread" => true, - "rack.multiprocess" => true, - "rack.run_once" => false, + 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::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 0337ad7..d2d2672 100644 --- a/lib/rack/handler/webrick.rb +++ b/lib/rack/handler/webrick.rb @@ -21,21 +21,21 @@ module Rack env = req.meta_vars env.delete_if { |k, v| v.nil? } - env.update({"rack.version" => [0,1], - "rack.input" => StringIO.new(req.body.to_s), - "rack.errors" => STDERR, + env.update({ Const::RACK_VERSION => [0,1], + Const::RACK_INPUT => StringIO.new(req.body.to_s), + 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::HTTPS]) ? "https" : "http" }) - env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"] - env["QUERY_STRING"] ||= "" - env["REQUEST_PATH"] ||= "/" - env.delete "PATH_INFO" if env["PATH_INFO"] == "" + env[Const::HTTP_VERSION] ||= env[Const::SERVER_PROTOCOL] + env[Const::QUERY_STRING] ||= "" + env[Const::REQUEST_PATH] ||= "/" + env.delete Const::PATH_INFO if env[Const::PATH_INFO] == "" status, headers, body = @app.call(env) begin diff --git a/lib/rack/head.rb b/lib/rack/head.rb index deab822..0536e40 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::REQUEST_METHOD] == "HEAD" [status, headers, []] else [status, headers, body] diff --git a/lib/rack/lint.rb b/lib/rack/lint.rb index e7f805f..b51838d 100644 --- a/lib/rack/lint.rb +++ b/lib/rack/lint.rb @@ -38,8 +38,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) @@ -150,50 +150,50 @@ module Rack ## There are the following restrictions: ## * rack.version 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 } ## * rack.url_scheme 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 rack.input. - check_input env["rack.input"] + check_input env[Const::RACK_INPUT] ## * There must be a valid error stream in rack.errors. - check_error env["rack.errors"] + check_error env[Const::RACK_ERRORS] ## * The REQUEST_METHOD 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::REQUEST_METHOD]}") { + env[Const::REQUEST_METHOD] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/ } ## * The SCRIPT_NAME, if non-empty, must start with / assert("SCRIPT_NAME must start with /") { - !env.include?("SCRIPT_NAME") || - env["SCRIPT_NAME"] == "" || - env["SCRIPT_NAME"] =~ /\A\// + !env.include?(Const::SCRIPT_NAME) || + env[Const::SCRIPT_NAME] == "" || + env[Const::SCRIPT_NAME] =~ /\A\// } ## * The PATH_INFO, if non-empty, must start with / assert("PATH_INFO must start with /") { - !env.include?("PATH_INFO") || - env["PATH_INFO"] == "" || - env["PATH_INFO"] =~ /\A\// + !env.include?(Const::PATH_INFO) || + env[Const::PATH_INFO] == "" || + env[Const::PATH_INFO] =~ /\A\// } ## * The CONTENT_LENGTH, 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::CONTENT_LENGTH]}") { + !env.include?(Const::CONTENT_LENGTH) || env[Const::CONTENT_LENGTH] =~ /\A\d+\z/ } ## * One of SCRIPT_NAME or PATH_INFO must be ## set. PATH_INFO should be / if ## SCRIPT_NAME 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::SCRIPT_NAME] || env[Const::PATH_INFO] } ## SCRIPT_NAME never should be /, but instead be empty. assert("SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'") { - env["SCRIPT_NAME"] != "/" + env[Const::SCRIPT_NAME] != "/" } end @@ -405,7 +405,7 @@ module Rack bytes += (part.respond_to?(:bytesize) ? part.bytesize : part.size) } - if env["REQUEST_METHOD"] == "HEAD" + if env[Const::REQUEST_METHOD] == "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 f63f419..98c80d9 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::QUERY_STRING].include?("flip") lobster = LobsterString.split("\n"). map { |line| line.ljust(42).reverse }. join("\n") diff --git a/lib/rack/methodoverride.rb b/lib/rack/methodoverride.rb index eb2f0a5..83f3570 100644 --- a/lib/rack/methodoverride.rb +++ b/lib/rack/methodoverride.rb @@ -7,11 +7,11 @@ module Rack end def call(env) - if env["REQUEST_METHOD"] == "POST" + if env[Const::REQUEST_METHOD] == "POST" req = Request.new(env) method = req.POST["_method"].to_s.upcase if HTTP_METHODS.include?(method) - env["REQUEST_METHOD"] = method + env[Const::REQUEST_METHOD] = method end end diff --git a/lib/rack/mock.rb b/lib/rack/mock.rb index f43b9af..08c6bbf 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,12 +41,12 @@ module Rack end DEFAULT_ENV = { - "rack.version" => [0,1], - "rack.input" => StringIO.new, - "rack.errors" => StringIO.new, - "rack.multithread" => true, - "rack.multiprocess" => true, - "rack.run_once" => false, + Const::RACK_VERSION => [0,1], + 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) @@ -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 @@ -75,26 +76,26 @@ module Rack uri = URI(uri) env = DEFAULT_ENV.dup - env["REQUEST_METHOD"] = opts[:method] || "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[Const::REQUEST_METHOD] = opts[:method] || "GET" + env[Const::SERVER_NAME] = uri.host || "example.org" + env[Const::SERVER_PORT] = uri.port ? uri.port.to_s : "80" + env[Const::QUERY_STRING] = uri.query.to_s + env[Const::PATH_INFO] = (!uri.path || uri.path.empty?) ? "/" : uri.path + env[Const::RACK_URL_SCHEME] = uri.scheme || "http" - env["SCRIPT_NAME"] = opts[:script_name] || "" + env[Const::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 opts[:input] ||= "" if String === opts[:input] - env["rack.input"] = StringIO.new(opts[:input]) + env[Const::RACK_INPUT] = StringIO.new(opts[:input]) else - env["rack.input"] = opts[:input] + env[Const::RACK_INPUT] = opts[:input] end opts.each { |field, value| diff --git a/lib/rack/recursive.rb b/lib/rack/recursive.rb index bf8b965..eed6f28 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::PATH_INFO] = @url.path + @env[Const::QUERY_STRING] = @url.query if @url.query + @env[Const::HTTP_HOST] = @url.host if @url.host + @env[Const::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::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::PATH_INFO => path, Const::SCRIPT_NAME => @script_name, + Const::REQUEST_METHOD => "GET", + Const::CONTENT_LENGTH => "0", Const::CONTENT_TYPE => "", + Const::RACK_INPUT => StringIO.new("")) @app.call(env) end end diff --git a/lib/rack/reloader.rb b/lib/rack/reloader.rb index 25ca2f9..b560976 100644 --- a/lib/rack/reloader.rb +++ b/lib/rack/reloader.rb @@ -17,7 +17,7 @@ module Rack def call(env) if Time.now > @last + @secs Thread.exclusive { - reload!(env['rack.errors']) + reload!(env[Const::RACK_ERRORS]) @last = Time.now } end diff --git a/lib/rack/request.rb b/lib/rack/request.rb index 4447d03..33f8bc7 100644 --- a/lib/rack/request.rb +++ b/lib/rack/request.rb @@ -25,15 +25,15 @@ 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 body; @env[Const::RACK_INPUT] end + def scheme; @env[Const::RACK_URL_SCHEME] end + def script_name; @env[Const::SCRIPT_NAME].to_s end + def path_info; @env[Const::PATH_INFO].to_s end + def port; @env[Const::SERVER_PORT].to_i end + def request_method; @env[Const::REQUEST_METHOD] end + def query_string; @env[Const::QUERY_STRING].to_s end + def content_length; @env[Const::CONTENT_LENGTH] end + def content_type; @env[Const::CONTENT_TYPE] end # The media type (type/subtype) portion of the CONTENT_TYPE header # without any media type parameters. e.g., when CONTENT_TYPE is @@ -67,11 +67,11 @@ module Rack def host # Remove port number. - (@env["HTTP_HOST"] || @env["SERVER_NAME"]).gsub(/:\d+\z/, '') + (@env[Const::HTTP_HOST] || @env[Const::SERVER_NAME]).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::SCRIPT_NAME] = s.to_s end + def path_info=(s); @env[Const::PATH_INFO] = s.to_s end def get?; request_method == "GET" end def post?; request_method == "POST" end @@ -97,33 +97,38 @@ module Rack FORM_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_query(query_string) + @env[QUERY_STRING] = query_string + @env[QUERY_HASH] = Utils.parse_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.request.form_input"].eql? @env["rack.input"] - @env["rack.request.form_hash"] + if @env[FORM_INPUT].eql? @env[Const::RACK_INPUT] + @env[FORM_HASH] elsif form_data? - @env["rack.request.form_input"] = @env["rack.input"] - unless @env["rack.request.form_hash"] = - Utils::Multipart.parse_multipart(env) - @env["rack.request.form_vars"] = @env["rack.input"].read - @env["rack.request.form_hash"] = Utils.parse_query(@env["rack.request.form_vars"]) - @env["rack.input"].rewind if @env["rack.input"].respond_to?(:rewind) + @env[FORM_INPUT] = @env[Const::RACK_INPUT] + unless @env[FORM_HASH] = Utils::Multipart.parse_multipart(env) + @env[FORM_VARS] = @env[Const::RACK_INPUT].read + @env[FORM_HASH] = Utils.parse_query(@env[FORM_VARS]) + @env[Const::RACK_INPUT].rewind if @env[Const::RACK_INPUT].respond_to?(:rewind) end - @env["rack.request.form_hash"] + @env[FORM_HASH] else {} end @@ -153,25 +158,27 @@ module Rack # the referer of the client or '/' def referer - @env['HTTP_REFERER'] || '/' + @env[Const::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::HTTP_COOKIE] - if @env["rack.request.cookie_string"] == @env["HTTP_COOKIE"] - @env["rack.request.cookie_hash"] + if @env[COOKIE_STRING] == @env[Const::HTTP_COOKIE] + @env[COOKIE_HASH] else - @env["rack.request.cookie_string"] = @env["HTTP_COOKIE"] + @env[COOKIE_STRING] = @env[Const::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 } @@ -179,7 +186,7 @@ module Rack end def xhr? - @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" + @env[Const::HTTP_X_REQUESTED_WITH] == "XMLHttpRequest" end # Tries to return a remake of the original request URL as a string. @@ -204,7 +211,7 @@ module Rack end def accept_encoding - @env["HTTP_ACCEPT_ENCODING"].to_s.split(/,\s*/).map do |part| + @env[Const::HTTP_ACCEPT_ENCODING].to_s.split(/,\s*/).map do |part| m = /^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$/.match(part) # From WEBrick if m @@ -216,10 +223,10 @@ module Rack end def ip - if addr = @env['HTTP_X_FORWARDED_FOR'] + if addr = @env[Const::HTTP_X_FORWARDED_FOR] addr.split(',').last.strip else - @env['REMOTE_ADDR'] + @env[Const::REMOTE_ADDR] end end end diff --git a/lib/rack/session/abstract/id.rb b/lib/rack/session/abstract/id.rb index c521ba1..dbfe6ec 100644 --- a/lib/rack/session/abstract/id.rb +++ b/lib/rack/session/abstract/id.rb @@ -66,7 +66,7 @@ module Rack # 'rack.session', and places options and session metadata into # 'rack.session.options'. def load_session(env) - sid = (env['HTTP_COOKIE']||'')[/#{@key}=([^,;]+)/,1] + sid = (env[Const::HTTP_COOKIE]||'')[/#{@key}=([^,;]+)/,1] sid, session = get_session(env, sid) unless session.is_a?(Hash) puts 'Session: '+sid.inspect+"\n"+session.inspect if $DEBUG diff --git a/lib/rack/session/cookie.rb b/lib/rack/session/cookie.rb index 3dba358..7935f97 100644 --- a/lib/rack/session/cookie.rb +++ b/lib/rack/session/cookie.rb @@ -67,7 +67,7 @@ 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.") [status, headers, body] else options = env["rack.session.options"] diff --git a/lib/rack/session/memcache.rb b/lib/rack/session/memcache.rb index d19af51..505c537 100644 --- a/lib/rack/session/memcache.rb +++ b/lib/rack/session/memcache.rb @@ -85,7 +85,7 @@ module Rack next unless o.has_key?(k) and v != o[k] warn "session value assignment collision at #{k.inspect}:"+ "\n\t#{o[k].inspect}\n\t#{v.inspect}" - end if $DEBUG and env['rack.multithread'] + end if $DEBUG and env[Const::RACK_MULTITHREAD] return true rescue MemCache::MemCacheError, Errno::ECONNREFUSED # MemCache server cannot be contacted warn "#{self} is unable to find server." diff --git a/lib/rack/session/pool.rb b/lib/rack/session/pool.rb index 8e192d7..18e82c5 100644 --- a/lib/rack/session/pool.rb +++ b/lib/rack/session/pool.rb @@ -59,7 +59,7 @@ module Rack session.each do |k,v| next unless old_session.has_key?(k) and v != old_session[k] warn "session value assignment collision at #{k}: #{old_session[k]} <- #{v}" - end if $DEBUG and env['rack.multithread'] + end if $DEBUG and env[Const::RACK_MULTITHREAD] end return true rescue diff --git a/lib/rack/showexceptions.rb b/lib/rack/showexceptions.rb index 3fee6ae..1048eaf 100644 --- a/lib/rack/showexceptions.rb +++ b/lib/rack/showexceptions.rb @@ -57,9 +57,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/static.rb b/lib/rack/static.rb index 168e8f8..36dd58f 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::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 b00f2d7..7240472 100644 --- a/lib/rack/urlmap.rb +++ b/lib/rack/urlmap.rb @@ -30,15 +30,15 @@ module Rack end def call(env) - path = env["PATH_INFO"].to_s.squeeze("/") - hHost, sName, sPort = env.values_at('HTTP_HOST','SERVER_NAME','SERVER_PORT') + path = env[Const::PATH_INFO].to_s.squeeze("/") + hHost, sName, sPort = env.values_at(Const::HTTP_HOST, Const::SERVER_NAME, Const::SERVER_PORT) @mapping.each { |host, location, app| next unless (hHost == host || sName == host \ || (host.nil? && (hHost == sName || hHost == sName+':'+sPort))) next unless location == path[0, location.size] next unless path[location.size] == nil || path[location.size] == ?/ - env["SCRIPT_NAME"] += location - env["PATH_INFO"] = path[location.size..-1] + env[Const::SCRIPT_NAME] += location + env[Const::PATH_INFO] = path[location.size..-1] return app.call(env) } [404, {"Content-Type" => "text/plain"}, ["Not Found: #{path}"]] diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb index 3fb7a70..e28057e 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -257,7 +257,7 @@ module Rack EOL = "\r\n" def self.parse_multipart(env) - unless env['CONTENT_TYPE'] =~ + unless env[Const::CONTENT_TYPE] =~ %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n nil else @@ -265,8 +265,8 @@ module Rack params = {} buf = "" - content_length = env['CONTENT_LENGTH'].to_i - input = env['rack.input'] + content_length = env[Const::CONTENT_LENGTH].to_i + input = env[Const::RACK_INPUT] boundary_size = boundary.size + EOL.size bufsize = 16384 -- 1.6.0.4