Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added media_type methods in Rack::Response
- Loading branch information
Showing
4 changed files
with
91 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
module Rack | ||
# Rack::MediaType parse media type and parameters out of content_type string | ||
|
||
class MediaType | ||
SPLIT_PATTERN = %r{\s*[;,]\s*} | ||
|
||
class << self | ||
# The media type (type/subtype) portion of the CONTENT_TYPE header | ||
# without any media type parameters. e.g., when CONTENT_TYPE is | ||
# "text/plain;charset=utf-8", the media-type is "text/plain". | ||
# | ||
# For more information on the use of media types in HTTP, see: | ||
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 | ||
def type(content_type) | ||
return nil unless content_type | ||
content_type.split(SPLIT_PATTERN, 2).first.downcase | ||
end | ||
|
||
# The media type parameters provided in CONTENT_TYPE as a Hash, or | ||
# an empty Hash if no CONTENT_TYPE or media-type parameters were | ||
# provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", | ||
# this method responds with the following Hash: | ||
# { 'charset' => 'utf-8' } | ||
def params(content_type) | ||
return {} if content_type.nil? | ||
Hash[*content_type.split(SPLIT_PATTERN)[1..-1]. | ||
collect { |s| s.split('=', 2) }. | ||
map { |k,v| [k.downcase, strip_doublequotes(v)] }.flatten] | ||
end | ||
|
||
private | ||
|
||
def strip_doublequotes(str) | ||
(str[0] == ?" && str[-1] == ?") ? str[1..-2] : str | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
require 'rack/media_type' | ||
|
||
describe Rack::MediaType do | ||
before { @empty_hash = {} } | ||
|
||
describe 'when content_type nil' do | ||
before { @content_type = nil } | ||
|
||
it '#type is nil' do | ||
Rack::MediaType.type(@content_type).should.be.nil | ||
end | ||
|
||
it '#params is empty' do | ||
Rack::MediaType.params(@content_type).should.equal @empty_hash | ||
end | ||
end | ||
|
||
describe 'when content_type contains only media_type' do | ||
before { @content_type = 'application/text' } | ||
|
||
it '#type is application/text' do | ||
Rack::MediaType.type(@content_type).should.equal 'application/text' | ||
end | ||
|
||
it '#params is empty' do | ||
Rack::MediaType.params(@content_type).should.equal @empty_hash | ||
end | ||
end | ||
|
||
describe 'when content_type contains media_type and params' do | ||
before { @content_type = 'application/text;CHARSET="utf-8"' } | ||
|
||
it '#type is application/text' do | ||
Rack::MediaType.type(@content_type).should.equal 'application/text' | ||
end | ||
|
||
it '#params has key "charset" with value "utf-8"' do | ||
Rack::MediaType.params(@content_type)['charset'].should.equal 'utf-8' | ||
end | ||
end | ||
end |