crossbar-http 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +30 -7
- data/crossbar-http.gemspec +2 -0
- data/lib/crossbar-http/client.rb +55 -9
- data/lib/crossbar-http/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bb9f8a404140d6b70bd23f5d8b89f09313b2a19
|
4
|
+
data.tar.gz: 6b78516ba76055fa4dd962ba85fa0a74247e3b49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea38d47f7104caaf5008a680a9026c12cd46b4d355094badbf4a2a8790b345beb92516f856e2f069c9af2b249e88ba223670f90490b36b0541ef026eb5b8e9f6
|
7
|
+
data.tar.gz: b3b137f07ba6f11a94fb81fed455540e220195d0628b2233280ae77cfdbe4f12134621ce6e5a4d82186c67fbf7f4db6f30e84ecd47e260c6fdef291defe0ea2f
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
# Crossbar HTTP
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/crossbar-http.svg)](https://badge.fury.io/rb/crossbar-http)
|
4
|
+
[![Circle CI](https://circleci.com/gh/ericchapman/ruby-crossbar-http/tree/master.svg?&style=shield&circle-token=d1d127456bc9210c10f34db5b6fd573fb228bed7)](https://circleci.com/gh/ericchapman/ruby-crossbar-http/tree/master)
|
5
|
+
[![Codecov](https://img.shields.io/codecov/c/github/ericchapman/ruby-crossbar-http/master.svg)](https://codecov.io/github/ericchapman/ruby-crossbar-http)
|
4
6
|
|
5
7
|
Module that provides methods for accessing Crossbar.io HTTP Bridge Services
|
6
8
|
|
7
9
|
## Revision History
|
8
10
|
|
9
|
-
- v0.1.
|
10
|
-
-
|
11
|
+
- v0.1.2:
|
12
|
+
- Added the ability to override the date serialization
|
11
13
|
- v0.1.1:
|
12
14
|
- Fixed typos in README
|
13
|
-
- Added support for https
|
15
|
+
- Added support for https
|
16
|
+
- v0.1.0:
|
17
|
+
- Initial version
|
14
18
|
|
15
19
|
## Installation
|
16
20
|
|
@@ -60,18 +64,37 @@ def onJoin(self, details):
|
|
60
64
|
```
|
61
65
|
|
62
66
|
### Key/Secret
|
63
|
-
For bridge services that have a key and secret defined, simply include the key and secret
|
64
|
-
client.
|
67
|
+
For bridge services that have a key and secret defined, simply include the key and secret
|
68
|
+
in the instantiation of the client.
|
65
69
|
|
66
70
|
``` ruby
|
67
71
|
client = Crossbar::HTTP::Client.new("http://127.0.0.1/publish", key: "key", secret: "secret")
|
68
72
|
```
|
69
73
|
|
74
|
+
### Pre-Serialize Callback
|
75
|
+
The library provides a "pre-serialize" callback which will allow the user to
|
76
|
+
modify certain object types before the payload is serialized. This can be used
|
77
|
+
for things like changing the date/time to a custom value. See an example of
|
78
|
+
doing this below
|
79
|
+
|
80
|
+
``` ruby
|
81
|
+
pre_serialize = lambda { |value|
|
82
|
+
if value.is_a? Date
|
83
|
+
return value.strftime("%Y/%m/%d %H:%M:%S.%L %Z")
|
84
|
+
end
|
85
|
+
}
|
86
|
+
client = Crossbar::HTTP::Client.new("http://127.0.0.1/publish", pre_serialize: pre_serialize)
|
87
|
+
```
|
88
|
+
|
70
89
|
## Contributing
|
71
90
|
To contribute, fork the repo and submit a pull request.
|
72
91
|
|
73
92
|
## Testing
|
74
|
-
|
93
|
+
To run the unit tests, execute the following
|
94
|
+
|
95
|
+
```
|
96
|
+
%> rake spec
|
97
|
+
```
|
75
98
|
|
76
|
-
##License
|
99
|
+
## License
|
77
100
|
MIT
|
data/crossbar-http.gemspec
CHANGED
@@ -24,4 +24,6 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.13'
|
25
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'simplecov', '~> 0.12.0'
|
28
|
+
spec.add_development_dependency 'codecov'
|
27
29
|
end
|
data/lib/crossbar-http/client.rb
CHANGED
@@ -33,14 +33,15 @@ require 'json'
|
|
33
33
|
module Crossbar
|
34
34
|
module HTTP
|
35
35
|
class Client
|
36
|
-
attr_accessor :url, :key, :secret, :verbose, :sequence
|
36
|
+
attr_accessor :url, :key, :secret, :verbose, :sequence, :pre_serialize
|
37
37
|
|
38
38
|
# Initializes the client
|
39
39
|
# @param url [String] - The url of the router's HTTP bridge
|
40
40
|
# @param key [String] - The key (optional)
|
41
41
|
# @param secret [String] - The secret (optional)
|
42
42
|
# @param verbose [Bool] - 'True' if you want debug messages printed
|
43
|
-
|
43
|
+
# @param pre_serialize [lambda] - Lambda to format the data
|
44
|
+
def initialize(url, key: nil, secret: nil, verbose: false, pre_serialize: nil)
|
44
45
|
|
45
46
|
raise 'The url can not be nil' unless url != nil
|
46
47
|
|
@@ -48,6 +49,7 @@ module Crossbar
|
|
48
49
|
self.key = key
|
49
50
|
self.secret = secret
|
50
51
|
self.verbose = verbose
|
52
|
+
self.pre_serialize = pre_serialize
|
51
53
|
self.sequence = 1
|
52
54
|
end
|
53
55
|
|
@@ -83,15 +85,34 @@ module Crossbar
|
|
83
85
|
self._make_api_call(params)
|
84
86
|
end
|
85
87
|
|
88
|
+
# Parses the params to pre-serialize the overrides
|
89
|
+
def _parse_params(params)
|
90
|
+
|
91
|
+
if params.is_a? Hash
|
92
|
+
return_value = {}
|
93
|
+
params.each do |key, value|
|
94
|
+
return_value[key] = self._parse_params(value)
|
95
|
+
end
|
96
|
+
elsif params.is_a? Array
|
97
|
+
return_value = []
|
98
|
+
params.each_index {|i|
|
99
|
+
return_value.push(self._parse_params (params[i]))
|
100
|
+
}
|
101
|
+
else
|
102
|
+
return_value = self.pre_serialize.call(params) || params
|
103
|
+
end
|
104
|
+
|
105
|
+
return_value
|
106
|
+
end
|
107
|
+
|
86
108
|
# Computes the signature.
|
87
109
|
# Described at: http://crossbar.io/docs/HTTP-Bridge-Services-Caller/
|
88
110
|
# Reference code is at: https://github.com/crossbario/crossbar/blob/master/crossbar/adapter/rest/common.py
|
89
111
|
# @param body [Hash]
|
90
112
|
# @return (signature, nonce, timestamp)
|
91
|
-
def _compute_signature(body
|
92
|
-
|
93
|
-
|
94
|
-
nonce ||= rand(0..2**53)
|
113
|
+
def _compute_signature(body)
|
114
|
+
timestamp = self.class._get_timestamp
|
115
|
+
nonce = self.class._get_nonce
|
95
116
|
|
96
117
|
# Compute signature: HMAC[SHA256]_{secret} (key | timestamp | seq | nonce | body) => signature
|
97
118
|
hm = OpenSSL::HMAC.new(self.secret, OpenSSL::Digest::SHA256.new)
|
@@ -105,11 +126,28 @@ module Crossbar
|
|
105
126
|
return signature, nonce, timestamp
|
106
127
|
end
|
107
128
|
|
129
|
+
def self._get_timestamp
|
130
|
+
Time.now.utc.strftime('%Y-%m-%dT%H:%M:%S.%LZ')
|
131
|
+
end
|
132
|
+
|
133
|
+
def self._get_nonce
|
134
|
+
rand(0..2**53)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Performs the API call
|
138
|
+
# @param json_params [Hash,nil] The parameters that will make up the body of the request
|
139
|
+
# @return [Hash] The response from the server
|
108
140
|
def _make_api_call(json_params=nil)
|
109
141
|
|
110
142
|
puts "Crossbar::HTTP - Request: POST #{url}" if self.verbose
|
111
143
|
|
112
|
-
encoded_params =
|
144
|
+
encoded_params = nil
|
145
|
+
if json_params != nil
|
146
|
+
if self.pre_serialize&.is_a? Proc
|
147
|
+
json_params = self._parse_params json_params
|
148
|
+
end
|
149
|
+
encoded_params = JSON.generate(json_params)
|
150
|
+
end
|
113
151
|
|
114
152
|
puts "Crossbar::HTTP - Params: #{encoded_params}" if encoded_params != nil and self.verbose
|
115
153
|
|
@@ -132,11 +170,20 @@ module Crossbar
|
|
132
170
|
# TODO: Not sure what this is supposed to be but this works
|
133
171
|
self.sequence += 1
|
134
172
|
|
173
|
+
self._api_call uri, encoded_params
|
174
|
+
end
|
175
|
+
|
176
|
+
# This method makes tha API call. It is a class method so it can be more easily stubbed
|
177
|
+
# for testing
|
178
|
+
# @param uri [URI] The uri of the request
|
179
|
+
# @param body [String] The body of the request
|
180
|
+
# @return [Hash] The response from the server
|
181
|
+
def _api_call(uri, body=nil)
|
135
182
|
# Create the request
|
136
183
|
res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
|
137
184
|
req = Net::HTTP::Post.new(uri)
|
138
185
|
req['Content-Type'] = 'application/json'
|
139
|
-
req.body =
|
186
|
+
req.body = body
|
140
187
|
|
141
188
|
http.request(req)
|
142
189
|
end
|
@@ -148,7 +195,6 @@ module Crossbar
|
|
148
195
|
else
|
149
196
|
raise "Crossbar::HTTP - Code: #{res.code}, Error: #{res.message}"
|
150
197
|
end
|
151
|
-
|
152
198
|
end
|
153
199
|
end
|
154
200
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crossbar-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Chapman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.12.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.12.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: codecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
description: ''
|
56
84
|
email:
|
57
85
|
- eric.chappy@gmail.com
|