webmachine 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Gem Version](https://badge.fury.io/rb/webmachine.svg)](https://badge.fury.io/rb/webmachine)
|
3
|
+
[![Build Status](https://travis-ci.org/webmachine/webmachine-ruby.svg)](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