rstreamor 0.2.4 → 0.2.6
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 +5 -5
- data/README.md +11 -2
- data/lib/rstreamor/file.rb +12 -9
- data/lib/rstreamor/request.rb +12 -13
- data/lib/rstreamor/response.rb +8 -9
- data/lib/rstreamor/stream.rb +9 -4
- data/lib/rstreamor/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c7df72d8583a6fa7d9e7e148ee53a883fe7e17f032d8449a89c1267583d3f2e3
|
4
|
+
data.tar.gz: 5783b2aaf45cee46fde0fa042d0199c2f71a9efb687940c0c877263b13d7c2d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94b976e8190708b118349cf554b2445dac5d6d3414537fbb81d92c322fd9235999b7a1ef51d7afaee86c76243b347f6960302afa8d46b5ab01a2fab453be3878
|
7
|
+
data.tar.gz: 4cf6027f281d1f60274b250af071c60d08c8b1faa64fe9dd7ee6159b73dc7d99be0285870f2820ba108258f3d78b14a12da1b8a1c8c61599e5945c651b4f165b
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ gem 'rstreamor', git: 'https://github.com/ndea/rstreamor.git', branch: 'master'
|
|
8
8
|
```
|
9
9
|
###### Rubygems
|
10
10
|
```ruby
|
11
|
-
gem 'rstreamor', '~> 0.2.
|
11
|
+
gem 'rstreamor', '~> 0.2.6'
|
12
12
|
```
|
13
13
|
# Install
|
14
14
|
```ruby
|
@@ -34,6 +34,16 @@ If you dont use Carrierwave as a file make sure your file method has the followi
|
|
34
34
|
- #data
|
35
35
|
- #content_type
|
36
36
|
|
37
|
+
Optionally, you could send some params to the `stream` method like the following example:
|
38
|
+
```ruby
|
39
|
+
class VideosController < ApplicationController
|
40
|
+
include Rstreamor
|
41
|
+
def show
|
42
|
+
stream @resource.image_file, { x_sendfile: true, stream: true }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
37
47
|
Please note that if you don't specify any range request headers Rstreamor will return the whole file from byte 0 to EOF with status code *200*
|
38
48
|
|
39
49
|
# What is a range request?
|
@@ -94,4 +104,3 @@ Content-Type:application/mp4
|
|
94
104
|
- Bugfixes
|
95
105
|
- Codestyle
|
96
106
|
- Anything that improves this gem
|
97
|
-
|
data/lib/rstreamor/file.rb
CHANGED
@@ -1,26 +1,29 @@
|
|
1
1
|
module Rstreamor
|
2
2
|
class File
|
3
|
-
|
3
|
+
attr_reader :file
|
4
4
|
|
5
5
|
def initialize(file)
|
6
|
-
|
6
|
+
@file = file
|
7
7
|
end
|
8
8
|
|
9
9
|
def data
|
10
|
-
if
|
11
|
-
|
10
|
+
@data ||= if file.respond_to? :data
|
11
|
+
file.data
|
12
12
|
else
|
13
|
-
|
13
|
+
file.read
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
def content_type
|
18
|
-
|
18
|
+
file.content_type
|
19
19
|
end
|
20
20
|
|
21
21
|
def size
|
22
|
-
|
22
|
+
# Because of encoding, the string size might not match the stream size,
|
23
|
+
# and that may lead to files being truncated when served (i.e. this happens
|
24
|
+
# often for MP3 files, were the last few seconds of files longer than a minute
|
25
|
+
# gets trimmed).
|
26
|
+
@size ||= data.bytesize
|
23
27
|
end
|
24
|
-
|
25
28
|
end
|
26
|
-
end
|
29
|
+
end
|
data/lib/rstreamor/request.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
module Rstreamor
|
2
2
|
class Request
|
3
|
-
|
3
|
+
attr_reader :request, :file
|
4
4
|
|
5
5
|
def initialize(request, file)
|
6
|
-
|
7
|
-
|
6
|
+
@request = request
|
7
|
+
@file = file
|
8
8
|
end
|
9
9
|
|
10
10
|
def ranges
|
11
|
-
|
11
|
+
request.headers['HTTP_RANGE'].gsub('bytes=', '').split('-') if request.headers['HTTP_RANGE']
|
12
12
|
end
|
13
13
|
|
14
14
|
def upper_bound
|
15
|
-
ranges[1] ? ranges[1].to_i :
|
15
|
+
ranges[1] ? ranges[1].to_i : (file.size - 1)
|
16
16
|
end
|
17
17
|
|
18
18
|
def lower_bound
|
@@ -20,24 +20,23 @@ module Rstreamor
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def range_header?
|
23
|
-
|
23
|
+
request.headers['HTTP_RANGE'].present?
|
24
24
|
end
|
25
25
|
|
26
26
|
def file_content_type
|
27
|
-
|
27
|
+
file.content_type
|
28
28
|
end
|
29
29
|
|
30
30
|
def slice_file
|
31
|
-
if
|
32
|
-
|
31
|
+
if request.headers['HTTP_RANGE'].present?
|
32
|
+
file.data.byteslice(lower_bound..upper_bound)
|
33
33
|
else
|
34
|
-
|
34
|
+
file.data
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
def file_size
|
39
|
-
|
39
|
+
file.size
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
43
|
-
end
|
42
|
+
end
|
data/lib/rstreamor/response.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
module Rstreamor
|
2
2
|
class Response
|
3
|
-
|
3
|
+
attr_reader :request
|
4
4
|
|
5
5
|
def initialize(request)
|
6
|
-
|
6
|
+
@request = request
|
7
7
|
end
|
8
8
|
|
9
9
|
def response_code
|
10
|
-
|
10
|
+
request.range_header? ? 206 : 200
|
11
11
|
end
|
12
12
|
|
13
13
|
def content_length
|
14
|
-
if
|
15
|
-
(
|
14
|
+
if request.range_header?
|
15
|
+
(request.upper_bound - request.lower_bound + 1).to_s
|
16
16
|
else
|
17
|
-
|
17
|
+
request.file_size
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
def content_range
|
22
|
-
"bytes #{
|
22
|
+
"bytes #{request.lower_bound}-#{request.upper_bound}/#{request.file_size}"
|
23
23
|
end
|
24
24
|
|
25
25
|
def accept_ranges
|
@@ -29,6 +29,5 @@ module Rstreamor
|
|
29
29
|
def cache_control
|
30
30
|
'no-cache'
|
31
31
|
end
|
32
|
-
|
33
32
|
end
|
34
|
-
end
|
33
|
+
end
|
data/lib/rstreamor/stream.rb
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
module Rstreamor
|
2
2
|
module Stream
|
3
|
-
def stream(file)
|
3
|
+
def stream(file, options = {})
|
4
4
|
request_builder = Rstreamor::Request.new(request, Rstreamor::File.new(file))
|
5
5
|
response_builder = Rstreamor::Response.new(request_builder)
|
6
6
|
set_response_header(request_builder, response_builder)
|
7
|
-
stream_file(request_builder, response_builder)
|
7
|
+
stream_file(request_builder, response_builder, options)
|
8
8
|
end
|
9
9
|
|
10
10
|
private
|
11
11
|
|
12
|
-
def stream_file(request_builder, response_builder)
|
12
|
+
def stream_file(request_builder, response_builder, options)
|
13
13
|
content = request_builder.slice_file
|
14
|
-
|
14
|
+
|
15
|
+
send_data(content, {
|
16
|
+
type: request_builder.file_content_type,
|
17
|
+
disposition: 'inline',
|
18
|
+
status: response_builder.response_code
|
19
|
+
}.merge(options))
|
15
20
|
end
|
16
21
|
|
17
22
|
def set_response_header(request_builder, response_builder)
|
data/lib/rstreamor/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rstreamor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erwin Schens
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
version: '0'
|
102
102
|
requirements: []
|
103
103
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.
|
104
|
+
rubygems_version: 2.7.9
|
105
105
|
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Stream files using HTTP range requests.
|