wikk_webbrowser 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +8 -0
  3. data/lib/wikk_webbrowser.rb +144 -122
  4. data/version +1 -1
  5. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a25cf9aea236d9ba4945504da12b1208fdca1cda7350858e60fcb6fc5637eda
4
- data.tar.gz: 2ab9b741a5c225ba0e450f44caef3de02d5edf16c3307b494d9cdea7315672c3
3
+ metadata.gz: b68922378ce9c4777c7810d94449ec8c4cdd738d9480b80430aa9f8829cd0d97
4
+ data.tar.gz: 33654b9c6d202036b39895c2b41facba850bfcee44e211866cca373a45443c8f
5
5
  SHA512:
6
- metadata.gz: 27c92d6d75b5e1348072f09931f07c2965ffc00834fd7216a756f25dae48cd31f1908c2ea1a905ef61abd1d981a85f050b48bb94c012b315b2c70219d046cd90
7
- data.tar.gz: cd36b51057af6d8d4bce69de2db3a0b442b1ab0a8601dd042e061a994b2fa8be56d51684e6f2520beec1af435f4011c413511f6430f515f7e1b4a7a7a29b9ac3
6
+ metadata.gz: a3ed4f35c54b8d96baddfe7e21afc0fdf674706daf36aa5a97a0da5717a3fb513a1bbda23c7840765b9891d314a3ff26601847272b8c146b34bf196c7c9f0534
7
+ data.tar.gz: 9bafdc4f3fd1b77d92b749b5970e224811a631a3f1fc8c9f48cbf59b07a884f8a12d9431620ef331bd8afc0e99d4cbb6a109f09c315f1e5722eb4a2ae569b680
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ robertburrowes Mon Sep 20 12:14:31 2021 +1200
2
+ Add aliases for put,post,get and delete
3
+ robertburrowes Mon Sep 20 12:14:09 2021 +1200
4
+ Added optional form arguments to delete_req Added optional data/content arguments to delete_req
5
+ robertburrowes Sat Sep 18 17:49:31 2021 +1200
6
+ Rubocop Beautifier
7
+ robertburrowes Sat Sep 18 17:23:58 2021 +1200
8
+ Rubocop beautifier reformat
1
9
  robertburrowes Wed Apr 21 19:03:05 2021 +1200
2
10
  Dependency version was wrong
3
11
  robertburrowes Wed Apr 21 18:54:00 2021 +1200
@@ -1,4 +1,4 @@
1
- module WIKK
1
+ module WIKK # :nodoc:
2
2
  require 'net/http'
3
3
  require 'net/https'
4
4
  require 'uri'
@@ -12,18 +12,17 @@ module WIKK
12
12
  # WIKK_WebBrowser.new.https_session(host: 'www.blah.com') do |session|
13
13
  # response = get_page(query: ,'/')
14
14
  # end
15
-
16
15
  class WebBrowser
17
- VERSION = '0.9.5'
18
-
19
- class Error < RuntimeError
16
+ VERSION = '0.9.6'
17
+
18
+ class Error < RuntimeError # :nodoc:
20
19
  attr_accessor :web_return_code
20
+
21
21
  def initialize(web_return_code:, message:)
22
22
  super(message)
23
23
  @web_return_code = web_return_code
24
24
  end
25
25
  end
26
-
27
26
 
28
27
  attr_reader :host
29
28
  attr_accessor :session
@@ -35,7 +34,6 @@ module WIKK
35
34
  attr_accessor :port
36
35
  attr_accessor :use_ssl
37
36
  attr_accessor :response
38
-
39
37
 
40
38
  # Create a WIKK_WebBrowser instance
41
39
  #
@@ -46,11 +44,11 @@ module WIKK
46
44
  # @return [WIKK_WebBrowser]
47
45
  #
48
46
  def initialize(host:, port: nil, use_ssl: false, cookies: {}, verify_cert: true, debug: false)
49
- @host = host #Need to do this, as passing nil is different to passing nothing to initialize!
50
- @cookies = cookies == nil ? {} : cookies
47
+ @host = host # Need to do this, as passing nil is different to passing nothing to initialize!
48
+ @cookies = cookies.nil? ? {} : cookies
51
49
  @debug = debug
52
50
  @use_ssl = use_ssl
53
- @port = port != nil ? port : ( use_ssl ? 443 : 80 )
51
+ @port = port.nil? ? ( use_ssl ? 443 : 80 ) : port
54
52
  @verify_cert = verify_cert
55
53
  @response = nil
56
54
  end
@@ -78,7 +76,7 @@ module WIKK
78
76
  # @param host [String] the host we want to connect to
79
77
  # @param port [Fixnum] (443) the port the remote web server is running on
80
78
  # @param verify_cert [Boolean] Validate certificate if true (Nb lots of embedded devices have self signed certs, so verify will fail)
81
- # @param block [Proc]
79
+ # @param block [Proc]
82
80
  # @yieldparam [WIKK_WebBrowser] the session descriptor for further calls.
83
81
  def self.https_session(host:, port: nil, verify_cert: true, cookies: {}, debug: false)
84
82
  wb = self.new(host: host, port: port, cookies: cookies, use_ssl: true, verify_cert: verify_cert, debug: debug)
@@ -88,62 +86,62 @@ module WIKK
88
86
  end
89
87
 
90
88
  # Creating a session for http connection
91
- # attached block would then call get or post NET::HTTP calls
89
+ # attached block would then call get or post NET::HTTP calls
92
90
  # @param port [Fixnum] Optional http server port
93
91
  # @param use_ssl [Boolean] Use https, if true
94
92
  # @param verify_cert [Boolean] Validate certificate if true (Nb lots of embedded devices have self signed certs, so verify will fail)
95
- # @param block [Proc]
93
+ # @param block [Proc]
96
94
  def http_session
97
- @http = Net::HTTP.new(@host, @port)
95
+ @http = Net::HTTP.new(@host, @port)
98
96
  @http.set_debug_output($stdout) if @debug
99
- @http.use_ssl = @use_ssl
100
- @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if ! @use_ssl || ! @verify_cert
101
- @http.start do |session| #ensure we close the session after the block
102
- @session = session
103
- yield
97
+ @http.use_ssl = @use_ssl
98
+ @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if ! @use_ssl || ! @verify_cert
99
+ @http.start do |session| # ensure we close the session after the block
100
+ @session = session
101
+ yield
104
102
  end
105
103
  end
106
-
104
+
107
105
  # Web basic authentication (not exactly secure)
108
106
  # @param user [String] Account name
109
107
  # @param password [String] Accounts password
110
108
  # @return [String] Base64 encoded concatentation of user + ':' + password
111
109
  def basic_authorization(user:, password:)
112
- #req.basic_auth( user, password) if user != nil
110
+ # req.basic_auth( user, password) if user != nil
113
111
  'Basic ' + Base64.encode64( "#{user}:#{password}" )
114
112
  end
115
-
113
+
116
114
  # Dropbox style token authentication
117
115
  # @param token [String] Token, as issued by dropbox
118
116
  # @return [String] Concatenation of 'Bearer ' + token
119
117
  def bearer_authorization(token:)
120
- "Bearer " + token
118
+ 'Bearer ' + token
121
119
  end
122
-
120
+
123
121
  # Add additional cookies
124
122
  # @param cookies [Hash] cookie_name => cookie_value
125
123
  def add_cookies(cookies)
126
124
  cookies.each { |cookie_name, cookie_value| @cookies[cookie_name] = cookie_value }
127
125
  end
128
-
129
- # Save cookies returned by last html get/post.
126
+
127
+ # Save cookies returned by last html get/post.
130
128
  # Removes previous cookies.
131
129
  # @param response [Net::HTTPResponse] result from HTTP calls
132
130
  def save_cookies(response)
133
- if(cookie_lines = response.get_fields('set-cookie')) != nil
134
- cookie_lines.each do | cookie_line |
135
- cookies = cookie_line.split('; ').map { |v| v.split('=')}
131
+ if (cookie_lines = response.get_fields('set-cookie')) != nil
132
+ cookie_lines.each do |cookie_line|
133
+ cookies = cookie_line.split('; ').map { |v| v.split('=') }
136
134
  cookies.each { |c| @cookies[c[0]] = c[1] }
137
135
  end
138
136
  end
139
137
  end
140
-
138
+
141
139
  # Convert @cookies to ; separated strings
142
140
  # @return cookies string
143
141
  def cookies_to_s
144
142
  @cookies.to_a.map { |v| v.join('=') }.join('; ')
145
143
  end
146
-
144
+
147
145
  # Get a header value, from the last response
148
146
  #
149
147
  # @param key [String] header key
@@ -161,13 +159,13 @@ module WIKK
161
159
  # @param extra_headers [Hash] Add these to standard headers
162
160
  # @param extra_cookies [Hash] Add these to standard cookies
163
161
  # @return [String] The Net::HTTPResponse.body text response from the web server
164
- def get_page(query: ,form_values: nil, authorization: nil, extra_headers: {}, extra_cookies: {})
165
- $stderr.puts "Debugging On" if @debug
166
- query += form_values_to_s(form_values, query.index('?') != nil) #Should be using req.set_form_data, but it seems to by stripping the leading / and then the query fails.
167
- url = URI.parse("#{@use_ssl ? "https" : "http"}://#{@host}/#{query.gsub(/^\//,'')}")
162
+ def get_page(query:, form_values: nil, authorization: nil, extra_headers: {}, extra_cookies: {})
163
+ $stderr.puts 'Debugging On' if @debug
164
+ query += form_values_to_s(form_values, query.index('?') != nil) # Should be using req.set_form_data, but it seems to by stripping the leading / and then the query fails.
165
+ url = URI.parse("#{@use_ssl ? 'https' : 'http'}://#{@host}/#{query.gsub(/^\//, '')}")
168
166
  $stderr.puts url if @debug
169
-
170
- req = Net::HTTP::Get.new(url.request_uri)
167
+
168
+ req = Net::HTTP::Get.new(url.request_uri)
171
169
 
172
170
  header = { 'HOST' => @host }
173
171
  header['Accept'] = '*/*'
@@ -175,41 +173,44 @@ module WIKK
175
173
  header['Accept-Language'] = 'en-US,en;q=0.5'
176
174
  header['Connection'] = 'keep-alive'
177
175
  header['User-Agent'] = 'Mozilla/5.0'
178
- header['Content-Type'] = 'application/x-www-form-urlencoded'
176
+ header['Content-Type'] = 'application/x-www-form-urlencoded'
179
177
  add_cookies(extra_cookies)
180
178
  header['Cookie'] = cookies_to_s if @cookies.length > 0
181
- header['DNT'] = "1"
179
+ header['DNT'] = '1'
182
180
  header['Authorization'] = authorization if authorization != nil
183
181
 
184
- extra_headers.each do |k,v|
182
+ extra_headers.each do |k, v|
185
183
  header[k] = v
186
184
  end
187
-
185
+
188
186
  req.initialize_http_header( header )
189
187
 
190
- @response = @session.request(req)
188
+ @response = @session.request(req)
191
189
  save_cookies(@response)
192
-
190
+
193
191
  $stderr.puts @response.code.to_i if @debug
194
192
 
195
- if(@response.code.to_i >= 300)
196
- if(@response.code.to_i == 302)
197
- #ignore the redirects.
198
- #$stderr.puts "302"
199
- #@response.each {|key, val| $stderr.printf "%s = %s\n", key, val } #Location seems to have cgi params removed. End up with .../cginame?&
200
- #$stderr.puts "Redirect to #{@response['location']}" #Location seems to have cgi params removed. End up with .../cginame?&
201
- #$stderr.puts
193
+ if @response.code.to_i >= 300
194
+ if @response.code.to_i == 302
195
+ # ignore the redirects.
196
+ # $stderr.puts "302"
197
+ # @response.each {|key, val| $stderr.printf "%s = %s\n", key, val } #Location seems to have cgi params removed. End up with .../cginame?&
198
+ # $stderr.puts "Redirect to #{@response['location']}" #Location seems to have cgi params removed. End up with .../cginame?&
199
+ # $stderr.puts
202
200
  return
203
201
  elsif @response.code.to_i >= 400 && @response.code.to_i < 500
204
202
  return @response.body
205
203
  end
204
+
206
205
  raise Error.new(web_return_code: @response.code.to_i, message: "#{@response.code} #{@response.message} #{query} #{form_values} #{@response.body}")
207
206
  end
208
207
 
209
208
  return @response.body
210
209
  end
211
210
 
212
- # send a POST query to the server and return the response.
211
+ alias get get_page
212
+
213
+ # send a POST query to the server and return the response.
213
214
  # @param query [String] URL, less the 'http://host/' part
214
215
  # @param authorization [String] If present, add Authorization header, using this string
215
216
  # @param content_type [String] Posted content type
@@ -218,9 +219,9 @@ module WIKK
218
219
  # @param extra_cookies [Hash] Add these to standard cookies
219
220
  # @return [String] The Net::HTTPResponse.body text response from the web server
220
221
  def post_page(query:, authorization: nil, content_type: 'application/x-www-form-urlencoded', data: nil, extra_headers: {}, extra_cookies: {})
221
- url = URI.parse("#{@use_ssl ? "https" : "http"}://#{@host}/#{query}")
222
+ url = URI.parse("#{@use_ssl ? 'https' : 'http'}://#{@host}/#{query}")
222
223
  req = Net::HTTP::Post.new(url.path)
223
-
224
+
224
225
  header = { 'HOST' => @host }
225
226
  header['Accept'] = '*/*'
226
227
  header['Accept-Encoding'] = 'gzip, deflate, br'
@@ -230,80 +231,102 @@ module WIKK
230
231
  header['Content-Type'] = content_type
231
232
  add_cookies(extra_cookies)
232
233
  header['Cookie'] = cookies_to_s if @cookies.length > 0
233
- header['DNT'] = "1"
234
+ header['DNT'] = '1'
234
235
  header['Authorization'] = authorization if authorization != nil
235
-
236
- extra_headers.each do |k,v|
236
+
237
+ extra_headers.each do |k, v|
237
238
  header[k] = v
238
239
  end
239
240
  req.initialize_http_header( header )
240
-
241
- if data != nil
242
- if data.class == Hash
243
- if content_type =~ /application\/octet-stream/
244
- req.set_form_data(data, '&')
245
- else
246
- req.set_form_data.to_j
247
- end
241
+
242
+ if data.nil?
243
+ req.body = ''
244
+ elsif data.instance_of?(Hash)
245
+ if content_type =~ /application\/octet-stream/
246
+ req.set_form_data(data, '&')
248
247
  else
249
- req.body = data #If json as a string or raw string
248
+ req.set_form_data.to_j
250
249
  end
251
250
  else
252
- req.body = ''
251
+ req.body = data # If json as a string or raw string
253
252
  end
254
-
253
+
255
254
  @response = @session.request(req)
256
255
  save_cookies(@response)
257
256
 
258
- if(@response.code.to_i >= 300)
259
- if(@response.code.to_i == 302)
260
- #ignore the redirects.
261
- #puts "302"
262
- #@response.each {|key, val| printf "%s = %s\n", key, val } #Location seems to have cgi params removed. End up with .../cginame?&
263
- #puts "Redirect of Post to #{@response['location']}" #Location seems to have cgi params removed. End up with .../cginame?&
257
+ if @response.code.to_i >= 300
258
+ if @response.code.to_i == 302
259
+ # ignore the redirects.
260
+ # puts "302"
261
+ # @response.each {|key, val| printf "%s = %s\n", key, val } #Location seems to have cgi params removed. End up with .../cginame?&
262
+ # puts "Redirect of Post to #{@response['location']}" #Location seems to have cgi params removed. End up with .../cginame?&
264
263
  return
265
264
  end
265
+
266
266
  raise Error.new(web_return_code: @response.code, message: "#{@response.code} #{@response.message} #{query} #{data} #{@response.body}")
267
267
  end
268
-
268
+
269
269
  return @response.body
270
270
  end
271
271
 
272
- # send a DELETE query to the server and return the response.
272
+ alias post post_page
273
+
274
+ # send a DELETE query to the server and return the response.
273
275
  # @param query [String] URL, less the 'http://host/' part
274
276
  # @param authorization [String] If present, add Authorization header, using this string
277
+ # @param form_values [Hash{String=>Object-with-to_s}] The parameter passed to the web server eg. ?key1=value1&key2=value2...
278
+ # @param content_type [String] Posted content type. Only meaningful if there is data
279
+ # @param data [String] Text to add to body of DELETE to the web server. Not always supported at the server end.
275
280
  # @param extra_headers [Hash] Add these to standard headers
276
281
  # @param extra_cookies [Hash] Add these to standard cookies
277
282
  # @return [String] The Net::HTTPResponse.body text response from the web server
278
- def delete_req(query:, authorization: nil, extra_headers: {}, extra_cookies: {})
279
- url = URI.parse("#{@use_ssl ? "https" : "http"}://#{@host}/#{query.gsub(/^\//,'')}")
283
+ def delete_req(query:, authorization: nil, form_values: nil, content_type: '"application/octet-stream"', data: nil, extra_headers: {}, extra_cookies: {})
284
+ $stderr.puts 'Debugging On' if @debug
285
+
286
+ query += form_values_to_s(form_values, query.index('?') != nil)
287
+ url = URI.parse("#{@use_ssl ? 'https' : 'http'}://#{@host}/#{query.gsub(/^\//, '')}")
280
288
  req = Net::HTTP::Delete.new(query)
281
-
289
+
282
290
  header = { 'HOST' => @host }
283
291
  add_cookies(extra_cookies)
284
292
  header['Cookie'] = cookies_to_s if @cookies.length > 0
285
293
  header['Authorization'] = authorization if authorization != nil
286
-
287
- extra_headers.each do |k,v|
294
+
295
+ extra_headers.each do |k, v|
288
296
  header[k] = v
289
297
  end
290
298
  req.initialize_http_header( header )
291
299
 
300
+ if data.nil?
301
+ req.body = ''
302
+ elsif data.instance_of?(Hash)
303
+ if content_type =~ /application\/octet-stream/
304
+ req.set_form_data(data, '&')
305
+ else
306
+ req.set_form_data.to_j
307
+ end
308
+ else
309
+ req.body = data # If json as a string or raw string
310
+ end
311
+
292
312
  begin
293
313
  @response = @session.request(req)
294
314
  save_cookies(@response)
295
-
296
- if(@response.code.to_i >= 300)
315
+
316
+ if @response.code.to_i >= 300
297
317
  raise "#{url} : #{@response.code} #{@response.message}"
298
318
  end
319
+
299
320
  return @response.body
300
321
  rescue StandardError => e
301
322
  puts "#{e}"
302
323
  return nil
303
324
  end
304
325
  end
305
-
306
- # send a PUT query to the server and return the response.
326
+
327
+ alias delete delete_req
328
+
329
+ # send a PUT query to the server and return the response.
307
330
  # @param query [String] URL, less the 'http://host/' part
308
331
  # @param authorization [String] If present, add Authorization header, using this string
309
332
  # @param content_type [String] Posted content type
@@ -312,9 +335,9 @@ module WIKK
312
335
  # @param extra_cookies [Hash] Add these to standard cookies
313
336
  # @return [String] The Net::HTTPResponse.body text response from the web server
314
337
  def put_req(query:, authorization: nil, content_type: '"application/octet-stream"', data: nil, extra_headers: {}, extra_cookies: {})
315
- url = URI.parse("#{@use_ssl ? "https" : "http"}://#{@host}/#{query}")
338
+ url = URI.parse("#{@use_ssl ? 'https' : 'http'}://#{@host}/#{query}")
316
339
  req = Net::HTTP::Put.new(url.path)
317
-
340
+
318
341
  header = { 'HOST' => @host }
319
342
  header['Accept'] = '*/*'
320
343
  header['Accept-Encoding'] = 'gzip, deflate, br'
@@ -324,85 +347,84 @@ module WIKK
324
347
  header['Content-Type'] = content_type
325
348
  add_cookies(extra_cookies)
326
349
  header['Cookie'] = cookies_to_s if @cookies.length > 0
327
- header['DNT'] = "1"
350
+ header['DNT'] = '1'
328
351
  header['Authorization'] = authorization if authorization != nil
329
-
330
- extra_headers.each do |k,v|
352
+
353
+ extra_headers.each do |k, v|
331
354
  header[k] = v
332
355
  end
333
356
  req.initialize_http_header( header )
334
-
335
- if data != nil
336
- if data.class == Hash
337
- if content_type =~ /application\/octet-stream/
338
- req.set_form_data(data, '&')
339
- else
340
- req.set_form_data.to_j
341
- end
357
+
358
+ if data.nil?
359
+ req.body = ''
360
+ elsif data.instance_of?(Hash)
361
+ if content_type =~ /application\/octet-stream/
362
+ req.set_form_data(data, '&')
342
363
  else
343
- req.body = data #If json as a string or raw string
364
+ req.set_form_data.to_j
344
365
  end
345
366
  else
346
- req.body = ''
367
+ req.body = data # If json as a string or raw string
347
368
  end
348
-
369
+
349
370
  @response = @session.request(req)
350
371
  save_cookies(@response)
351
372
 
352
- if(@response.code.to_i >= 300)
353
- if(@response.code.to_i == 302)
354
- #ignore the redirects.
355
- #puts "302"
356
- #@response.each {|key, val| printf "%s = %s\n", key, val } #Location seems to have cgi params removed. End up with .../cginame?&
357
- #puts "Redirect of Post to #{@response['location']}" #Location seems to have cgi params removed. End up with .../cginame?&
373
+ if @response.code.to_i >= 300
374
+ if @response.code.to_i == 302
375
+ # ignore the redirects.
376
+ # puts "302"
377
+ # @response.each {|key, val| printf "%s = %s\n", key, val } #Location seems to have cgi params removed. End up with .../cginame?&
378
+ # puts "Redirect of Post to #{@response['location']}" #Location seems to have cgi params removed. End up with .../cginame?&
358
379
  return
359
380
  end
381
+
360
382
  raise Error.new(web_return_code: @response.code, message: "#{@response.code} #{@response.message} #{query} #{data} #{@response.body}")
361
383
  end
362
-
384
+
363
385
  return @response.body
364
386
  end
365
387
 
366
- #Extract form field values from the html body.
388
+ alias put put_req
389
+
390
+ # Extract form field values from the html body.
367
391
  # @param body [String] The html response body
368
392
  # @return [Hash] Keys are the field names, values are the field values
369
393
  def extract_input_fields(body)
370
- entry = true
371
394
  @inputs = {}
372
395
  doc = Nokogiri::HTML(body)
373
- doc.xpath("//form/input").each do |f|
396
+ doc.xpath('//form/input').each do |f|
374
397
  @inputs[f.get_attribute('name')] = f.get_attribute('value')
375
398
  end
376
399
  end
377
400
 
378
- #Extract links from the html body.
401
+ # Extract links from the html body.
379
402
  # @param body [String] The html response body
380
403
  # @return [Hash] Keys are the link text, values are the html links
381
404
  def extract_link_fields(body)
382
- entry = true
383
405
  @inputs = {}
384
406
  doc = Nokogiri::HTML(body)
385
- doc.xpath("//a").each do |f|
386
- return URI.parse( f.get_attribute('href') ).path if(f.get_attribute('name') == 'URL$1')
407
+ doc.xpath('//a').each do |f|
408
+ return URI.parse( f.get_attribute('href') ).path if f.get_attribute('name') == 'URL$1'
387
409
  end
388
410
  return nil
389
411
  end
390
412
 
391
- #Take a hash of the params to the post and generate a safe URL string.
413
+ # Take a hash of the params to the post and generate a safe URL string.
392
414
  # @param form_values [Hash] Keys are the field names, values are the field values
393
415
  # @param has_q [Boolean] We have a leading ? for the html get, so don't need to add one.
394
416
  # @return [String] The 'safe' text for fields the get or post query to the web server
395
- def form_values_to_s(form_values=nil, has_q = false)
396
- return "" if form_values == nil || form_values.length == 0
397
- s = (has_q == true ? "" : "?")
417
+ def form_values_to_s(form_values = nil, has_q = false)
418
+ return '' if form_values.nil? || form_values.length == 0
419
+
420
+ s = (has_q == true ? '' : '?')
398
421
  first = true
399
- form_values.each do |key,value|
400
- s += "&" if !first
401
- s += "#{CGI::escape(key.to_s)}=#{CGI::escape(value.to_s)}"
422
+ form_values.each do |key, value|
423
+ s += '&' unless first
424
+ s += "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
402
425
  first = false
403
426
  end
404
427
  return s
405
428
  end
406
429
  end
407
430
  end
408
-
data/version CHANGED
@@ -1,2 +1,2 @@
1
1
  PROJECT="wikk_webbrowser"
2
- VERSION="0.9.5"
2
+ VERSION="0.9.6"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikk_webbrowser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Burrowes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-21 00:00:00.000000000 Z
11
+ date: 2021-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -70,14 +70,14 @@ dependencies:
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '3.22'
73
+ version: '3.23'
74
74
  type: :development
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '3.22'
80
+ version: '3.23'
81
81
  description: |-
82
82
  Wrapper around ruby http and https libraries.
83
83