aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/CHANGELOG2
-rwxr-xr-xactionpack/lib/action_controller.rb1
-rw-r--r--actionpack/lib/action_controller/headers.rb31
-rwxr-xr-xactionpack/lib/action_controller/request.rb4
-rw-r--r--actionpack/test/controller/header_test.rb14
5 files changed, 51 insertions, 1 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index b4f07e451e..0d31206107 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Provide nicer access to HTTP Headers. Instead of request.env["HTTP_REFERRER"] you can now use request.headers["Referrer"]. [Koz]
+
* UrlWriter respects relative_url_root. #10748 [Cheah Chu Yeow]
* The asset_host block takes the controller request as an optional second argument. Example: use a single asset host for SSL requests. #10549 [Cheah Chu Yeow, Peter B, Tom Taylor]
diff --git a/actionpack/lib/action_controller.rb b/actionpack/lib/action_controller.rb
index e7a9eba560..9586426ca1 100755
--- a/actionpack/lib/action_controller.rb
+++ b/actionpack/lib/action_controller.rb
@@ -55,6 +55,7 @@ require 'action_controller/http_authentication'
require 'action_controller/components'
require 'action_controller/record_identifier'
require 'action_controller/request_forgery_protection'
+require 'action_controller/headers'
require 'action_view'
ActionController::Base.template_class = ActionView::Base
diff --git a/actionpack/lib/action_controller/headers.rb b/actionpack/lib/action_controller/headers.rb
new file mode 100644
index 0000000000..7239438c49
--- /dev/null
+++ b/actionpack/lib/action_controller/headers.rb
@@ -0,0 +1,31 @@
+module ActionController
+ module Http
+ class Headers < ::Hash
+
+ def initialize(constructor = {})
+ if constructor.is_a?(Hash)
+ super()
+ update(constructor)
+ else
+ super(constructor)
+ end
+ end
+
+ def [](header_name)
+ if include?(header_name)
+ super
+ else
+ super(normalize_header(header_name))
+ end
+ end
+
+
+ private
+ # Takes an HTTP header name and returns it in the
+ # format
+ def normalize_header(header_name)
+ "HTTP_#{header_name.upcase.gsub(/-/, '_')}"
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/actionpack/lib/action_controller/request.rb b/actionpack/lib/action_controller/request.rb
index c48426d377..e3892037d8 100755
--- a/actionpack/lib/action_controller/request.rb
+++ b/actionpack/lib/action_controller/request.rb
@@ -61,8 +61,10 @@ module ActionController
request_method == :head
end
+ # Provides acccess to the request's HTTP headers, for example:
+ # request.headers["Content-Type"] # => "text/plain"
def headers
- @env
+ @headers ||= ActionController::Http::Headers.new(@env)
end
def content_length
diff --git a/actionpack/test/controller/header_test.rb b/actionpack/test/controller/header_test.rb
new file mode 100644
index 0000000000..33c14a187c
--- /dev/null
+++ b/actionpack/test/controller/header_test.rb
@@ -0,0 +1,14 @@
+require 'abstract_unit'
+
+class HeaderTest < Test::Unit::TestCase
+ def setup
+ @headers = ActionController::Http::Headers.new("HTTP_CONTENT_TYPE"=>"text/plain")
+ end
+
+ def test_content_type_works
+ assert_equal "text/plain", @headers["Content-Type"]
+ assert_equal "text/plain", @headers["content-type"]
+ assert_equal "text/plain", @headers["CONTENT_TYPE"]
+ assert_equal "text/plain", @headers["HTTP_CONTENT_TYPE"]
+ end
+end