webmachine 1.5.0 → 1.6.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 +5 -5
- data/CHANGELOG.md +7 -0
- data/Gemfile +2 -0
- data/README.md +3 -1
- data/documentation/examples.md +12 -6
- data/lib/webmachine/adapters/rack.rb +12 -2
- data/lib/webmachine/constants.rb +2 -2
- data/lib/webmachine/decision/conneg.rb +3 -3
- data/lib/webmachine/decision/flow.rb +2 -2
- data/lib/webmachine/dispatcher/route.rb +16 -2
- data/lib/webmachine/spec/test_resource.rb +6 -1
- data/lib/webmachine/version.rb +1 -1
- data/spec/webmachine/adapters/rack_spec.rb +5 -0
- data/spec/webmachine/decision/fsm_spec.rb +1 -1
- data/spec/webmachine/dispatcher/rfc3986_percent_decode_spec.rb +22 -0
- metadata +29 -30
- data/bethtemp +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: edddc1a3a4d7be22971484644cbf1bece06b2ba0f95ab5c8a3ed08cf485982b2
|
4
|
+
data.tar.gz: 4a1e642ad3fb3a1a57e8eee886393802f7b85f8ecb81bf9f06812577fe253840
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89062ab939aadad0f1a41d3c3b85d030acf0e4668b5d06b0c65ad4a4425284bdaf60ece3af7e76f2b9eacc02cf2052f657cfb491372fef62463dad4324933617
|
7
|
+
data.tar.gz: 0a6078e13d68abaa7692675f5057e3b69d06dd5311d6e662a176490f427b6d1a1053bd3e5e0ed82fa9536eab421f05285e54939a2c900ca364347a361c21b21a
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
### HEAD
|
2
2
|
|
3
|
+
### 1.6.0 June 22, 2021
|
4
|
+
|
5
|
+
* fix: replace missed URI.decode with new Route.rfc3986_percent_decode (#261)
|
6
|
+
* fix: implement rfc3986 Percent-Encoding decoder
|
7
|
+
* feat: make rack env available on the webmachine request when using a rack adapter
|
8
|
+
|
3
9
|
### 1.5.0 September 8, 2017
|
10
|
+
|
4
11
|
* Removed Fixnum/Integer deprecation warnings in Ruby 2.4
|
5
12
|
* Fixed multiple cookie setting code
|
6
13
|
* Added support for named captures
|
data/Gemfile
CHANGED
@@ -12,11 +12,13 @@ group :test do
|
|
12
12
|
gem "rspec-its", "~> 1.2"
|
13
13
|
gem "rack", "~> 2.0"
|
14
14
|
gem "rack-test", "~> 0.7"
|
15
|
+
gem "websocket_parser", "~>1.0"
|
15
16
|
end
|
16
17
|
|
17
18
|
group :webservers do
|
18
19
|
gem 'reel', '~> 0.5.0'
|
19
20
|
gem 'http', '~> 0.6.0'
|
21
|
+
gem 'celluloid', '0.17.4' # Refactors in 0.18.0 break the tests
|
20
22
|
gem 'httpkit', :platform => [:mri, :rbx]
|
21
23
|
end
|
22
24
|
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
# webmachine for Ruby
|
1
|
+
# webmachine for Ruby
|
2
|
+
[](https://badge.fury.io/rb/webmachine)
|
3
|
+
[](https://travis-ci.org/webmachine/webmachine-ruby)
|
2
4
|
|
3
5
|
webmachine-ruby is a port of
|
4
6
|
[Webmachine](https://github.com/basho/webmachine), which is written in
|
data/documentation/examples.md
CHANGED
@@ -92,12 +92,15 @@ end
|
|
92
92
|
```
|
93
93
|
|
94
94
|
# POST to perform a task
|
95
|
-
* Override `allowed_methods` and `
|
96
|
-
* `
|
97
|
-
*
|
95
|
+
* Override `allowed_methods`, `process_post`, and `content_types_provided` (if the response has a content type).
|
96
|
+
* Rather than providing a method handler in the `content_type_provided` mappings, put all the code to be executed in `process_post`.
|
97
|
+
* `process_post` must return true, or the HTTP response code.
|
98
98
|
|
99
99
|
```ruby
|
100
100
|
class DispatchOrderResource < Webmachine::Resource
|
101
|
+
def content_types_provided
|
102
|
+
[["application/json"]]
|
103
|
+
end
|
101
104
|
|
102
105
|
def allowed_methods
|
103
106
|
["POST"]
|
@@ -108,9 +111,8 @@ class DispatchOrderResource < Webmachine::Resource
|
|
108
111
|
end
|
109
112
|
|
110
113
|
def process_post
|
111
|
-
@order.dispatch
|
112
|
-
response.
|
113
|
-
response.body = "Successfully dispatched order #{id}"
|
114
|
+
@order.dispatch(params['some_param'])
|
115
|
+
response.body = { message: "Successfully dispatched order #{id}" }.to_json
|
114
116
|
true
|
115
117
|
end
|
116
118
|
|
@@ -119,6 +121,10 @@ class DispatchOrderResource < Webmachine::Resource
|
|
119
121
|
def id
|
120
122
|
request.path_info[:id]
|
121
123
|
end
|
124
|
+
|
125
|
+
def params
|
126
|
+
JSON.parse(request.body.to_s)
|
127
|
+
end
|
122
128
|
end
|
123
129
|
|
124
130
|
```
|
@@ -106,15 +106,25 @@ module Webmachine
|
|
106
106
|
|
107
107
|
private
|
108
108
|
def build_webmachine_request(rack_req, headers)
|
109
|
-
|
109
|
+
RackRequest.new(rack_req.request_method,
|
110
110
|
rack_req.url,
|
111
111
|
headers,
|
112
112
|
RequestBody.new(rack_req),
|
113
113
|
routing_tokens(rack_req),
|
114
|
-
base_uri(rack_req)
|
114
|
+
base_uri(rack_req),
|
115
|
+
rack_req.env
|
115
116
|
)
|
116
117
|
end
|
117
118
|
|
119
|
+
class RackRequest < Webmachine::Request
|
120
|
+
attr_reader :env
|
121
|
+
|
122
|
+
def initialize(method, uri, headers, body, routing_tokens, base_uri, env)
|
123
|
+
super(method, uri, headers, body, routing_tokens, base_uri)
|
124
|
+
@env = env
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
118
128
|
class RackResponse
|
119
129
|
ONE_FIVE = '1.5'.freeze
|
120
130
|
|
data/lib/webmachine/constants.rb
CHANGED
@@ -14,7 +14,7 @@ module Webmachine
|
|
14
14
|
# appropriate media type.
|
15
15
|
# @api private
|
16
16
|
def choose_media_type(provided, header)
|
17
|
-
types = Array(header).map{|h| h.split(
|
17
|
+
types = Array(header).map{|h| h.split(SPLIT_COMMA) }.flatten
|
18
18
|
requested = MediaTypeList.build(types)
|
19
19
|
provided = provided.map do |p| # normalize_provided
|
20
20
|
MediaType.parse(p)
|
@@ -57,7 +57,7 @@ module Webmachine
|
|
57
57
|
# @api private
|
58
58
|
def choose_language(provided, header)
|
59
59
|
if provided && !provided.empty?
|
60
|
-
requested = PriorityList.build(header.split(
|
60
|
+
requested = PriorityList.build(header.split(SPLIT_COMMA))
|
61
61
|
star_priority = requested.priority_of(STAR)
|
62
62
|
any_ok = star_priority && star_priority > 0.0
|
63
63
|
accepted = requested.find do |priority, range|
|
@@ -99,7 +99,7 @@ module Webmachine
|
|
99
99
|
# @api private
|
100
100
|
def do_choose(choices, header, default)
|
101
101
|
choices = choices.dup.map {|s| s.downcase }
|
102
|
-
accepted = PriorityList.build(header.split(
|
102
|
+
accepted = PriorityList.build(header.split(SPLIT_COMMA))
|
103
103
|
default_priority = accepted.priority_of(default)
|
104
104
|
star_priority = accepted.priority_of(STAR)
|
105
105
|
default_ok = (default_priority.nil? && star_priority != 0.0) || default_priority
|
@@ -245,7 +245,7 @@ module Webmachine
|
|
245
245
|
|
246
246
|
# ETag in If-Match
|
247
247
|
def g11
|
248
|
-
request_etags = request.if_match.split(
|
248
|
+
request_etags = request.if_match.split(SPLIT_COMMA).map {|etag| ETag.new(etag) }
|
249
249
|
request_etags.include?(ETag.new(resource.generate_etag)) ? :h10 : 412
|
250
250
|
end
|
251
251
|
|
@@ -327,7 +327,7 @@ module Webmachine
|
|
327
327
|
|
328
328
|
# Etag in if-none-match?
|
329
329
|
def k13
|
330
|
-
request_etags = request.if_none_match.split(
|
330
|
+
request_etags = request.if_none_match.split(SPLIT_COMMA).map {|etag| ETag.new(etag) }
|
331
331
|
resource_etag = resource.generate_etag
|
332
332
|
if resource_etag && request_etags.include?(ETag.new(resource_etag))
|
333
333
|
:j18
|
@@ -120,7 +120,7 @@ module Webmachine
|
|
120
120
|
when tokens.empty?
|
121
121
|
return false
|
122
122
|
when Regexp === spec.first
|
123
|
-
matches = spec.first.match
|
123
|
+
matches = spec.first.match Route.rfc3986_percent_decode(tokens.first)
|
124
124
|
if matches
|
125
125
|
if spec.first.named_captures.empty?
|
126
126
|
bindings[:captures] = (bindings[:captures] || []) + matches.captures
|
@@ -134,7 +134,7 @@ module Webmachine
|
|
134
134
|
return false
|
135
135
|
end
|
136
136
|
when Symbol === spec.first
|
137
|
-
bindings[spec.first] =
|
137
|
+
bindings[spec.first] = Route.rfc3986_percent_decode(tokens.first)
|
138
138
|
when spec.first == tokens.first
|
139
139
|
else
|
140
140
|
return false
|
@@ -145,6 +145,20 @@ module Webmachine
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
+
# Decode a string using the scheme described in RFC 3986 2.1. Percent-Encoding (https://www.ietf.org/rfc/rfc3986.txt)
|
149
|
+
def self.rfc3986_percent_decode(value)
|
150
|
+
s = StringScanner.new(value)
|
151
|
+
result = ''
|
152
|
+
until s.eos?
|
153
|
+
encoded_val = s.scan(/%([0-9a-fA-F]){2}/)
|
154
|
+
result << if encoded_val.nil?
|
155
|
+
s.getch
|
156
|
+
else
|
157
|
+
[encoded_val[1..-1]].pack('H*')
|
158
|
+
end
|
159
|
+
end
|
160
|
+
result
|
161
|
+
end
|
148
162
|
end # class Route
|
149
163
|
end # module Dispatcher
|
150
164
|
end # module Webmachine
|
@@ -19,7 +19,8 @@ module Test
|
|
19
19
|
["test/response.fiberbody", :to_fiber],
|
20
20
|
["test/response.iobody", :to_io_body],
|
21
21
|
["test/response.cookies", :to_cookies],
|
22
|
-
["test/response.request_uri", :to_request_uri]
|
22
|
+
["test/response.request_uri", :to_request_uri],
|
23
|
+
["test/response.rack_env", :to_rack_env]
|
23
24
|
]
|
24
25
|
end
|
25
26
|
|
@@ -75,5 +76,9 @@ module Test
|
|
75
76
|
def to_request_uri
|
76
77
|
request.uri.to_s
|
77
78
|
end
|
79
|
+
|
80
|
+
def to_rack_env
|
81
|
+
request.env.to_json
|
82
|
+
end
|
78
83
|
end
|
79
84
|
end
|
data/lib/webmachine/version.rb
CHANGED
@@ -53,5 +53,10 @@ describe Webmachine::Adapters::Rack do
|
|
53
53
|
rack_response = get "test", nil, {"HTTP_ACCEPT" => "test/response.request_uri"}
|
54
54
|
expect(rack_response.body).to eq "http://example.org/test"
|
55
55
|
end
|
56
|
+
|
57
|
+
it "provides the rack env on the request" do
|
58
|
+
rack_response = get "test", nil, {"HTTP_ACCEPT" => "test/response.rack_env"}
|
59
|
+
expect(JSON.parse(rack_response.body).keys).to include "rack.input"
|
60
|
+
end
|
56
61
|
end
|
57
62
|
end
|
@@ -106,7 +106,7 @@ describe Webmachine::Decision::FSM do
|
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'does not call resource.finish_request again' do
|
109
|
-
expect(resource).
|
109
|
+
expect(resource).to receive(:finish_request).once
|
110
110
|
run_with_exception
|
111
111
|
end
|
112
112
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Webmachine::Dispatcher::Route do
|
4
|
+
describe '#rfc3986_percent_decode' do
|
5
|
+
def call_subject(value)
|
6
|
+
Webmachine::Dispatcher::Route.rfc3986_percent_decode(value)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'does not change un-encoded strings' do
|
10
|
+
expect(call_subject('this is a normal string, I think')).to eq 'this is a normal string, I think'
|
11
|
+
expect(call_subject('')).to eq ''
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'decodes percent encoded sequences' do
|
15
|
+
expect(call_subject('/tenants/esckimo+test%20%65')).to eq '/tenants/esckimo+test e'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'leaves incorrectly encoded sequences as is' do
|
19
|
+
expect(call_subject('/tenants/esckimo+test%2%65')).to eq '/tenants/esckimo+test%2e'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Cribbs
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -70,7 +70,6 @@ files:
|
|
70
70
|
- README.md
|
71
71
|
- RELEASING.md
|
72
72
|
- Rakefile
|
73
|
-
- bethtemp
|
74
73
|
- documentation/adapters.md
|
75
74
|
- documentation/authentication-and-authorization.md
|
76
75
|
- documentation/configurator.md
|
@@ -148,7 +147,6 @@ files:
|
|
148
147
|
- lib/webmachine/translation.rb
|
149
148
|
- lib/webmachine/version.rb
|
150
149
|
- memory_test.rb
|
151
|
-
- pkg/webmachine-1.5.0.gem
|
152
150
|
- spec/spec_helper.rb
|
153
151
|
- spec/webmachine/adapter_spec.rb
|
154
152
|
- spec/webmachine/adapters/httpkit_spec.rb
|
@@ -165,6 +163,7 @@ files:
|
|
165
163
|
- spec/webmachine/decision/flow_spec.rb
|
166
164
|
- spec/webmachine/decision/fsm_spec.rb
|
167
165
|
- spec/webmachine/decision/helpers_spec.rb
|
166
|
+
- spec/webmachine/dispatcher/rfc3986_percent_decode_spec.rb
|
168
167
|
- spec/webmachine/dispatcher/route_spec.rb
|
169
168
|
- spec/webmachine/dispatcher_spec.rb
|
170
169
|
- spec/webmachine/errors_spec.rb
|
@@ -185,7 +184,7 @@ homepage: http://github.com/seancribbs/webmachine-ruby
|
|
185
184
|
licenses:
|
186
185
|
- Apache-2.0
|
187
186
|
metadata: {}
|
188
|
-
post_install_message:
|
187
|
+
post_install_message:
|
189
188
|
rdoc_options: []
|
190
189
|
require_paths:
|
191
190
|
- lib
|
@@ -200,41 +199,41 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
199
|
- !ruby/object:Gem::Version
|
201
200
|
version: '0'
|
202
201
|
requirements: []
|
203
|
-
|
204
|
-
|
205
|
-
signing_key:
|
202
|
+
rubygems_version: 3.1.4
|
203
|
+
signing_key:
|
206
204
|
specification_version: 4
|
207
205
|
summary: webmachine is a toolkit for building HTTP applications,
|
208
206
|
test_files:
|
209
207
|
- spec/spec_helper.rb
|
208
|
+
- spec/webmachine/trace/fsm_spec.rb
|
209
|
+
- spec/webmachine/trace/resource_proxy_spec.rb
|
210
|
+
- spec/webmachine/trace/trace_store_spec.rb
|
211
|
+
- spec/webmachine/configuration_spec.rb
|
212
|
+
- spec/webmachine/dispatcher/route_spec.rb
|
213
|
+
- spec/webmachine/dispatcher/rfc3986_percent_decode_spec.rb
|
214
|
+
- spec/webmachine/rescueable_exception_spec.rb
|
215
|
+
- spec/webmachine/etags_spec.rb
|
216
|
+
- spec/webmachine/chunked_body_spec.rb
|
210
217
|
- spec/webmachine/adapter_spec.rb
|
211
|
-
- spec/webmachine/
|
212
|
-
- spec/webmachine/adapters/rack_mapped_spec.rb
|
213
|
-
- spec/webmachine/adapters/rack_spec.rb
|
218
|
+
- spec/webmachine/headers_spec.rb
|
214
219
|
- spec/webmachine/adapters/reel_spec.rb
|
220
|
+
- spec/webmachine/adapters/rack_spec.rb
|
221
|
+
- spec/webmachine/adapters/httpkit_spec.rb
|
215
222
|
- spec/webmachine/adapters/webrick_spec.rb
|
216
|
-
- spec/webmachine/
|
217
|
-
- spec/webmachine/
|
218
|
-
- spec/webmachine/
|
219
|
-
- spec/webmachine/
|
220
|
-
- spec/webmachine/decision/conneg_spec.rb
|
223
|
+
- spec/webmachine/adapters/rack_mapped_spec.rb
|
224
|
+
- spec/webmachine/request_spec.rb
|
225
|
+
- spec/webmachine/response_spec.rb
|
226
|
+
- spec/webmachine/decision/fsm_spec.rb
|
221
227
|
- spec/webmachine/decision/falsey_spec.rb
|
222
228
|
- spec/webmachine/decision/flow_spec.rb
|
223
|
-
- spec/webmachine/decision/fsm_spec.rb
|
224
229
|
- spec/webmachine/decision/helpers_spec.rb
|
225
|
-
- spec/webmachine/
|
226
|
-
- spec/webmachine/
|
227
|
-
- spec/webmachine/errors_spec.rb
|
228
|
-
- spec/webmachine/etags_spec.rb
|
229
|
-
- spec/webmachine/events_spec.rb
|
230
|
-
- spec/webmachine/headers_spec.rb
|
230
|
+
- spec/webmachine/decision/conneg_spec.rb
|
231
|
+
- spec/webmachine/cookie_spec.rb
|
231
232
|
- spec/webmachine/media_type_spec.rb
|
232
|
-
- spec/webmachine/
|
233
|
-
- spec/webmachine/rescueable_exception_spec.rb
|
233
|
+
- spec/webmachine/errors_spec.rb
|
234
234
|
- spec/webmachine/resource/authentication_spec.rb
|
235
|
-
- spec/webmachine/response_spec.rb
|
236
|
-
- spec/webmachine/trace/fsm_spec.rb
|
237
|
-
- spec/webmachine/trace/resource_proxy_spec.rb
|
238
|
-
- spec/webmachine/trace/trace_store_spec.rb
|
239
235
|
- spec/webmachine/trace_spec.rb
|
236
|
+
- spec/webmachine/application_spec.rb
|
237
|
+
- spec/webmachine/events_spec.rb
|
238
|
+
- spec/webmachine/dispatcher_spec.rb
|
240
239
|
- ".gitignore"
|
data/bethtemp
DELETED