lookout-rack-utils 3.0.1.11 → 3.1.0.12
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 +8 -8
- data/lib/lookout/rack/utils/request.rb +45 -1
- data/lib/lookout/rack/utils/version.rb +1 -1
- data/spec/request_spec.rb +48 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZmMzMzI1NjY3NDYxZmZhYjc4ZGZhMzVmODFjNTQ0NjlmNWIzMTQ5ZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YzJiOTE1MTJhMDU0N2I5Y2M2ODUzN2MxNzYzYzQ0NjI0MTg5YjU5Ng==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTJmYzY3NWM0NzBjMzk5MjdmYTkxYmMyZGEyYjAwOWNhYjM4OTAxYTgwMTM1
|
10
|
+
M2FjZTIwM2NmMTNhZjg4Mjk3YzI2NWMxYTM5YjljNmY0ZTMzNDFmZmVhZjU3
|
11
|
+
NmNkZWNjODk3Y2QyOTI5YmM4YjYwMzY3ZGMzYjFiMmNhMGM0YTM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MDkzODg2YTkyMzM1MTNiZDIyYjg3OWVlMzNkMjQ2NWIzMjc0OWVlMTgxNWMy
|
14
|
+
MjZiNDExNjQwZTAzNWZhMTNmNjE4NGM3ZDJlY2VjY2YxNjFjOGE0NGEzMWY5
|
15
|
+
YzJmMmJmNWQ2OGExYTJlNGZiMTliNDU3NzU5YWU4MWVmMGIwMjQ=
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require 'zlib'
|
2
|
+
|
1
3
|
module Lookout::Rack::Utils
|
2
4
|
module Request
|
3
5
|
ILLEGAL_CHARS_REGEX = /[<>]/
|
6
|
+
HTTP_CONTENT_ENCODING_KEY = "HTTP_CONTENT_ENCODING".freeze
|
7
|
+
CONTENT_ENCODING_GZIPPED = "gzip".freeze
|
4
8
|
|
5
9
|
# Return the raw, unprocessed request body
|
6
10
|
#
|
@@ -11,11 +15,32 @@ module Lookout::Rack::Utils
|
|
11
15
|
return request.body.read
|
12
16
|
end
|
13
17
|
|
14
|
-
#
|
18
|
+
# Return the body, which is gunzipped only if the appropriate header is set on the request
|
15
19
|
#
|
16
20
|
# Will halt and create a a 400 status code if there is something wrong with
|
17
21
|
# the body
|
18
22
|
#
|
23
|
+
# @return [String]
|
24
|
+
def gunzipped_body
|
25
|
+
body = raw_body
|
26
|
+
if request.env[HTTP_CONTENT_ENCODING_KEY] != CONTENT_ENCODING_GZIPPED
|
27
|
+
return body
|
28
|
+
else
|
29
|
+
begin
|
30
|
+
return gunzip(body)
|
31
|
+
rescue Zlib::Error
|
32
|
+
if defined?(Lookout::Rack::Utils::Log)
|
33
|
+
Lookout::Rack::Utils::Log.instance.warn "Unzipping error when decompressing request body (#{body})"
|
34
|
+
end
|
35
|
+
halt 400, "{}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Process and parse the request body as JSON
|
41
|
+
#
|
42
|
+
# Will halt and create a a 400 status code if there is something wrong with
|
43
|
+
# the body
|
19
44
|
def body_as_json
|
20
45
|
body = raw_body
|
21
46
|
|
@@ -31,5 +56,24 @@ module Lookout::Rack::Utils
|
|
31
56
|
halt 400, "{}"
|
32
57
|
end
|
33
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Decompresses data
|
63
|
+
#
|
64
|
+
# @raise [Zlib::Error] if malformed data is provided
|
65
|
+
# @return [String]
|
66
|
+
def gunzip(data)
|
67
|
+
# We set the window bits to MAX_WBITS + 32 to enable zlib and gzip decoding
|
68
|
+
# with automatic header detection.
|
69
|
+
zstream = Zlib::Inflate.new(Zlib::MAX_WBITS+32)
|
70
|
+
begin
|
71
|
+
decompressed = zstream.inflate(data)
|
72
|
+
ensure
|
73
|
+
zstream.close
|
74
|
+
end
|
75
|
+
decompressed
|
76
|
+
end
|
77
|
+
|
34
78
|
end
|
35
79
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'lookout/rack/utils/request'
|
3
|
+
require 'zlib'
|
4
|
+
|
5
|
+
class TestHelper
|
6
|
+
attr_accessor :request
|
7
|
+
|
8
|
+
include Lookout::Rack::Utils::Request
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
describe Lookout::Rack::Utils::Request do
|
16
|
+
let(:helper) { TestHelper.new }
|
17
|
+
let(:sample_data) {'i am groot'}
|
18
|
+
let(:zipped_sample_data){Zlib::Deflate.deflate(sample_data)}
|
19
|
+
|
20
|
+
describe '#gunzipped_body' do
|
21
|
+
|
22
|
+
before :each do
|
23
|
+
helper.request = Object.new
|
24
|
+
helper.request.stub(:env).and_return({'HTTP_CONTENT_ENCODING' => 'gzip'})
|
25
|
+
helper.request.stub(:body).and_return(double)
|
26
|
+
helper.request.body.stub(:rewind).and_return(double)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should unzip data zipped data properly' do
|
30
|
+
helper.request.body.stub(:read).and_return(zipped_sample_data)
|
31
|
+
expect(helper.gunzipped_body).to eq(sample_data)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should do nothing if encoding is not set' do
|
35
|
+
helper.request.stub(:env).and_return({})
|
36
|
+
helper.request.body.stub(:read).and_return(zipped_sample_data)
|
37
|
+
expect(helper.gunzipped_body).to eq(zipped_sample_data)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should halt and throw and 400 when we have badly encoded data' do
|
41
|
+
allow_any_instance_of(Lookout::Rack::Utils::Log).to receive(:warn)
|
42
|
+
helper.request.body.stub(:read).and_return(sample_data)
|
43
|
+
expect(helper).to receive(:halt).with(400, "{}")
|
44
|
+
helper.gunzipped_body
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lookout-rack-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.1.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian Smith
|
@@ -216,6 +216,7 @@ files:
|
|
216
216
|
- spec/graphite_spec.rb
|
217
217
|
- spec/i18n_spec.rb
|
218
218
|
- spec/log_spec.rb
|
219
|
+
- spec/request_spec.rb
|
219
220
|
- spec/spec_helper.rb
|
220
221
|
- spec/subroute_spec.rb
|
221
222
|
- spec/support/routehelpers.rb
|
@@ -248,6 +249,7 @@ test_files:
|
|
248
249
|
- spec/graphite_spec.rb
|
249
250
|
- spec/i18n_spec.rb
|
250
251
|
- spec/log_spec.rb
|
252
|
+
- spec/request_spec.rb
|
251
253
|
- spec/spec_helper.rb
|
252
254
|
- spec/subroute_spec.rb
|
253
255
|
- spec/support/routehelpers.rb
|