http_content_type 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +7 -0
- data/LICENSE.md +22 -0
- data/README.md +56 -0
- data/lib/http_content_type.rb +2 -0
- data/lib/http_content_type/checker.rb +70 -0
- data/lib/http_content_type/version.rb +3 -0
- data/spec/http_content_type/checker_spec.rb +86 -0
- data/spec/spec_helper.rb +14 -0
- metadata +83 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: f3bdaf6bde10e228f63867b5994cc3c9e1d6c514
|
|
4
|
+
data.tar.gz: 99274fe10583a1cbe8d04dd260874b29507ed8ec
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 151838a3c37cb555a9de9aecfb3aa8fa774f75bd1ab30b67c295dbf2aa90ce66488c59120d34c138c99c5e94ddee7f7ad7627e6c915f3ee627a0d13a2e05581c
|
|
7
|
+
data.tar.gz: 7155b8a36f44e6d8e3000f7743573cd6acae8961acf2b034801aa4ce8391b4f372e3016cdbd7fff1bb87e9a0eaaffde51323b1114fe3c61650c5417091d5aa45
|
data/CHANGELOG.md
ADDED
data/LICENSE.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2013 Jilion SA
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# HttpContentType
|
|
2
|
+
[](http://badge.fury.io/rb/http_content_type) [](https://travis-ci.org/jilion/http_content_type) [](https://gemnasium.com/jilion/http_content_type) [](https://codeclimate.com/github/jilion/http_content_type) [](https://coveralls.io/r/jilion/http_content_type)
|
|
3
|
+
|
|
4
|
+
This gem allows you to check the Content-Type of any asset accessible via HTTP.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
Add this line to your application's Gemfile:
|
|
9
|
+
|
|
10
|
+
```ruby
|
|
11
|
+
gem 'http_content_type'
|
|
12
|
+
```
|
|
13
|
+
And then execute:
|
|
14
|
+
|
|
15
|
+
```shell
|
|
16
|
+
$ bundle
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or install it yourself as:
|
|
20
|
+
|
|
21
|
+
```shell
|
|
22
|
+
$ gem install http_content_type
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
checker = HttpContentType::Checker.new('http://domain.com/video.mp4')
|
|
29
|
+
|
|
30
|
+
checker.found? # => true (asset doesn't return a 404)
|
|
31
|
+
checker.expected_content_type # => 'video/mp4' (the expected content type is based on file extension)
|
|
32
|
+
checker.content_type # => 'video/mp4'
|
|
33
|
+
checker.valid_content_type? # => true
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Development
|
|
37
|
+
|
|
38
|
+
* Documentation hosted at [RubyDoc](http://rubydoc.info/github/jilion/http_content_type/master/frames).
|
|
39
|
+
* Source hosted at [GitHub](https://github.com/jilion/http_content_type).
|
|
40
|
+
|
|
41
|
+
Pull requests are very welcome! Please try to follow these simple rules if applicable:
|
|
42
|
+
|
|
43
|
+
* Please create a topic branch for every separate change you make.
|
|
44
|
+
* Make sure your patches are well tested. All specs must pass on [Travis CI](https://travis-ci.org/jilion/http_content_type).
|
|
45
|
+
* Update the [Yard](http://yardoc.org/) documentation.
|
|
46
|
+
* Update the [README](https://github.com/jilion/http_content_type/blob/master/README.md).
|
|
47
|
+
* Update the [CHANGELOG](https://github.com/jilion/http_content_type/blob/master/CHANGELOG.md) for noteworthy changes (don't forget to run `bundle exec pimpmychangelog` and watch the magic happen)!
|
|
48
|
+
* Please **do not change** the version number.
|
|
49
|
+
|
|
50
|
+
### Author
|
|
51
|
+
|
|
52
|
+
* [Rémy Coutable](https://github.com/rymai) ([@rymai](http://twitter.com/rymai), [rymai.me](http://rymai.me))
|
|
53
|
+
|
|
54
|
+
### Contributors
|
|
55
|
+
|
|
56
|
+
[https://github.com/jilion/http_content_type/graphs/contributors](https://github.com/jilion/http_content_type/contributors)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
|
|
3
|
+
module HttpContentType
|
|
4
|
+
|
|
5
|
+
class Checker
|
|
6
|
+
UNKNOWN_CONTENT_TYPE_RESPONSE = { 'found' => true, 'content-type' => 'unknown' }
|
|
7
|
+
FILE_NOT_FOUND_RESPONSE = { 'found' => false, 'content-type' => 'unknown' }
|
|
8
|
+
|
|
9
|
+
def initialize(asset_url)
|
|
10
|
+
@asset_url = asset_url
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def found?
|
|
14
|
+
_head['found']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def expected_content_type
|
|
18
|
+
@expected_content_type ||= case File.extname(@asset_url).sub(/^\./, '')
|
|
19
|
+
when 'mp4', 'm4v', 'mov'
|
|
20
|
+
'video/mp4'
|
|
21
|
+
when 'webm'
|
|
22
|
+
'video/webm'
|
|
23
|
+
when 'ogv', 'ogg'
|
|
24
|
+
'video/ogg'
|
|
25
|
+
else
|
|
26
|
+
'unknown'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def content_type
|
|
31
|
+
_head['content-type']
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def valid_content_type?
|
|
35
|
+
content_type == expected_content_type
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def _clean_uri
|
|
41
|
+
@_clean_uri ||= URI.parse(URI.escape(@asset_url))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def _head_options
|
|
45
|
+
@_head_options ||= { use_ssl: _clean_uri.scheme == 'https', read_timeout: 3 }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def _head
|
|
49
|
+
@response ||= begin
|
|
50
|
+
response = Net::HTTP.start(_clean_uri.host, _clean_uri.port, _head_options) do |http|
|
|
51
|
+
http.head(_clean_uri.path)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
case response
|
|
55
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
|
56
|
+
{ 'found' => true, 'content-type' => response['content-type'] }
|
|
57
|
+
when Net::HTTPClientError
|
|
58
|
+
FILE_NOT_FOUND_RESPONSE
|
|
59
|
+
else
|
|
60
|
+
UNKNOWN_CONTENT_TYPE_RESPONSE
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
rescue
|
|
64
|
+
UNKNOWN_CONTENT_TYPE_RESPONSE
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
require 'http_content_type/checker'
|
|
4
|
+
|
|
5
|
+
describe HttpContentType::Checker do
|
|
6
|
+
let(:checker) { described_class.new('http://foo.com/bar.mp4') }
|
|
7
|
+
|
|
8
|
+
describe '#found?' do
|
|
9
|
+
context 'asset is not found' do
|
|
10
|
+
before { checker.stub(:_head).and_return({ 'found' => false }) }
|
|
11
|
+
|
|
12
|
+
it 'return false' do
|
|
13
|
+
checker.should_not be_found
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'asset is found' do
|
|
18
|
+
before { checker.stub(:_head).and_return({ 'found' => true, 'content-type' => 'video/mp4' }) }
|
|
19
|
+
|
|
20
|
+
it 'return true' do
|
|
21
|
+
checker.should be_found
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe '#expected_content_type' do
|
|
27
|
+
context '.mp4 video' do
|
|
28
|
+
subject { described_class.new('http://foo.com/bar.mp4') }
|
|
29
|
+
its(:expected_content_type) { eq 'video/mp4' }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context '.m4v video' do
|
|
33
|
+
subject { described_class.new('http://foo.com/bar.m4v') }
|
|
34
|
+
its(:expected_content_type) { eq 'video/mp4' }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context '.mov video' do
|
|
38
|
+
subject { described_class.new('http://foo.com/bar.mov') }
|
|
39
|
+
its(:expected_content_type) { eq 'video/mp4' }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context '.webm video' do
|
|
43
|
+
subject { described_class.new('http://foo.com/bar.webm') }
|
|
44
|
+
its(:expected_content_type) { eq 'video/webm' }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context '.ogg video' do
|
|
48
|
+
subject { described_class.new('http://foo.com/bar.ogg') }
|
|
49
|
+
its(:expected_content_type) { eq 'video/ogg' }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context '.ogv video' do
|
|
53
|
+
subject { described_class.new('http://foo.com/bar.ogv') }
|
|
54
|
+
its(:expected_content_type) { eq 'video/ogg' }
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe '#content_type' do
|
|
59
|
+
context 'asset has valid content type' do
|
|
60
|
+
before { checker.stub(:_head).and_return({ 'found' => true, 'content-type' => 'video/mp4' }) }
|
|
61
|
+
|
|
62
|
+
it 'returns the actual content type' do
|
|
63
|
+
expect(checker.content_type).to eq 'video/mp4'
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe '#valid_content_type?' do
|
|
69
|
+
context 'asset has valid content type' do
|
|
70
|
+
before { checker.stub(:_head).and_return({ 'found' => true, 'content-type' => 'video/mp4' }) }
|
|
71
|
+
|
|
72
|
+
it 'returns true' do
|
|
73
|
+
checker.should be_valid_content_type
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context 'asset has invalid content type' do
|
|
78
|
+
before { checker.stub(:_head).and_return({ 'found' => true, 'content-type' => 'video/mov' }) }
|
|
79
|
+
|
|
80
|
+
it 'returns false' do
|
|
81
|
+
checker.should_not be_valid_content_type
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'coveralls'
|
|
3
|
+
Coveralls.wear!
|
|
4
|
+
|
|
5
|
+
require 'http_content_type'
|
|
6
|
+
require 'rspec'
|
|
7
|
+
|
|
8
|
+
RSpec.configure do |config|
|
|
9
|
+
config.color_enabled = true
|
|
10
|
+
config.order = :random
|
|
11
|
+
config.filter_run :focus => true
|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
13
|
+
config.run_all_when_everything_filtered = true
|
|
14
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: http_content_type
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Rémy Coutable
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2013-09-04 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - '>='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - '>='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rspec
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
description: This gem allows you to check the Content-Type of any HTTP-accessible
|
|
42
|
+
asset.
|
|
43
|
+
email:
|
|
44
|
+
- remy@rymai.me
|
|
45
|
+
executables: []
|
|
46
|
+
extensions: []
|
|
47
|
+
extra_rdoc_files: []
|
|
48
|
+
files:
|
|
49
|
+
- lib/http_content_type/checker.rb
|
|
50
|
+
- lib/http_content_type/version.rb
|
|
51
|
+
- lib/http_content_type.rb
|
|
52
|
+
- CHANGELOG.md
|
|
53
|
+
- LICENSE.md
|
|
54
|
+
- README.md
|
|
55
|
+
- spec/http_content_type/checker_spec.rb
|
|
56
|
+
- spec/spec_helper.rb
|
|
57
|
+
homepage: http://rubygems.org/gems/http_content_type
|
|
58
|
+
licenses:
|
|
59
|
+
- MIT
|
|
60
|
+
metadata: {}
|
|
61
|
+
post_install_message:
|
|
62
|
+
rdoc_options: []
|
|
63
|
+
require_paths:
|
|
64
|
+
- lib
|
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - '>='
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '0'
|
|
75
|
+
requirements: []
|
|
76
|
+
rubyforge_project:
|
|
77
|
+
rubygems_version: 2.0.7
|
|
78
|
+
signing_key:
|
|
79
|
+
specification_version: 4
|
|
80
|
+
summary: Check the Content-Type of any HTTP-accessible asset.
|
|
81
|
+
test_files:
|
|
82
|
+
- spec/http_content_type/checker_spec.rb
|
|
83
|
+
- spec/spec_helper.rb
|