angelo 0.1.13 → 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5eddbc45b846a99f2c3970949b8bcaea4a8da2a
4
- data.tar.gz: b03151aeabb0265da3b371d1dbaa9023de404499
3
+ metadata.gz: ab8dc2d9fc7243d0fafec32530e5509351ecfcec
4
+ data.tar.gz: 37488c61321c6ffd9d4524371eb295fd2b425a8b
5
5
  SHA512:
6
- metadata.gz: b398233f7e0e60a647661ff90c92f78485e23561a64243548f5eacc59b8f7d07918c03d071520ffee784bf921d23d40afc189224ce6b3290e4eacd295622a078
7
- data.tar.gz: 33d0251cf93ef34be952eecdfa5969f0e4278b8f22a73e00ee8ec5ee8a68b44d4cd797e51bc8a18425f04714f20246e95d26d67c8ab58f2362d4dd5aa60e4bc3
6
+ metadata.gz: 07c8b7aef24a27aece1e2d012bfd910598445241943b24714f21739cfbef8ac686c7594c873331fb4f71702af1dd11d7161db74861fdc79464bcea2abb822f81
7
+ data.tar.gz: 32ffbf2ce2540b29be61110aeaf7b14aef8d21fb50634ee07692e32eac0cb3a25ec7b0a356cdd5804ffb748df7e8e2b7cae5a8d2efaaee867154ba4be54ee616
data/.gitignore CHANGED
@@ -1,3 +1,2 @@
1
1
  angelo-*.gem
2
- Gemfile.lock
3
2
  tmp
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  changelog
2
2
  =========
3
3
 
4
+ ### 0.1.14 3 jul 2014
5
+
6
+ * add send_file with disposition support
7
+ * remove disposition header from static file serving
8
+
4
9
  ### 0.1.13 19 jun 2014
5
10
 
6
11
  * add log level settings
data/Gemfile.lock ADDED
@@ -0,0 +1,63 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ celluloid (0.15.2)
5
+ timers (~> 1.1.0)
6
+ celluloid-io (0.15.0)
7
+ celluloid (>= 0.15.0)
8
+ nio4r (>= 0.5.0)
9
+ coderay (1.1.0)
10
+ ffi (1.9.3-java)
11
+ http (0.6.1)
12
+ http_parser.rb (~> 0.6.0)
13
+ http_parser.rb (0.6.0)
14
+ http_parser.rb (0.6.0-java)
15
+ httpclient (2.4.0)
16
+ method_source (0.8.2)
17
+ mime-types (2.3)
18
+ minitest (5.3.5)
19
+ mustermann (0.2.0)
20
+ nio4r (1.0.0)
21
+ nio4r (1.0.0-java)
22
+ pry (0.9.12.6)
23
+ coderay (~> 1.0)
24
+ method_source (~> 0.8)
25
+ slop (~> 3.4)
26
+ pry (0.9.12.6-java)
27
+ coderay (~> 1.0)
28
+ method_source (~> 0.8)
29
+ slop (~> 3.4)
30
+ spoon (~> 0.0)
31
+ pry-nav (0.2.3)
32
+ pry (~> 0.9.10)
33
+ reel (0.5.0)
34
+ celluloid (>= 0.15.1)
35
+ celluloid-io (>= 0.15.0)
36
+ http (>= 0.6.0.pre)
37
+ http_parser.rb (>= 0.6.0)
38
+ websocket_parser (>= 0.1.6)
39
+ ruby-prof (0.15.1)
40
+ slop (3.5.0)
41
+ spoon (0.0.4)
42
+ ffi
43
+ tilt (2.0.1)
44
+ timers (1.1.0)
45
+ websocket-driver (0.3.3)
46
+ websocket-driver (0.3.3-java)
47
+ websocket_parser (0.1.6)
48
+
49
+ PLATFORMS
50
+ java
51
+ ruby
52
+
53
+ DEPENDENCIES
54
+ httpclient
55
+ mime-types
56
+ minitest
57
+ mustermann
58
+ pry
59
+ pry-nav
60
+ reel
61
+ ruby-prof
62
+ tilt
63
+ websocket-driver
data/lib/angelo.rb CHANGED
@@ -21,7 +21,7 @@ module Angelo
21
21
  CONTENT_TYPE_HEADER_KEY = 'Content-Type'
22
22
  CONTENT_DISPOSITION_HEADER_KEY = 'Content-Disposition'
23
23
  CONTENT_LENGTH_HEADER_KEY = 'Content-Length'
24
- DEFAULT_CONTENT_DISPOSITION = 'attachment'
24
+ ATTACHMENT_CONTENT_DISPOSITION = 'attachment; filename="%s"'
25
25
  ETAG_HEADER_KEY = 'ETag'
26
26
  IF_NONE_MATCH_HEADER_KEY = 'If-None-Match'
27
27
  LOCATION_HEADER_KEY = 'Location'
data/lib/angelo/base.rb CHANGED
@@ -119,6 +119,13 @@ module Angelo
119
119
  sleep
120
120
  end
121
121
 
122
+ def local_path path
123
+ if public_dir
124
+ lp = File.join(public_dir, path)
125
+ File.file?(lp) ? lp : nil
126
+ end
127
+ end
128
+
122
129
  end
123
130
 
124
131
  def async meth, *args
@@ -172,6 +179,28 @@ module Angelo
172
179
  throw :halt, HALT_STRUCT.new(status, body)
173
180
  end
174
181
 
182
+ def send_file local_file, opts = {}
183
+ lp = self.class.local_path local_file
184
+
185
+ # Content-Type
186
+ #
187
+ headers CONTENT_TYPE_HEADER_KEY =>
188
+ (MIME::Types.type_for(File.extname(lp))[0].content_type rescue HTML_TYPE)
189
+
190
+ # Content-Disposition
191
+ #
192
+ if opts[:disposition] == :attachment or opts[:filename]
193
+ headers CONTENT_DISPOSITION_HEADER_KEY =>
194
+ ATTACHMENT_CONTENT_DISPOSITION % (opts[:filename] or File.basename(lp))
195
+ end
196
+
197
+ # Content-Length
198
+ #
199
+ headers CONTENT_LENGTH_HEADER_KEY => File.size(lp)
200
+
201
+ halt 200, File.read(lp)
202
+ end
203
+
175
204
  end
176
205
 
177
206
  end
data/lib/angelo/server.rb CHANGED
@@ -36,7 +36,7 @@ module Angelo
36
36
  private
37
37
 
38
38
  def dispatch! meth, connection, request
39
- if staticable?(meth) and lp = local_path(request.path)
39
+ if staticable?(meth) and lp = @base.local_path(request.path)
40
40
  static! meth, connection, request, lp
41
41
  else
42
42
  route! meth, connection, request
@@ -56,13 +56,6 @@ module Angelo
56
56
  end
57
57
  end
58
58
 
59
- def local_path path
60
- if @base.public_dir
61
- lp = File.join(@base.public_dir, path)
62
- File.file?(lp) ? lp : nil
63
- end
64
- end
65
-
66
59
  def staticable? meth
67
60
  STATICABLE.include? meth
68
61
  end
@@ -80,11 +73,6 @@ module Angelo
80
73
  CONTENT_TYPE_HEADER_KEY =>
81
74
  (MIME::Types.type_for(File.extname(local_path))[0].content_type rescue HTML_TYPE),
82
75
 
83
- # Content-Disposition
84
- #
85
- CONTENT_DISPOSITION_HEADER_KEY =>
86
- DEFAULT_CONTENT_DISPOSITION + "; filename=#{File.basename local_path}",
87
-
88
76
  # Content-Length
89
77
  #
90
78
  CONTENT_LENGTH_HEADER_KEY => File.size(local_path),
@@ -1,3 +1,3 @@
1
1
  module Angelo
2
- VERSION = '0.1.13'
2
+ VERSION = '0.1.14'
3
3
  end
@@ -5,7 +5,7 @@ describe Angelo::Server do
5
5
 
6
6
  describe 'serving static files' do
7
7
 
8
- let(:css_etag) do
8
+ def css_etag
9
9
  fs = File::Stat.new File.join(TEST_APP_ROOT, 'public', 'test.css')
10
10
  OpenSSL::Digest::SHA.hexdigest fs.ino.to_s + fs.size.to_s + fs.mtime.to_s
11
11
  end
@@ -18,13 +18,25 @@ describe Angelo::Server do
18
18
  'you should not see this'
19
19
  end
20
20
 
21
+ get '/img' do
22
+ send_file 'what.png'
23
+ end
24
+
25
+ get '/what' do
26
+ send_file 'what.png', disposition: :attachment
27
+ end
28
+
29
+ get '/attachment.png' do
30
+ send_file 'what.png', filename: 'attachment.png'
31
+ end
32
+
21
33
  end
22
34
 
23
35
  it 'serves static files for gets' do
24
36
  get '/test.css'
25
37
  last_response.status.must_equal 200
26
38
  last_response.headers['Content-Type'].must_equal 'text/css'
27
- last_response.headers['Content-Disposition'].must_equal 'attachment; filename=test.css'
39
+ last_response.headers['Content-Disposition'].must_be_nil
28
40
  last_response.headers['Content-Length'].must_equal '116'
29
41
  last_response.headers['Etag'].must_equal css_etag
30
42
  last_response.body.to_s.length.must_equal 116
@@ -35,7 +47,7 @@ describe Angelo::Server do
35
47
  head '/test.css'
36
48
  last_response.status.must_equal 200
37
49
  last_response.headers['Content-Type'].must_equal 'text/css'
38
- last_response.headers['Content-Disposition'].must_equal 'attachment; filename=test.css'
50
+ last_response.headers['Content-Disposition'].must_be_nil
39
51
  last_response.headers['Content-Length'].must_equal '116'
40
52
  last_response.headers['Etag'].must_equal css_etag
41
53
  last_response.body.to_s.length.must_equal 0
@@ -45,7 +57,7 @@ describe Angelo::Server do
45
57
  get '/test.html'
46
58
  last_response.status.must_equal 200
47
59
  last_response.headers['Content-Type'].must_equal 'text/html'
48
- last_response.headers['Content-Disposition'].must_equal 'attachment; filename=test.html'
60
+ last_response.headers['Content-Disposition'].must_be_nil
49
61
  last_response.body.to_s.must_equal File.read(File.join TEST_APP_ROOT, 'public', 'test.html')
50
62
  end
51
63
 
@@ -67,6 +79,26 @@ describe Angelo::Server do
67
79
  end
68
80
  end
69
81
 
70
- end
82
+ it 'sends files' do
83
+ get '/img'
84
+ last_response.status.must_equal 200
85
+ last_response.headers['Content-Type'].must_equal 'image/png'
86
+ last_response.headers['Content-Disposition'].must_be_nil
87
+ end
88
+
89
+ it 'sends files with attachment disposition' do
90
+ get '/what'
91
+ last_response.status.must_equal 200
92
+ last_response.headers['Content-Type'].must_equal 'image/png'
93
+ last_response.headers['Content-Disposition'].must_equal 'attachment; filename="what.png"'
94
+ end
71
95
 
96
+ it 'sends files as different filename' do
97
+ get '/attachment.png'
98
+ last_response.status.must_equal 200
99
+ last_response.headers['Content-Type'].must_equal 'image/png'
100
+ last_response.headers['Content-Disposition'].must_equal 'attachment; filename="attachment.png"'
101
+ end
102
+
103
+ end
72
104
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: angelo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.13
4
+ version: 0.1.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenichi Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-19 00:00:00.000000000 Z
11
+ date: 2014-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: reel
@@ -49,6 +49,7 @@ files:
49
49
  - ".travis.yml"
50
50
  - CHANGELOG.md
51
51
  - Gemfile
52
+ - Gemfile.lock
52
53
  - LICENSE
53
54
  - README.md
54
55
  - Rakefile