rb-net_http-client 1.0.1 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 864953a6821c8556cd571a116d852aadb39810fbe41c672ce4a4d0a9d37ad0cc
4
- data.tar.gz: 53fbde8821ae8c0610dc7ad7b1b798b92728df13fc05fd1bad0ca620dfb61761
3
+ metadata.gz: 5d6b584195ee54303f03e597cedf0863b804496d00fe7dc23e1c95a72685d27e
4
+ data.tar.gz: bd2031391105c97823c38fe5422b497617e50bcbe77d0fe82138b191a6a8dd6f
5
5
  SHA512:
6
- metadata.gz: fecbe20848e6f55335b16cbe3d5a8f418a1b5843a69aac09fa9f068eb67ccb08c407ca3226357c4595d9e2ccb60454b6e06357b6c7fba109d297098ffba47d7b
7
- data.tar.gz: 7d5ffbc523f9c97bc3e241c7ca41f117f2ba51849d69b540c0e4ad5d5f8d30a221a4c09012812ab95d8c029c61ff030b8042eb2d46d175c028a1c638fb4ab2eb
6
+ metadata.gz: 3a1d80d3519cdd9b8ba725906ae951c70f70ed67a5f992650e66b0b3d31707eecc1608a03a241cb6c15aaf683e2ca7be4dcf814bdc7284aec53d16d2097b3617
7
+ data.tar.gz: 1519c8ecfaa3075ffa1db0ede1467c0b465c851464c721c118d25516656ff2abc63c67f3448fbdc5a23f3d668efe04d1ef660cf078cb4ab6546fa33fcc8c7b50
data/lib/client/client.rb CHANGED
@@ -12,19 +12,18 @@ module NetHTTP
12
12
  attr_reader :ca_file,
13
13
  :cert,
14
14
  :client,
15
- :host,
16
15
  :key,
17
16
  :logger,
18
- :path,
17
+ :open_timeout,
19
18
  :pkcs12,
20
- :port,
21
19
  :proxy_uri,
22
- :open_timeout,
20
+ :proxy_url,
21
+ :query,
23
22
  :read_timeout,
24
23
  :response,
25
- :scheme,
26
24
  :ssl_path,
27
25
  :uri,
26
+ :url,
28
27
  :use_proxy,
29
28
  :use_ssl,
30
29
  :verify_mode
@@ -32,19 +31,14 @@ module NetHTTP
32
31
  def initialize(opts = {})
33
32
  send('logger=', opts[:logger])
34
33
  Core.schema_validation(opts, NetHTTP::Client::Schema, logger) unless opts[:enforce_schema_validation] == false
35
- send('uri=', (opts[:uri] || opts[:url]))
34
+ send('uri=', opts)
36
35
  send('client=', opts)
37
36
  end
38
37
 
39
38
  def client=(opts = {})
40
39
  @client = Net::HTTP.new(uri.host, uri.port)
41
40
 
42
- send('scheme=', uri.scheme)
43
- send('host=', uri.host)
44
- send('port=', uri.port)
45
- send('path=', uri.path)
46
- send('proxy_uri=', (opts[:proxy_uri] ||= opts[:proxy_url]))
47
- send('use_proxy=')
41
+ send('proxy_uri=', opts)
48
42
  send('open_timeout=', (opts[:open_timeout] ||= 60))
49
43
  send('read_timeout=', (opts[:read_timeout] ||= 60))
50
44
  send('use_ssl=', opts[:use_ssl], uri.scheme)
@@ -68,12 +62,14 @@ module NetHTTP
68
62
  end
69
63
  end
70
64
 
71
- private :logger,
72
- :response
65
+ private :response
73
66
 
74
67
  def logger=(logger = nil)
75
68
  @logger = Core.get_logger(logger)
76
69
  end
70
+
71
+ alias proxy_url proxy_uri
72
+ alias url uri
77
73
  end
78
74
 
79
75
  module_function
data/lib/client/ext.rb CHANGED
@@ -2,40 +2,48 @@
2
2
 
3
3
  module NetHTTP
4
4
  class Client
5
- def scheme=(scheme = nil)
6
- @scheme = scheme
7
- end
8
-
9
- def host=(host = nil)
10
- @host = host
11
- end
12
-
13
- def port=(port = nil)
14
- @port = port
15
- end
16
-
17
- def path=(path = nil)
18
- @path = path
19
- end
20
-
21
- def use_proxy=
22
- if proxy_uri.nil?
23
- @use_proxy = false
24
- else
25
- @use_proxy = true
5
+ def proxy_uri=(opts = {})
6
+ proxy_uri = opts[:proxy_uri] ||= opts[:proxy_url] ||= ENV['http_proxy'] ||= ENV['HTTP_PROXY'] ||= ENV['https_proxy'] ||= ENV['HTTPS_PROXY']
7
+
8
+ begin
9
+ if proxy_uri.to_s.empty? == false
10
+ @proxy_uri = Core::Utilities.parse_uri(proxy_uri)
11
+ else
12
+ @proxy_uri = Core::Utilities.parse_uri(
13
+ Core::Utilities.construct_uri(
14
+ scheme: opts[:proxy_uri_scheme],
15
+ host: opts[:proxy_uri_host],
16
+ port: opts[:proxy_uri_port],
17
+ path: opts[:proxy_uri_path],
18
+ query: opts[:proxy_uri_query]
19
+ )
20
+ )
21
+ end
22
+ rescue RuntimeError => error
23
+ logger.debug(error)
24
+ @proxy_uri = nil
26
25
  end
27
26
  end
28
27
 
29
- def proxy_uri=(proxy_uri = nil)
30
- proxy_uri = ENV['http_proxy'] ||= ENV['HTTP_PROXY'] ||= ENV['https_proxy'] ||= ENV['HTTPS_PROXY'] if proxy_uri.nil?
31
- @proxy_uri = Core::Utilities.parse_uri(proxy_uri)
32
- end
33
-
34
- def uri=(uri = nil)
35
- if !uri.nil?
36
- @uri = Core::Utilities.parse_uri(uri)
37
- else
38
- @uri = Core::Utilities.parse_uri(Core::Utilities.construct_uri(opts[:scheme], opts[:host], opts[:port], opts[:path]))
28
+ def uri=(opts = {})
29
+ uri = opts[:uri] ||= opts[:url]
30
+ begin
31
+ if uri.to_s.empty? == false
32
+ @uri = Core::Utilities.parse_uri(uri)
33
+ else
34
+ @uri = Core::Utilities.parse_uri(
35
+ Core::Utilities.construct_uri(
36
+ scheme: opts[:scheme],
37
+ host: opts[:host],
38
+ port: opts[:port],
39
+ path: opts[:path],
40
+ query: opts[:query]
41
+ )
42
+ )
43
+ end
44
+ rescue RuntimeError => error
45
+ logger.debug(error)
46
+ @uri = nil
39
47
  end
40
48
  end
41
49
 
data/lib/client/schema.rb CHANGED
@@ -6,24 +6,37 @@ module NetHTTP
6
6
  class Client
7
7
  Schema = Dry::Validation.Schema do
8
8
  configure do
9
+ def name
10
+ 'NetHTTP::Client::Schema'
11
+ end
12
+
9
13
  def true_or_false
10
14
  [true, false]
11
15
  end
12
16
  end
13
17
 
14
- optional(:logger).filled
15
- optional(:uri).maybe(type?: String)
16
- optional(:url).maybe(type?: String)
17
- optional(:scheme).maybe(type?: String)
18
+ optional(:ca_file).filled(type?: String)
18
19
  optional(:host).maybe(type?: String)
19
- optional(:port).maybe(type?: Integer)
20
+ optional(:logger).filled
21
+ optional(:open_timeout).filled(type?: Integer)
20
22
  optional(:path).maybe(type?: String)
23
+ optional(:port).maybe(type?: Integer)
24
+ optional(:pkcs12_file).filled(type?: String)
25
+ optional(:pkcs12_passphrase).filled(type?: String)
26
+ optional(:proxy_uri_host).maybe(type?: String)
27
+ optional(:proxy_uri_path).maybe(type?: String)
28
+ optional(:proxy_uri_port).maybe(type?: Integer)
29
+ optional(:proxy_uri_scheme).maybe(type?: String)
21
30
  optional(:proxy_uri).filled(type?: String)
22
31
  optional(:proxy_url).filled(type?: String)
23
- optional(:use_proxy).filled(included_in?: true_or_false)
24
- optional(:use_ssl).filled(included_in?: true_or_false)
25
- optional(:open_timeout).filled(type?: Integer)
32
+ optional(:query).filled(type?: String)
26
33
  optional(:read_timeout).filled(type?: Integer)
34
+ optional(:scheme).maybe(type?: String)
35
+ optional(:ssl_path).filled(type?: String)
36
+ optional(:uri).maybe(type?: String)
37
+ optional(:url).maybe(type?: String)
38
+ optional(:use_ssl).filled(included_in?: true_or_false)
39
+ optional(:verify_mode).filled
27
40
 
28
41
  rule(if_url_and_uri_are_nil_must_provide_host: [:uri, :url, :host]) do |uri, url, host|
29
42
  uri.empty?.then(url.empty?.then(host.filled?))
data/lib/core/core.rb CHANGED
@@ -16,11 +16,22 @@ module NetHTTP
16
16
  end
17
17
 
18
18
  def self.schema_validation(opts, schema, logger)
19
- results = schema.call(opts)
20
- return if results.success?
21
-
22
- logger.debug("NetHTTP::Core::SchemaValidationError - #{schema} input validation failed due to => #{results.messages}")
23
- raise "NetHTTP::Core::SchemaValidationError - #{schema} input validation failed."
19
+ begin
20
+ results = schema.call(opts)
21
+ return if results.success?
22
+ begin
23
+ schema_name = schema.name
24
+ logger.debug("NetHTTP::Core::SchemaValidationError - #{schema_name} input validation failed due to => #{results.messages}")
25
+ raise("NetHTTP::Core::SchemaValidationError - #{schema_name} input validation failed due to => #{results.messages}")
26
+ rescue RuntimeError => error
27
+ logger.debug("NetHTTP::Core::SchemaValidationError - Dry::Validation::Schema input validation failed due to => #{results.messages}")
28
+ raise("NetHTTP::Core::SchemaValidationError - Dry::Validation::Schema input validation failed due to => #{results.messages}")
29
+ end
30
+ rescue RuntimeError => error
31
+ logger.debug(error)
32
+ logger.debug("NetHTTP::Core::SchemaValidationError - Dry::Validation::Schema input validation failed.")
33
+ raise error
34
+ end
24
35
  end
25
36
  end
26
37
  end
@@ -9,38 +9,55 @@ module NetHTTP
9
9
  class Core
10
10
  class Utilities
11
11
  def self.construct_uri(uri = {})
12
- return nil if uri[:host].nil?
13
-
14
- scheme = case uri[:scheme]
15
- when 'http', 'https'
16
- "#{uri[:scheme]}://"
17
- end
18
- port = if uri[:port].nil? || uri[:port].to_s.empty?
19
- nil
20
- else
21
- ":#{uri[:port].to_i}"
22
- end
23
- "#{scheme}#{host}#{port}#{path}"
12
+ return nil if uri.empty?
13
+ return nil if uri[:host].to_s.empty?
14
+ return nil if uri[:scheme].to_s.empty? && uri[:port].to_s.empty?
15
+
16
+ scheme = uri[:scheme]
17
+ if scheme.to_s.empty?
18
+ case uri[:port]
19
+ when 80, '80'
20
+ scheme = 'http'
21
+ else
22
+ scheme = 'https'
23
+ end
24
+ end
25
+
26
+ port = uri[:port]
27
+ if port.to_s.empty?
28
+ case uri[:scheme]
29
+ when 'https'
30
+ port = 443
31
+ when 'http'
32
+ port = 80
33
+ end
34
+ end
35
+
36
+ scheme = "#{scheme}://"
37
+ host = uri[:host]
38
+ port = ":#{port}"
39
+ path = uri[:path]
40
+ query = "?#{uri[:query]}"
41
+
42
+ scheme = nil if scheme.to_s.empty?
43
+ port = nil if port.to_s.empty?
44
+ path = nil if uri[:path].to_s.empty?
45
+ query = nil if uri[:query].to_s.empty?
46
+
47
+ URI("#{scheme}#{host}#{port}#{path}#{query}").to_s
24
48
  end
25
49
 
26
50
  def self.parse_uri(uri)
27
51
  return if uri.nil?
28
52
  return if uri.to_s.empty?
29
53
 
30
- parsed_uri = URI(uri)
31
-
32
- scheme = parsed_uri.to_s.scan(%r{(https|http):\/\/}).flatten[0]
33
- port = parsed_uri.to_s.scan(%r{:(\d+)\/}).flatten[0] ||= parsed_uri.port
54
+ scheme = uri.to_s.scan(%r{([a-z][a-z0-9+\-.]*)://}).flatten[0].to_s
55
+ return URI(uri) if scheme.downcase == 'http'
56
+ return URI(uri) if scheme.downcase == 'https'
34
57
 
35
- return URI(parsed_uri) if scheme == 'http'
36
- return URI(parsed_uri) if scheme == 'https'
37
-
38
- case port
39
- when 80, '80'
40
- URI("http://#{parsed_uri.to_s.gsub("#{scheme}://", '')}")
41
- else
42
- URI("https://#{parsed_uri.to_s.gsub("#{scheme}://", '')}")
43
- end
58
+ port = uri.to_s.scan(%r{:([0-9]+)}).flatten[0].to_s
59
+ return URI("http://#{uri.to_s.gsub("#{scheme}://", '')}") if port == '80'
60
+ URI("https://#{uri.to_s.gsub("#{scheme}://", '')}")
44
61
  end
45
62
 
46
63
  # CamelCase to snake_case
@@ -128,8 +145,8 @@ module NetHTTP
128
145
  format: 'snake',
129
146
  type: type.downcase
130
147
  )
131
- rescue RuntimeError => err
132
- raise err
148
+ rescue RuntimeError => error
149
+ raise error
133
150
  end
134
151
  end
135
152
 
@@ -152,8 +169,8 @@ module NetHTTP
152
169
  format: 'snake',
153
170
  type: type.downcase
154
171
  )
155
- rescue RuntimeError => err
156
- raise err
172
+ rescue RuntimeError => error
173
+ raise error
157
174
  end
158
175
  end
159
176
 
@@ -196,8 +213,8 @@ module NetHTTP
196
213
  format: 'snake',
197
214
  type: type.downcase
198
215
  )
199
- rescue RuntimeError => err
200
- raise err
216
+ rescue RuntimeError => error
217
+ raise error
201
218
  end
202
219
  end
203
220
 
@@ -207,13 +224,13 @@ module NetHTTP
207
224
  return false if json_doc.empty?
208
225
 
209
226
  JSON.parse(json_doc)
210
- rescue JSON::ParserError => err
227
+ rescue JSON::ParserError => error
211
228
  if logger.nil? || logger.to_s.empty?
212
229
  puts 'WARNING - JSON syntax / parsing errors detected:'
213
- puts err
230
+ puts error
214
231
  else
215
232
  logger.debug('WARNING - JSON syntax / parsing errors detected:')
216
- logger.debug(err)
233
+ logger.debug(error)
217
234
  end
218
235
  return false
219
236
  end
@@ -253,9 +270,12 @@ module NetHTTP
253
270
  return false unless html_doc.include?('<body>')
254
271
  return false unless html_doc.include?('</body>')
255
272
  return false unless Nokogiri::HTML(html_doc).errors.empty?
273
+ return false unless Nokogiri::XML(html_doc).errors.empty?
256
274
 
257
275
  begin
258
- parse_errors = Nokogiri::HTML.parse(html_doc).validate
276
+ # parse_errors = Nokogiri::HTML.parse(html_doc).validate
277
+ parse_errors = Nokogiri::XML(html_doc).errors { |c| c.options = Nokogiri::XML::ParseOptions::STRICT }
278
+ Nokogiri::XML(html_doc) { |c| c.options = Nokogiri::XML::ParseOptions::STRICT }
259
279
  rescue Nokogiri::XML::SyntaxError
260
280
  if logger.nil? || logger.to_s.empty?
261
281
  puts 'WARNING - HTML syntax / parsing errors detected:'
@@ -266,8 +286,8 @@ module NetHTTP
266
286
  end
267
287
  return true
268
288
  end
269
- rescue RuntimeError => err
270
- raise err
289
+ rescue RuntimeError => error
290
+ raise error
271
291
  end
272
292
 
273
293
  true
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'schema'
4
4
  require_relative '../core/core'
5
+ require_relative '../response/response'
5
6
 
6
7
  module NetHTTP
7
8
  class Client
@@ -30,11 +31,11 @@ module NetHTTP
30
31
 
31
32
  opts[:method] = 'delete'
32
33
  request_opts = request_opts(opts)
33
- logger.debug('Request Method => ' + request_opts[:method])
34
- logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + request_opts[:uri].host.to_s)
34
+ logger.debug('Request Method => ' + request_opts[:method].to_s.upcase)
35
+ logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + '://' + request_opts[:uri].host.to_s)
35
36
  logger.debug('Request Port => ' + request_opts[:uri].port.to_s)
36
37
  logger.debug('Request Path => ' + request_opts[:path])
37
- Response.new(
38
+ NetHTTP::Response.new(
38
39
  response: client.delete(
39
40
  request_opts[:path]
40
41
  ),
@@ -47,13 +48,13 @@ module NetHTTP
47
48
 
48
49
  opts[:method] = 'get'
49
50
  request_opts = request_opts(opts)
50
- logger.debug('Request Method => ' + request_opts[:method])
51
- logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + request_opts[:uri].host.to_s)
51
+ logger.debug('Request Method => ' + request_opts[:method].to_s.upcase)
52
+ logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + '://' + request_opts[:uri].host.to_s)
52
53
  logger.debug('Request Port => ' + request_opts[:uri].port.to_s)
53
54
  logger.debug('Request Path => ' + request_opts[:path])
54
55
  logger.debug('Request Headers =>')
55
56
  logger.debug(request_opts[:headers])
56
- Response.new(
57
+ NetHTTP::Response.new(
57
58
  response: client.get(
58
59
  request_opts[:path],
59
60
  request_opts[:headers]
@@ -67,15 +68,15 @@ module NetHTTP
67
68
 
68
69
  opts[:method] = 'post'
69
70
  request_opts = request_opts(opts)
70
- logger.debug('Request Method => ' + request_opts[:method])
71
- logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + request_opts[:uri].host.to_s)
71
+ logger.debug('Request Method => ' + request_opts[:method].to_s.upcase)
72
+ logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + '://' + request_opts[:uri].host.to_s)
72
73
  logger.debug('Request Port => ' + request_opts[:uri].port.to_s)
73
74
  logger.debug('Request Path => ' + request_opts[:path])
74
75
  logger.debug('Request Headers =>')
75
76
  logger.debug(request_opts[:headers])
76
77
  logger.debug('Request Body =>')
77
78
  logger.debug(request_opts[:body])
78
- Response.new(
79
+ NetHTTP::Response.new(
79
80
  response: client.post(
80
81
  request_opts[:path],
81
82
  request_opts[:body],
@@ -90,15 +91,15 @@ module NetHTTP
90
91
 
91
92
  opts[:method] = 'post_form'
92
93
  request_opts = request_opts(opts)
93
- logger.debug('Request Method => ' + request_opts[:method])
94
- logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + request_opts[:uri].host.to_s)
94
+ logger.debug('Request Method => ' + request_opts[:method].to_s.upcase)
95
+ logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + '://' + request_opts[:uri].host.to_s)
95
96
  logger.debug('Request Port => ' + request_opts[:uri].port.to_s)
96
97
  logger.debug('Request Path => ' + request_opts[:path])
97
98
  logger.debug('Request Headers =>')
98
99
  logger.debug(request_opts[:headers])
99
100
  logger.debug('Request Body =>')
100
101
  logger.debug(URI.encode_www_form(request_opts[:body]))
101
- Response.new(
102
+ NetHTTP::Response.new(
102
103
  response: client.post(
103
104
  uri,
104
105
  URI.encode_www_form(request_opts[:body]),
@@ -115,15 +116,15 @@ module NetHTTP
115
116
 
116
117
  opts[:method] = 'put'
117
118
  request_opts = request_opts(opts)
118
- logger.debug('Request Method => ' + request_opts[:method])
119
- logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + request_opts[:uri].host.to_s)
119
+ logger.debug('Request Method => ' + request_opts[:method].to_s.upcase)
120
+ logger.debug('Request Host => ' + request_opts[:uri].scheme.to_s + '://' + request_opts[:uri].host.to_s)
120
121
  logger.debug('Request Port => ' + request_opts[:uri].port.to_s)
121
122
  logger.debug('Request Path => ' + request_opts[:path])
122
123
  logger.debug('Request Headers =>')
123
124
  logger.debug(request_opts[:headers])
124
125
  logger.debug('Request Body =>')
125
126
  logger.debug(request_opts[:body])
126
- Response.new(
127
+ NetHTTP::Response.new(
127
128
  response: client.put(
128
129
  request_opts[:path],
129
130
  request_opts[:body],
@@ -133,17 +134,43 @@ module NetHTTP
133
134
  )
134
135
  end
135
136
 
136
- def request_opts(opts = {})
137
+ def request_opts(opts)
137
138
  Core.schema_validation(opts, NetHTTP::Request::Schema, logger) unless opts[:enforce_schema_validation] == false
138
139
 
139
- request_opts = {}
140
- request_opts[:method] = opts[:method] ||= 'post'
141
- request_opts[:uri] = opts[:uri] ||= opts[:url] ||= uri
142
- request_opts[:path] = opts[:path] ||= request_opts[:uri].path ||= path
143
- request_opts[:path] = (request_opts[:path] + '?' + request_opts[:uri].query) unless request_opts[:uri].query.nil? || request_opts[:path].include?('?')
144
- request_opts[:headers] = opts[:headers] ||= {}
145
- request_opts[:body] = opts[:body] ||= nil
146
- request_opts
140
+ request_method = opts[:method] ||= 'post'
141
+ request_uri = Core::Utilities.parse_uri(opts[:uri] || opts[:url] || uri)
142
+ request_path = request_path(
143
+ path: (opts[:path] || request_uri.path || path),
144
+ query: (opts[:query] || request_uri.query || query)
145
+ )
146
+ request_headers = opts[:headers] ||= {}
147
+ request_body = opts[:body] ||= nil
148
+
149
+ {
150
+ method: request_method,
151
+ uri: request_uri,
152
+ path: request_path,
153
+ headers: request_headers,
154
+ body: request_body
155
+ }
156
+ end
157
+
158
+ def request_path(opts)
159
+ # i.e. URI('https://www.google.com')
160
+ # uri.path defaults to "" if empty / not set
161
+ # uri.query defaults to nil if empty / not set
162
+ path = opts[:path].to_s.chomp('?')
163
+ if opts[:query].to_s.start_with?('?')
164
+ query = opts[:query][1..-1]
165
+ else
166
+ query = opts[:query].to_s
167
+ end
168
+
169
+ return '' if path.empty? && query.empty?
170
+ return path if query.empty?
171
+ return '/' + query if path.empty?
172
+
173
+ path + '?' + query
147
174
  end
148
175
  end
149
176
  end
@@ -5,9 +5,16 @@ require 'dry-validation'
5
5
  module NetHTTP
6
6
  class Request
7
7
  Schema = Dry::Validation.Schema do
8
+ configure do
9
+ def name
10
+ 'NetHTTP::Request::Schema'
11
+ end
12
+ end
13
+
8
14
  required(:method).filled(type?: String)
9
15
  optional(:headers).maybe(type?: Hash)
10
16
  optional(:body).maybe
17
+ optional(:query).filled(type?: String)
11
18
 
12
19
  rule(if_url_and_uri_are_nil_must_provide_path: [:uri, :url, :path]) do |uri, url, path|
13
20
  uri.empty?.then(url.empty?.then(path.filled?))