rack-app 2.0.0 → 2.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6883859ca0d72bc8fac97ac3b745a225bdbede0e
4
- data.tar.gz: d53e14b3621d6290af628d6e11880629728eb206
3
+ metadata.gz: fcb9bbf91b7776d8c02a6c59f386ddb5893e68e9
4
+ data.tar.gz: a28f17db847b1242e62407da66beebe838ff7543
5
5
  SHA512:
6
- metadata.gz: 80e9b3a47d3158c15837ca297e0a87f244859beae87ffbcedf59fc9a42987c19a63e7a2eab0c3c4b906bd5e66ed959b6461deb475dddca8e4772765211bfd587
7
- data.tar.gz: da9cded93beb9b94645842ea4022f67b68633f0ee0c99355a53e217c6a79460ac375fbe43e3d73cbb63f5d082918b86594f5b64d9bdb30c8ec789096e0d336cb
6
+ metadata.gz: 9e291f4fda263c63f7bba524094789f8ae213cebe6c908453ed39fe8534b31a81d517539d15d0a01fa621213a3d33661ead8da980ca4aefb2d80cb69253b805e
7
+ data.tar.gz: 2a70f922341c3bda2209d1728d3e8021a5cd514177f03b4fd3454b6dce67e9d002595325d9e432f11b57063efc563cc6654306bda34f25af14ce74071ec95696
data/README.md CHANGED
@@ -79,6 +79,8 @@ Yes, in fact it's already powering heroku hosted micro-services.
79
79
  * made with performance in mind so your app don't lose time by your framework
80
80
  * per endpoint middleware definitions
81
81
  * you can define middleware stack before endpoints and it will only applied to them, similar like protected method workflow
82
+ * File Upload and file download in a efficient and elegant way with minimal memory consuming
83
+ * note that this is not only memory friendly way pure rack solution, but also 2x faster than the usualy solution which includes buffering in memory
82
84
 
83
85
  ## Usage
84
86
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0
1
+ 2.1.0
@@ -1,45 +1,13 @@
1
1
  module Rack::App::InstanceMethods
2
2
 
3
- attr_writer :request, :response
4
-
5
- def params
6
- @__params__ ||= Rack::App::Params.new(request.env).to_hash
7
- end
8
-
9
- def request
10
- @request || raise("request object is not set for #{self.class}")
11
- end
12
-
13
- def response
14
- @response || raise("response object is not set for #{self.class}")
15
- end
16
-
17
- def payload
18
- @__payload__ ||= lambda {
19
- return nil unless @request.body.respond_to?(:gets)
20
-
21
- payload = ''
22
- while chunk = @request.body.gets
23
- payload << chunk
24
- end
25
- @request.body.rewind
26
-
27
- return payload
28
- }.call
29
- end
30
-
31
- def redirect_to(url)
32
- url = "#{url}?#{request.env['QUERY_STRING']}" unless request.env['QUERY_STRING'].empty?
33
- response.status = 301
34
- response.headers.merge!({'Location' => url})
35
- 'See Ya!'
36
- end
37
-
38
- def serve_file(file_path)
39
- raw_rack_resp = Rack::App::FileServer.serve_file(request.env, file_path)
40
- response.headers.merge!(raw_rack_resp[1])
41
- response.body = raw_rack_resp.last
42
- return nil
43
- end
3
+ require 'rack/app/instance_methods/core'
4
+ require 'rack/app/instance_methods/http_control'
5
+ require 'rack/app/instance_methods/payload'
6
+ require 'rack/app/instance_methods/upload'
7
+
8
+ include Rack::App::InstanceMethods::Core
9
+ include Rack::App::InstanceMethods::HttpControl
10
+ include Rack::App::InstanceMethods::Payload
11
+ include Rack::App::InstanceMethods::Upload
44
12
 
45
13
  end
@@ -0,0 +1,18 @@
1
+ module Rack::App::InstanceMethods::Core
2
+
3
+ attr_writer :request, :response
4
+
5
+ def params
6
+ @__params__ ||= Rack::App::Params.new(request.env).to_hash
7
+ end
8
+
9
+ def request
10
+ @request || raise("request object is not set for #{self.class}")
11
+ end
12
+
13
+ def response
14
+ @response || raise("response object is not set for #{self.class}")
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,11 @@
1
+ module Rack::App::InstanceMethods::HttpControl
2
+
3
+ def redirect_to(url)
4
+ url = "#{url}?#{request.env['QUERY_STRING']}" unless request.env['QUERY_STRING'].empty?
5
+ response.status = 301
6
+ response.headers.merge!({'Location' => url})
7
+ 'See Ya!'
8
+ end
9
+
10
+ end
11
+
@@ -0,0 +1,29 @@
1
+ module Rack::App::InstanceMethods::Payload
2
+
3
+ def payload_stream(&block)
4
+ return nil unless @request.body.respond_to?(:gets)
5
+ while chunk = request.body.gets
6
+ block.call(chunk)
7
+ end
8
+ request.body.rewind
9
+ nil
10
+ end
11
+
12
+ def payload
13
+ @__payload__ ||= lambda {
14
+
15
+ payload = ''
16
+ payload_stream { |chunk| payload << chunk }
17
+ return payload
18
+
19
+ }.call
20
+ end
21
+
22
+ def payload_to_file(file_path, file_mod='w')
23
+ File.open(file_path, file_mod) do |file|
24
+ payload_stream { |chunk| file.print(chunk) }
25
+ end
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,11 @@
1
+ module Rack::App::InstanceMethods::Upload
2
+
3
+ def serve_file(file_path)
4
+ raw_rack_resp = Rack::App::FileServer.serve_file(request.env, file_path)
5
+ response.headers.merge!(raw_rack_resp[1])
6
+ response.body = raw_rack_resp.last
7
+ return nil
8
+ end
9
+
10
+ end
11
+
data/lib/rack/app/test.rb CHANGED
@@ -58,8 +58,23 @@ module Rack::App::Test
58
58
  properties = format_properties(raw_properties)
59
59
  additional_headers = properties[:headers].reduce({}) { |m, (k, v)| m.merge("HTTP_#{k.to_s.gsub('-', '_').upcase}" => v.to_s) }
60
60
 
61
+
61
62
  payload = raw_properties.delete(:payload)
62
- additional_headers["rack.input"]= ::Rack::Lint::InputWrapper.new(StringIO.new(payload.to_s)) if payload.is_a?(String)
63
+
64
+ io = case payload
65
+
66
+ when IO
67
+ payload
68
+
69
+ when String
70
+ StringIO.new(payload.to_s)
71
+
72
+ else
73
+ StringIO.new('')
74
+
75
+ end
76
+
77
+ additional_headers["rack.input"]= ::Rack::Lint::InputWrapper.new(io)
63
78
 
64
79
  {
65
80
  "REMOTE_ADDR" => "192.168.56.1",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
@@ -95,6 +95,10 @@ files:
95
95
  - lib/rack/app/error_handler.rb
96
96
  - lib/rack/app/file_server.rb
97
97
  - lib/rack/app/instance_methods.rb
98
+ - lib/rack/app/instance_methods/core.rb
99
+ - lib/rack/app/instance_methods/http_control.rb
100
+ - lib/rack/app/instance_methods/payload.rb
101
+ - lib/rack/app/instance_methods/upload.rb
98
102
  - lib/rack/app/params.rb
99
103
  - lib/rack/app/request_configurator.rb
100
104
  - lib/rack/app/router.rb