From 104f31af1dc412160b624da1b09c5456fa862f53 Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Fri, 11 Jan 2008 06:39:56 +0000 Subject: Provide a nicer way to access headers. request.headers["Content-Type"] instead of request.headers["HTTP_CONTENT_TYPE"] [Koz] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8625 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller.rb | 1 + actionpack/lib/action_controller/headers.rb | 31 +++++++++++++++++++++++++++++ actionpack/lib/action_controller/request.rb | 4 +++- actionpack/test/controller/header_test.rb | 14 +++++++++++++ 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 actionpack/lib/action_controller/headers.rb create mode 100644 actionpack/test/controller/header_test.rb 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 -- cgit v1.2.3