vayacondios-server 0.2.6 → 0.2.7
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.
- data/app/http_shim.rb +25 -6
- data/config/vayacondios.example.yaml +1 -1
- data/config/vayacondios.yaml +1 -1
- data/lib/vayacondios-server.rb +2 -1
- data/lib/vayacondios/client/legacy_switch.rb +3 -7
- data/lib/vayacondios/legacy_switch.rb +3 -7
- data/lib/vayacondios/server/legacy_switch.rb +3 -7
- data/lib/vayacondios/server/rack/jsonize.rb +39 -0
- data/lib/vayacondios/server/rack/params.rb +50 -0
- data/lib/vayacondios/version.rb +1 -1
- data/pom.xml +2 -2
- metadata +6 -5
- data/lib/vayacondios/server/rack/assume_json.rb +0 -13
data/app/http_shim.rb
CHANGED
@@ -4,22 +4,41 @@ require 'gorillib/logger/log'
|
|
4
4
|
require 'vayacondios-server'
|
5
5
|
|
6
6
|
class HttpShim < Goliath::API
|
7
|
+
use Goliath::Rack::Heartbeat # respond to /status with 200, OK (monitoring, etc)
|
8
|
+
use Vayacondios::Rack::JSONize
|
7
9
|
use Goliath::Rack::Tracer, 'X-Tracer' # log trace statistics
|
8
|
-
use
|
10
|
+
use Vayacondios::Rack::Params # parse query string and message body into params hash
|
11
|
+
# use Goliath::Rack::Params # parse query string and message body into params hash
|
9
12
|
use Goliath::Rack::Validation::RequestMethod, %w[GET PUT PATCH DELETE] # only allow these methods
|
10
13
|
use Vayacondios::Rack::ExtractMethods # interpolate GET, PUT into :create, :update, etc
|
11
14
|
use Vayacondios::Rack::Path # parse path into parameterized pieces
|
12
15
|
use Vayacondios::Rack::PathValidation # validate the existence of env[:vayacondios_path]
|
13
16
|
use Goliath::Rack::Formatters::JSON # JSON output formatter
|
14
17
|
use Goliath::Rack::Render # auto-negotiate response format
|
15
|
-
|
18
|
+
|
19
|
+
# The document part of the request, e.g. - params that came
|
20
|
+
# directly from its body.
|
21
|
+
#
|
22
|
+
# Something somewhere in Rack is unhappy when receiving
|
23
|
+
# non-Hash-like records via a JSON-formatted request body. So that
|
24
|
+
# Vayacondios::Rack::Params takes a non-Hash-like request body and
|
25
|
+
# turns it into a Hash with a single key: _document.
|
26
|
+
#
|
27
|
+
# This hack does **not** affect the client-side: clients can still
|
28
|
+
# send non-Hash-like JSON documents and they will be interpreted
|
29
|
+
# as intended.
|
30
|
+
#
|
31
|
+
# @return [Hash,Array,String,Fixnum,nil] any native JSON datatype
|
32
|
+
def document
|
33
|
+
params['_document'] || params
|
34
|
+
end
|
16
35
|
|
17
36
|
def response(env)
|
18
37
|
path_params = env[:vayacondios_path]
|
19
38
|
klass = ('vayacondios/' + path_params[:type] + '_handler').camelize.constantize
|
20
39
|
|
21
40
|
Log.info("received request #{env['REQUEST_METHOD']} #{env['REQUEST_URI']}")
|
22
|
-
Log.info("params: #{
|
41
|
+
Log.info("params: #{document}")
|
23
42
|
|
24
43
|
begin
|
25
44
|
case env[:vayacondios_method]
|
@@ -29,15 +48,15 @@ class HttpShim < Goliath::API
|
|
29
48
|
[200, {}, MultiJson.dump(record.body)]
|
30
49
|
|
31
50
|
when :update
|
32
|
-
record = klass.new(mongo).update(
|
51
|
+
record = klass.new(mongo).update(document, path_params)
|
33
52
|
[200, {}, nil]
|
34
53
|
|
35
54
|
when :patch
|
36
|
-
record = klass.new(mongo).patch(
|
55
|
+
record = klass.new(mongo).patch(document, path_params)
|
37
56
|
[200, {}, nil]
|
38
57
|
|
39
58
|
when :delete
|
40
|
-
record = klass.find(mongo, path_params).destroy(
|
59
|
+
record = klass.find(mongo, path_params).destroy(document)
|
41
60
|
[200, {}, MultiJson.dump(record.body)]
|
42
61
|
end
|
43
62
|
rescue Vayacondios::Error::NotFound => ex
|
data/config/vayacondios.yaml
CHANGED
data/lib/vayacondios-server.rb
CHANGED
@@ -22,7 +22,8 @@ require 'vayacondios/server/handlers/config_handler'
|
|
22
22
|
require 'vayacondios/server/handlers/event_handler'
|
23
23
|
require 'vayacondios/server/handlers/itemset_handler'
|
24
24
|
|
25
|
-
require 'vayacondios/server/rack/assume_json'
|
26
25
|
require 'vayacondios/server/rack/extract_methods'
|
26
|
+
require 'vayacondios/server/rack/params'
|
27
|
+
require 'vayacondios/server/rack/jsonize'
|
27
28
|
require 'vayacondios/server/rack/path'
|
28
29
|
require 'vayacondios/server/rack/path_validation'
|
@@ -8,18 +8,14 @@ class Vayacondios
|
|
8
8
|
def wrap_contents(contents) {contents: contents} end
|
9
9
|
def extract_contents(document) document['contents'] end
|
10
10
|
def extract_response(document) document['contents'] end
|
11
|
-
def proper_request(document)
|
12
|
-
document.is_a? Hash and document.fetch('_json', {}).is_a? Hash
|
13
|
-
end
|
11
|
+
def proper_request(document) true end
|
14
12
|
end
|
15
13
|
|
16
14
|
class LegacyContentsHandler
|
17
15
|
def wrap_contents(contents) contents end
|
18
|
-
def extract_contents(document) document
|
16
|
+
def extract_contents(document) document end
|
19
17
|
def extract_response(document) document end
|
20
|
-
def proper_request(document)
|
21
|
-
document.is_a? Array or document.fetch('_json', {}).is_a? Array
|
22
|
-
end
|
18
|
+
def proper_request(document) true end
|
23
19
|
end
|
24
20
|
|
25
21
|
@@legacy_switch = nil
|
@@ -8,18 +8,14 @@ class Vayacondios
|
|
8
8
|
def wrap_contents(contents) {contents: contents} end
|
9
9
|
def extract_contents(document) document['contents'] end
|
10
10
|
def extract_response(document) document['contents'] end
|
11
|
-
def proper_request(document)
|
12
|
-
document.is_a? Hash and document.fetch('_json', {}).is_a? Hash
|
13
|
-
end
|
11
|
+
def proper_request(document) true end
|
14
12
|
end
|
15
13
|
|
16
14
|
class LegacyContentsHandler
|
17
15
|
def wrap_contents(contents) contents end
|
18
|
-
def extract_contents(document) document
|
16
|
+
def extract_contents(document) document end
|
19
17
|
def extract_response(document) document end
|
20
|
-
def proper_request(document)
|
21
|
-
document.is_a? Array or document.fetch('_json', {}).is_a? Array
|
22
|
-
end
|
18
|
+
def proper_request(document) true end
|
23
19
|
end
|
24
20
|
|
25
21
|
@@legacy_switch = nil
|
@@ -8,18 +8,14 @@ class Vayacondios
|
|
8
8
|
def wrap_contents(contents) {contents: contents} end
|
9
9
|
def extract_contents(document) document['contents'] end
|
10
10
|
def extract_response(document) document['contents'] end
|
11
|
-
def proper_request(document)
|
12
|
-
document.is_a? Hash and document.fetch('_json', {}).is_a? Hash
|
13
|
-
end
|
11
|
+
def proper_request(document) true end
|
14
12
|
end
|
15
13
|
|
16
14
|
class LegacyContentsHandler
|
17
15
|
def wrap_contents(contents) contents end
|
18
|
-
def extract_contents(document) document
|
16
|
+
def extract_contents(document) document end
|
19
17
|
def extract_response(document) document end
|
20
|
-
def proper_request(document)
|
21
|
-
document.is_a? Array or document.fetch('_json', {}).is_a? Array
|
22
|
-
end
|
18
|
+
def proper_request(document) true end
|
23
19
|
end
|
24
20
|
|
25
21
|
@@legacy_switch = nil
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Vayacondios
|
2
|
+
module Rack
|
3
|
+
|
4
|
+
# Sets the `Content-Type` of the request and response to
|
5
|
+
# `application/json`.
|
6
|
+
class JSONize
|
7
|
+
include Goliath::Rack::AsyncMiddleware
|
8
|
+
|
9
|
+
# Sets the `Content-Type` header to `application/json` so
|
10
|
+
# downstream parameter parsing will work correctly.
|
11
|
+
#
|
12
|
+
# @param [Hash] env the request environment
|
13
|
+
def call(env)
|
14
|
+
env.logger.debug("Started #{env[Goliath::Request::REQUEST_METHOD]} \"#{env[Goliath::Request::REQUEST_PATH]}\" for #{env[Goliath::Request::REMOTE_ADDR]} as JSON")
|
15
|
+
env['CONTENT_TYPE'] = 'application/json'
|
16
|
+
super(env)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sets the `Content-Type` header to `application/json` and
|
20
|
+
# serializes the response body to a JSON string.
|
21
|
+
#
|
22
|
+
# Will *not* do this if the request was sent to `/status` which
|
23
|
+
# is expected to just return the string `OK`.
|
24
|
+
#
|
25
|
+
# @param [Hash] env the request environment
|
26
|
+
# @param [Integer] status the HTTP status code of the response
|
27
|
+
# @param [Hash] headers the HTTP headers of the response
|
28
|
+
# @param [Object] body the upstream response body
|
29
|
+
# @return [Array] the response
|
30
|
+
def post_process(env, status, headers, body)
|
31
|
+
return [status, headers, body] if env["REQUEST_PATH"] == '/status'
|
32
|
+
headers['Content-Type'] = 'application/json'
|
33
|
+
body = [MultiJson.encode(body) + "\n"]
|
34
|
+
[status, headers, body]
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Vayacondios
|
2
|
+
module Rack
|
3
|
+
|
4
|
+
# Parses parameters in the request.
|
5
|
+
#
|
6
|
+
# Will parse parameters from the query string as well as from the
|
7
|
+
# request body.
|
8
|
+
#
|
9
|
+
# Rack gets unhappy when the parameters are anything other than a
|
10
|
+
# Hash but we want clients to be able to send non-Hash-like
|
11
|
+
# request bodies. To support this case, the request's params are
|
12
|
+
# stored into the `_document` key of the params, to be fetched
|
13
|
+
# later by Vayacondios::HttpServer#document.
|
14
|
+
class Params < Goliath::Rack::Params
|
15
|
+
|
16
|
+
# Parses the parameters of the request.
|
17
|
+
#
|
18
|
+
# @param [Hash] env the request environment
|
19
|
+
def retrieve_params(env)
|
20
|
+
params = {}
|
21
|
+
params.merge!(::Rack::Utils.parse_nested_query(env['QUERY_STRING']))
|
22
|
+
|
23
|
+
if env['rack.input']
|
24
|
+
post_params = ::Rack::Utils::Multipart.parse_multipart(env)
|
25
|
+
unless post_params
|
26
|
+
body = env['rack.input'].read
|
27
|
+
return params if body.empty?
|
28
|
+
env['rack.input'].rewind
|
29
|
+
|
30
|
+
post_params = case(env['CONTENT_TYPE'])
|
31
|
+
when Goliath::Rack::URL_ENCODED then
|
32
|
+
::Rack::Utils.parse_nested_query(body)
|
33
|
+
when Goliath::Rack::JSON_ENCODED then
|
34
|
+
MultiJson.decode(body)
|
35
|
+
else
|
36
|
+
{}
|
37
|
+
end
|
38
|
+
if post_params.is_a?(Hash)
|
39
|
+
params.merge!(post_params)
|
40
|
+
else
|
41
|
+
params['_document'] = post_params
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
params
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/vayacondios/version.rb
CHANGED
data/pom.xml
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
<groupId>com.infochimps</groupId>
|
5
5
|
<artifactId>vayacondios</artifactId>
|
6
6
|
<packaging>jar</packaging>
|
7
|
-
<!-- ICSVERS --><version>1.
|
7
|
+
<!-- ICSVERS --><version>1.7.0-SNAPSHOT</version>
|
8
8
|
<name>java-common</name>
|
9
9
|
<url>http://maven.apache.org</url>
|
10
10
|
|
11
11
|
<parent>
|
12
12
|
<groupId>com.infochimps</groupId>
|
13
13
|
<artifactId>parent-pom</artifactId>
|
14
|
-
<!-- ICSVERS --><version>1.
|
14
|
+
<!-- ICSVERS --><version>1.7.0-SNAPSHOT</version>
|
15
15
|
<relativePath></relativePath>
|
16
16
|
</parent>
|
17
17
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vayacondios-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2013-
|
15
|
+
date: 2013-08-08 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: configliere
|
@@ -222,8 +222,9 @@ files:
|
|
222
222
|
- lib/vayacondios/server/model/document.rb
|
223
223
|
- lib/vayacondios/server/model/event_document.rb
|
224
224
|
- lib/vayacondios/server/model/itemset_document.rb
|
225
|
-
- lib/vayacondios/server/rack/assume_json.rb
|
226
225
|
- lib/vayacondios/server/rack/extract_methods.rb
|
226
|
+
- lib/vayacondios/server/rack/jsonize.rb
|
227
|
+
- lib/vayacondios/server/rack/params.rb
|
227
228
|
- lib/vayacondios/server/rack/path.rb
|
228
229
|
- lib/vayacondios/server/rack/path_validation.rb
|
229
230
|
- lib/vayacondios/version.rb
|
@@ -279,7 +280,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
279
280
|
version: '0'
|
280
281
|
segments:
|
281
282
|
- 0
|
282
|
-
hash:
|
283
|
+
hash: 1685170955492084086
|
283
284
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
284
285
|
none: false
|
285
286
|
requirements:
|
@@ -288,7 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
288
289
|
version: '0'
|
289
290
|
segments:
|
290
291
|
- 0
|
291
|
-
hash:
|
292
|
+
hash: 1685170955492084086
|
292
293
|
requirements: []
|
293
294
|
rubyforge_project:
|
294
295
|
rubygems_version: 1.8.25
|