rack-grid-serve 0.0.8 → 0.0.9

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rack/grid_serve.rb +65 -27
  3. data/test.rb +7 -3
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6deb8f0b7a078322007d82d31e83f659c86049f3
4
- data.tar.gz: 6cdb2ae95ce99e60864862fb1b48d338e393c8e8
3
+ metadata.gz: 00c045ab328e8d6c02e99b63a60aaa0b969c50b9
4
+ data.tar.gz: 4191a3f5970bc899555e4b0b94ad603f83229983
5
5
  SHA512:
6
- metadata.gz: c324950ed06aa204cacbeba0fc6cc804a7f00392c4bf78768d5018ca0afd3dc023dc68001f4fdf3a4c282b83ca001ec9a6e3f3b8e611cbc3262c5ad7b71ca655
7
- data.tar.gz: b6a802f04746d1e9a18fc1f1f89e6f104801c9b52d4f83e541c96f627e53b16b62cd8d3d413b81e9f852530d39b082c668c8368b88acdb9dfc4884cff964589a
6
+ metadata.gz: f38407d72fe33bd7f0c756562a43952f4bb7687741d394aa33c23616138c90a74ab2832841ff06554e9d2c7ab26dcce69579e980f1d0121e8ca826b42a465beb
7
+ data.tar.gz: 114504fbfb3cd42f95bcc063ec2b74672fa84dd0e77a885055b28927fe786871117b24eb7b0523da2d5aaf90a871e1914dc2e3d706989ec3344ec2ae3f47843b
@@ -3,46 +3,72 @@ require 'rack/request'
3
3
  require 'rack/utils'
4
4
  begin
5
5
  require 'rack/conditional_get'
6
- rescue LoadError => ex
6
+ rescue LoadError
7
7
  require 'rack/conditionalget'
8
8
  end
9
9
 
10
10
  class Rack::GridServe
11
11
 
12
- VERSION = '0.0.8'
12
+ VERSION = '0.0.9'.freeze
13
+
14
+ DEFAULT_PREFIX = 'gridfs'.freeze
15
+ DEFAULT_CACHE_CONTROL = 'no-cache'.freeze
16
+ EDGE_SLASHES_RE = /\A\/|\/\z/.freeze
17
+ EMPTY_STRING = ''.freeze
13
18
 
14
19
  def initialize app, opts={}
15
20
  @app = app
16
21
  @db = opts[:db]
17
- @prefix = (opts[:prefix] || 'gridfs').gsub(/^\/|\/$/, '')
18
- @cache_control = opts[:cache_control] || 'no-cache'
22
+ @prefix = (opts[:prefix] || DEFAULT_PREFIX).gsub(EDGE_SLASHES_RE, EMPTY_STRING)
23
+ @prefix = "/#{@prefix}/".freeze
24
+ @cache_control = opts[:cache_control] || DEFAULT_CACHE_CONTROL
19
25
  end
20
26
 
21
- def call env
22
- dup._call env
23
- end
27
+ PATH_INFO = 'PATH_INFO'.freeze
28
+ CONTENT_TYPE = 'Content-Type'.freeze
29
+ CONTENT_LENGTH = 'Content-Length'.freeze
30
+ LAST_MODIFIED = 'Last-Modified'.freeze
31
+ CACHE_CONTROL = 'Cache-Control'.freeze
32
+ ETAG = 'ETag'.freeze
33
+ TEXT_PLAIN = 'text/plain'.freeze
34
+ NOT_FOUND = 'Not Found'.freeze
35
+ NOT_FOUND_RESPONSE = [
36
+ 404,
37
+ {
38
+ CONTENT_TYPE => TEXT_PLAIN
39
+ }.freeze,
40
+ [NOT_FOUND].freeze
41
+ ].freeze
42
+ UPLOAD_DATE_KEY = 'uploadDate'.freeze
43
+ CONTENT_TYPE_KEY = 'contentType'.freeze
44
+ ID_KEY = '_id'.freeze
45
+ MD5_KEY = 'md5'.freeze
24
46
 
25
- def _call env
26
- req = Rack::Request.new env
27
- if under_prefix? req
28
- file = find_file req
47
+ def call env
48
+ path_info = env[PATH_INFO].to_s
49
+ if under_prefix? path_info
50
+ file = find_file path_info
29
51
  if file.nil?
30
- [404, {'Content-Type'=>'text/plain'}, ['Not Found']]
52
+ NOT_FOUND_RESPONSE
31
53
  else
32
- last_modified = Time.at file['uploadDate'].to_i
54
+ last_modified = Time.at file[UPLOAD_DATE_KEY].to_i
33
55
  headers = {
34
- 'Content-Type' => file['contentType'],
35
- 'ETag' => file['md5'],
36
- 'Last-Modified' => last_modified.httpdate,
37
- 'Cache-Control' => @cache_control
56
+ CONTENT_TYPE => file[CONTENT_TYPE_KEY],
57
+ ETAG => file[MD5_KEY],
58
+ LAST_MODIFIED => last_modified.httpdate,
59
+ CACHE_CONTROL => @cache_control
38
60
  }
39
- Rack::ConditionalGet.new(lambda {|cg_env|
61
+ if can_use_cached?(env, file[MD5_KEY])
62
+ headers.delete(CONTENT_TYPE)
63
+ headers.delete(CONTENT_LENGTH)
64
+ [304, headers, []]
65
+ else
40
66
  content = String.new
41
- @db.fs.open_download_stream(file['_id']) do |stream|
67
+ @db.fs.open_download_stream(file[ID_KEY]) do |stream|
42
68
  content = stream.read
43
69
  end
44
70
  [200, headers, [content]]
45
- }).call(env)
71
+ end
46
72
  end
47
73
  else
48
74
  @app.call env
@@ -51,12 +77,12 @@ class Rack::GridServe
51
77
 
52
78
  private
53
79
 
54
- def under_prefix? req
55
- req.path_info =~ %r|^/#@prefix/(.*)|
80
+ def under_prefix? path_info
81
+ path_info.start_with?(@prefix) and path_info.size > @prefix.size
56
82
  end
57
83
 
58
- def id_or_filename req
59
- str = req.path_info.sub %r|^/#@prefix/|, ''
84
+ def id_or_filename path_info
85
+ str = path_info.sub @prefix, EMPTY_STRING
60
86
  if BSON::ObjectId.legal? str
61
87
  BSON::ObjectId.from_string str
62
88
  else
@@ -64,13 +90,15 @@ class Rack::GridServe
64
90
  end
65
91
  end
66
92
 
67
- def find_file req
68
- str = id_or_filename req
93
+ OR = '$or'.freeze
94
+
95
+ def find_file path_info
96
+ str = id_or_filename path_info
69
97
  if str.is_a? BSON::ObjectId
70
98
  @db.fs.find({_id: str}).first
71
99
  else
72
100
  @db.fs.find({
73
- '$or' => [
101
+ OR => [
74
102
  {filename: str},
75
103
  {filename: "/#{str}"}
76
104
  ]
@@ -78,5 +106,15 @@ class Rack::GridServe
78
106
  end
79
107
  end
80
108
 
109
+ READ_METHODS = ['GET'.freeze, 'HEAD'.freeze].freeze
110
+ REQUEST_METHOD = 'REQUEST_METHOD'.freeze
111
+ HTTP_IF_NONE_MATCH = 'HTTP_IF_NONE_MATCH'.freeze
112
+
113
+ def can_use_cached? env, md5
114
+ READ_METHODS.include?(env[REQUEST_METHOD]) and
115
+ env[HTTP_IF_NONE_MATCH] and
116
+ env[HTTP_IF_NONE_MATCH] == md5
117
+ end
118
+
81
119
  end
82
120
 
data/test.rb CHANGED
@@ -4,6 +4,8 @@ require 'rack/grid_serve'
4
4
  require 'rack/test'
5
5
  require 'minitest/autorun'
6
6
 
7
+ Mongo::Logger.logger.level = Logger::ERROR
8
+
7
9
  MONGO = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'rack-grid-serve-test')
8
10
  DB = MONGO.database
9
11
  DB.drop
@@ -43,7 +45,7 @@ class TestRackGridServe < MiniTest::Test
43
45
  include Helpers
44
46
 
45
47
  def app
46
- Rack::Lint.new(Rack::GridServe.new(inner_app, db: DB))
48
+ Rack::Lint.new(Rack::GridServe.new(inner_app, db: DB).freeze).freeze
47
49
  end
48
50
 
49
51
  def test_finds_file_by_id
@@ -108,11 +110,13 @@ class TestRackGridServePrefix < MiniTest::Test
108
110
  include Helpers
109
111
 
110
112
  def app
111
- Rack::Lint.new(Rack::GridServe.new(inner_app, db: DB, prefix: '/attachment/prefix/'))
113
+ Rack::Lint.new(
114
+ Rack::GridServe.new(inner_app, db: DB, prefix: '/attachment/prefix/').freeze
115
+ ).freeze
112
116
  end
113
117
 
114
118
  def test_finds_file_with_custom_prefix
115
- prefix = "/attachment/prefix/"
119
+ # prefix = "/attachment/prefix/"
116
120
  get '/attachment/prefix/tmnt.css'
117
121
  assert_file_found
118
122
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-grid-serve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mickael Riga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-04 00:00:00.000000000 Z
11
+ date: 2019-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  version: '0'
103
103
  requirements: []
104
104
  rubyforge_project:
105
- rubygems_version: 2.6.8
105
+ rubygems_version: 2.4.5.1
106
106
  signing_key:
107
107
  specification_version: 4
108
108
  summary: Rack middleware for serving files stored in MongoDB GridFS