MuranoCLI 3.2.0.beta.9 → 3.2.1.pre.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/Rakefile +5 -0
  4. data/dockers/README.rst +7 -0
  5. data/dockers/RELEASE.rst +6 -3
  6. data/dockers/docker-test.sh +45 -17
  7. data/docs/completions/murano_completion-bash +211 -86
  8. data/lib/MrMurano/Account.rb +72 -4
  9. data/lib/MrMurano/Business.rb +163 -2
  10. data/lib/MrMurano/Commander-Entry.rb +1 -2
  11. data/lib/MrMurano/Config.rb +19 -18
  12. data/lib/MrMurano/Content.rb +26 -19
  13. data/lib/MrMurano/Gateway.rb +51 -10
  14. data/lib/MrMurano/ReCommander.rb +1 -1
  15. data/lib/MrMurano/Solution-Services.rb +80 -35
  16. data/lib/MrMurano/Solution-Users.rb +1 -0
  17. data/lib/MrMurano/SyncRoot.rb +10 -3
  18. data/lib/MrMurano/SyncUpDown-Core.rb +47 -36
  19. data/lib/MrMurano/SyncUpDown-Item.rb +46 -14
  20. data/lib/MrMurano/SyncUpDown.rb +22 -20
  21. data/lib/MrMurano/Webservice-Endpoint.rb +20 -18
  22. data/lib/MrMurano/Webservice-File.rb +63 -20
  23. data/lib/MrMurano/commands/business.rb +14 -1
  24. data/lib/MrMurano/commands/child.rb +148 -0
  25. data/lib/MrMurano/commands/devices.rb +298 -149
  26. data/lib/MrMurano/commands/element.rb +2 -1
  27. data/lib/MrMurano/commands/globals.rb +3 -0
  28. data/lib/MrMurano/commands/network.rb +152 -33
  29. data/lib/MrMurano/commands/sync.rb +2 -2
  30. data/lib/MrMurano/commands.rb +1 -0
  31. data/lib/MrMurano/verbosing.rb +13 -2
  32. data/lib/MrMurano/version.rb +1 -1
  33. data/spec/Account_spec.rb +43 -11
  34. data/spec/Content_spec.rb +5 -3
  35. data/spec/GatewayBase_spec.rb +1 -1
  36. data/spec/GatewayDevice_spec.rb +47 -8
  37. data/spec/GatewayResource_spec.rb +1 -1
  38. data/spec/GatewaySettings_spec.rb +1 -1
  39. data/spec/HttpAuthed_spec.rb +17 -3
  40. data/spec/ProjectFile_spec.rb +59 -23
  41. data/spec/Setting_spec.rb +2 -1
  42. data/spec/Solution-ServiceConfig_spec.rb +1 -1
  43. data/spec/Solution-ServiceEventHandler_spec.rb +27 -20
  44. data/spec/Solution-ServiceModules_spec.rb +7 -5
  45. data/spec/Solution-UsersRoles_spec.rb +7 -1
  46. data/spec/Solution_spec.rb +9 -1
  47. data/spec/SyncRoot_spec.rb +5 -5
  48. data/spec/SyncUpDown_spec.rb +262 -211
  49. data/spec/Verbosing_spec.rb +49 -8
  50. data/spec/Webservice-Cors_spec.rb +10 -1
  51. data/spec/Webservice-Endpoint_spec.rb +84 -65
  52. data/spec/Webservice-File_spec.rb +16 -11
  53. data/spec/Webservice-Setting_spec.rb +7 -1
  54. data/spec/_workspace.rb +9 -0
  55. data/spec/cmd_business_spec.rb +5 -10
  56. data/spec/cmd_common.rb +67 -32
  57. data/spec/cmd_config_spec.rb +9 -14
  58. data/spec/cmd_content_spec.rb +15 -26
  59. data/spec/cmd_cors_spec.rb +9 -12
  60. data/spec/cmd_device_spec.rb +31 -45
  61. data/spec/cmd_domain_spec.rb +12 -10
  62. data/spec/cmd_element_spec.rb +18 -17
  63. data/spec/cmd_exchange_spec.rb +1 -4
  64. data/spec/cmd_init_spec.rb +56 -72
  65. data/spec/cmd_keystore_spec.rb +17 -26
  66. data/spec/cmd_link_spec.rb +13 -17
  67. data/spec/cmd_password_spec.rb +9 -10
  68. data/spec/cmd_setting_application_spec.rb +95 -68
  69. data/spec/cmd_setting_product_spec.rb +59 -37
  70. data/spec/cmd_status_spec.rb +46 -84
  71. data/spec/cmd_syncdown_application_spec.rb +28 -50
  72. data/spec/cmd_syncdown_both_spec.rb +44 -93
  73. data/spec/cmd_syncdown_unit_spec.rb +858 -0
  74. data/spec/cmd_syncup_spec.rb +21 -56
  75. data/spec/cmd_token_spec.rb +0 -3
  76. data/spec/cmd_usage_spec.rb +15 -10
  77. data/spec/dry_run_formatter.rb +1 -0
  78. data/spec/fixtures/dumped_config +4 -4
  79. data/spec/spec_helper.rb +3 -0
  80. metadata +4 -2
@@ -16,7 +16,7 @@ module MrMurano
16
16
  include AccountBase
17
17
  include Verbose
18
18
 
19
- def businesses(bid: nil, name: nil, fuzzy: nil)
19
+ def businesses(bid: nil, name: nil, fuzzy: nil, options: nil)
20
20
  # Ask user for name and password, if not saved to config and password files.
21
21
  login_info if user.empty?
22
22
  raise 'Missing user?!' if user.empty?
@@ -29,6 +29,77 @@ module MrMurano
29
29
  # 2017-06-30: The data for each message contains a :bizid, :role, and :name.
30
30
  # :role is probably generally "owner".
31
31
 
32
+ if (options && options.network)
33
+ # add network information and sort list
34
+ bizes = add_businesses_network(bizes)
35
+ match_bid_name_fuzzy!(bizes, bid, name, fuzzy)
36
+ else
37
+ # Sort results.
38
+ match_bid_name_fuzzy!(bizes, bid, name, fuzzy)
39
+ bizes.sort_by!(&:name)
40
+ end
41
+ end
42
+
43
+ # ---------------------------------------------------------------------
44
+
45
+ def add_businesses_network(bizes)
46
+ # Get network information
47
+ bizes_without_network = []
48
+ bizes_unconfigured = []
49
+ bizes_in_network = []
50
+ all_bizes = []
51
+
52
+ MrMurano::Verbose.whirly_start 'Fetching Network Information...'
53
+ bizes.each do |biz|
54
+ biz[:network] = ''
55
+ biz[:network_relationship] = ''
56
+ business_tier = get('business/' + biz[:bizid] + '/tier')
57
+ network_enabled = business_tier[:features][:network]
58
+
59
+ if network_enabled # Parents of business networks
60
+ add_network_info_parent!(biz, bizes_in_network, bizes_unconfigured)
61
+ else # check if the biz is a child of a network
62
+ maybe_add_network_info_child!(biz, bizes_without_network, bizes_in_network)
63
+ end
64
+ end
65
+ MrMurano::Verbose.whirly_stop
66
+
67
+ # Assemble the master list so that confgured networks are on top, followed
68
+ # by unconfigured networks, followed by non-network businesses
69
+ all_bizes.concat(bizes_in_network.sort_by! { |biz| biz[:network] })
70
+ all_bizes.concat(bizes_unconfigured.sort_by! { |biz| biz[:name] })
71
+ all_bizes.concat(bizes_without_network.sort_by! { |biz| biz[:name] })
72
+ end
73
+
74
+ # ---------------------------------------------------------------------
75
+ def add_network_info_parent!(biz, bizes_in_network, bizes_unconfigured)
76
+ biz[:network_relationship] = 'parent'
77
+ network_name = get('business/' + biz[:bizid] + '/network')[:name]
78
+ if network_name
79
+ biz[:network] = network_name
80
+ bizes_in_network.push(biz)
81
+ else
82
+ biz[:network] = '--Not configured yet--'
83
+ bizes_unconfigured.push(biz)
84
+ end
85
+ end
86
+
87
+ # ---------------------------------------------------------------------
88
+ def maybe_add_network_info_child!(biz, bizes_without_network, bizes_in_network)
89
+ owner = get('business/' + biz[:bizid] + '/owner')
90
+ if owner.empty?
91
+ biz[:network] = 'N/A'
92
+ bizes_without_network.push(biz)
93
+ else
94
+ biz[:network_relationship] = 'child'
95
+ biz[:network] = owner[:network][:name]
96
+ bizes_in_network.push(biz)
97
+ end
98
+ end
99
+
100
+ # ---------------------------------------------------------------------
101
+ # helper for filtering businesses when using the find command
102
+ def match_bid_name_fuzzy!(bizes, bid, name, fuzzy)
32
103
  match_bid = ensure_array(bid)
33
104
  match_name = ensure_array(name)
34
105
  match_fuzzy = ensure_array(fuzzy)
@@ -47,9 +118,6 @@ module MrMurano
47
118
  end
48
119
 
49
120
  bizes.map! { |meta| MrMurano::Business.new(meta) }
50
-
51
- # Sort results.
52
- bizes.sort_by!(&:name)
53
121
  end
54
122
 
55
123
  # ---------------------------------------------------------------------
@@ -48,6 +48,11 @@ module MrMurano
48
48
  $cfg['business.id'].to_s
49
49
  end
50
50
 
51
+ def cid
52
+ return @cid unless @cid.to_s.empty?
53
+ $cfg['business.child'].to_s
54
+ end
55
+
51
56
  def name
52
57
  return @name unless @name.to_s.empty?
53
58
  $cfg['business.name'].to_s
@@ -89,12 +94,22 @@ module MrMurano
89
94
  raise MrMurano::ConfigError.new(Business.missing_business_id_msg) if bid.to_s.empty?
90
95
  end
91
96
 
97
+ def must_child!
98
+ raise MrMurano::ConfigError.new(Business.missing_child_msg) if cid.to_s.empty?
99
+ end
100
+
92
101
  def self.missing_business_id_msg
93
102
  %(
94
103
  business ID not specified. For hints: #{MrMurano::EXE_NAME} business --help
95
104
  ).strip
96
105
  end
97
106
 
107
+ def self.missing_child_msg
108
+ %(
109
+ network child business ID not specified. For hints: #{MrMurano::EXE_NAME} business --help
110
+ ).strip
111
+ end
112
+
98
113
  def pretty_name_and_id
99
114
  "#{fancy_ticks(Rainbow(name).underline)} <#{bid}>"
100
115
  end
@@ -112,6 +127,9 @@ module MrMurano
112
127
  #end
113
128
 
114
129
  def overview(&block)
130
+ # TODO: (PL) - The overview endpoint has been split up into smaller
131
+ # endpoints that should be used instead of this one
132
+ #
115
133
  # Here are all the goodies that the overview endpoint returns:
116
134
  # {:name=>"XXX", :email=>"XXX", :contact=>"XXX",
117
135
  # :billing=>{
@@ -373,7 +391,6 @@ module MrMurano
373
391
  end
374
392
  end
375
393
  end
376
- # ---------------------------------------------------------------------
377
394
 
378
395
  # ---------------------------------------------------------------------
379
396
 
@@ -390,6 +407,130 @@ module MrMurano
390
407
  end
391
408
  end
392
409
  end
410
+
411
+ # ---------------------------------------------------------------------
412
+
413
+ def view_child_businesses(bid)
414
+ return nil unless check_if_biz_network_capable(bid) == true
415
+ get('business/' + bid + '/network/business/') do |request, http|
416
+ response = http.request(request)
417
+ case response
418
+ when Net::HTTPSuccess
419
+ workit_response(response)
420
+ else
421
+ showHttpError(request, response)
422
+ nil
423
+ end
424
+ end
425
+ end
426
+
427
+ # ---------------------------------------------------------------------
428
+
429
+ def add_network_child_business(bid, name)
430
+ return nil unless check_if_biz_network_capable(bid) == true
431
+ post('business/' + bid + '/network/business/', name: name) do |request, http|
432
+ response = http.request(request)
433
+ case response
434
+ when Net::HTTPSuccess
435
+ workit_response(response)
436
+ when Net::HTTPConflict #409 limit reached
437
+ MrMurano::Verbose.error(
438
+ 'You have reached your limit of child businesses in your network.'
439
+ )
440
+ nil
441
+ else
442
+ showHttpError(request, response)
443
+ nil
444
+ end
445
+ end
446
+ end
447
+
448
+ # ---------------------------------------------------------------------
449
+
450
+ def delete_child_business(bid, child_business_id)
451
+ return nil unless check_if_biz_network_capable(bid) == true
452
+ delete(
453
+ 'business/' +
454
+ bid +
455
+ '/network/business/' +
456
+ child_business_id
457
+ ) do |request, http|
458
+ response = http.request(request)
459
+ case response
460
+ when Net::HTTPSuccess
461
+ workit_response(response)
462
+ else
463
+ showHttpError(request, response)
464
+ nil
465
+ end
466
+ end
467
+ end
468
+
469
+ # ---------------------------------------------------------------------
470
+
471
+ def add_member_to_child_business(bid, child_business_id, new_member_email)
472
+ return nil unless check_if_biz_network_capable(bid)
473
+ member_in_parent_biz = check_if_member_is_in_biz(bid, new_member_email)
474
+ unless (member_in_parent_biz)
475
+ MrMurano::Verbose.error(
476
+ 'User is not a member of the parent business.'
477
+ )
478
+ return nil
479
+ end
480
+ member_in_child_biz = check_if_member_is_in_biz(child_business_id, new_member_email)
481
+ if (member_in_child_biz)
482
+ MrMurano::Verbose.error(
483
+ 'User is already a member of the child business.'
484
+ )
485
+ return nil
486
+ end
487
+ put(
488
+ 'business/' +
489
+ bid +
490
+ '/network/business/' +
491
+ child_business_id +
492
+ '/member/' +
493
+ new_member_email
494
+ ) do |request, http|
495
+ response = http.request(request)
496
+ case response
497
+ when Net::HTTPSuccess
498
+ workit_response(response)
499
+ else
500
+ showHttpError(request, response)
501
+ nil
502
+ end
503
+ end
504
+ end
505
+
506
+ # ---------------------------------------------------------------------
507
+
508
+ def remove_member_from_child_business(bid, child_business_id, member_email)
509
+ return nil unless check_if_biz_network_capable(bid)
510
+ member_in_child_biz = check_if_member_is_in_biz(child_business_id, member_email)
511
+ unless (member_in_child_biz)
512
+ MrMurano::Verbose.error(
513
+ 'User is not a member of the child business.'
514
+ )
515
+ return nil
516
+ end
517
+ delete(
518
+ 'business/' +
519
+ child_business_id +
520
+ '/member/' +
521
+ member_email
522
+ ) do |request, http|
523
+ response = http.request(request)
524
+ case response
525
+ when Net::HTTPSuccess
526
+ workit_response(response)
527
+ else
528
+ showHttpError(request, response)
529
+ nil
530
+ end
531
+ end
532
+ end
533
+
393
534
  # ---------------------------------------------------------------------
394
535
 
395
536
  def check_if_biz_network_capable(bid)
@@ -398,7 +539,7 @@ module MrMurano
398
539
  case tier_response
399
540
  when Net::HTTPSuccess
400
541
  parsed_response = workit_response(tier_response)
401
- if parsed_response[:network] != true
542
+ if parsed_response[:features][:network] != true
402
543
  MrMurano::Verbose.error(
403
544
  'Your business does not have access to business network features. Please upgrade your business.'
404
545
  )
@@ -413,6 +554,26 @@ module MrMurano
413
554
  end
414
555
  end
415
556
 
557
+ # ---------------------------------------------------------------------
558
+
559
+ def check_if_member_is_in_biz(business_id, email)
560
+ get('business/' + business_id + '/member/') do |request, http|
561
+ response = http.request(request)
562
+ case response
563
+ when Net::HTTPSuccess
564
+ parsed_response = workit_response(response)
565
+ if (parsed_response.none? { |m| m[:email] == email })
566
+ false
567
+ else
568
+ true
569
+ end
570
+ else
571
+ showHttpError(request, response)
572
+ nil
573
+ end
574
+ end
575
+ end
576
+
416
577
  def self.must_not_be_managed!
417
578
  # Check that the solution(s) are not managed.
418
579
  # NOTE: BizAPI only tells us 'managed' via the business/<bizid>/solutions
@@ -10,7 +10,6 @@ require 'English'
10
10
  require 'highline'
11
11
  require 'murano-cli-commander/import'
12
12
  require 'pathname'
13
- #require 'pp'
14
13
  require 'rainbow'
15
14
  require 'rubygems'
16
15
  require 'MrMurano'
@@ -84,7 +83,7 @@ $cfg = MrMurano::Config.new(::Commander::Runner.instance)
84
83
  $cfg.load
85
84
  $cfg.validate_cmd
86
85
 
87
- # Look for a (legacy) Solutionfile.json.
86
+ # Look for a Solutionfile.json.
88
87
  $project = MrMurano::ProjectFile.new
89
88
  $project.load
90
89
 
@@ -230,7 +230,6 @@ module MrMurano
230
230
  set_defaults_location_newstyle('location.endpoints', 'routes', 'endpoints')
231
231
  end
232
232
 
233
- # rubocop:disable Style/MethodName: Use snake_case for method names.
234
233
  def set_defaults_location_newstyle(key, formerly, currently)
235
234
  if @project_dir && !@project_dir.join(formerly).exist?
236
235
  set(key, currently, :defaults)
@@ -253,7 +252,7 @@ module MrMurano
253
252
  def set_defaults_endpoints
254
253
  set('endpoints.searchFor', %w[
255
254
  {,../endpoints}/*.lua
256
- {,../endpoints}s/*/*.lua
255
+ {,../endpoints}/*/*.lua
257
256
  ].join(' '), :defaults)
258
257
  set('endpoints.ignoring', %w[
259
258
  *_test.lua
@@ -295,6 +294,8 @@ module MrMurano
295
294
  timer.timer
296
295
  tsdb.exportJob
297
296
  user.account
297
+ config.service
298
+ config.status
298
299
  ].join(' '), :defaults)
299
300
  end
300
301
 
@@ -336,8 +337,12 @@ module MrMurano
336
337
  # Set these so that @known_keys is updated.
337
338
  set('user.name', nil, :defaults)
338
339
  set('business.id', nil, :defaults)
340
+ set('business.child', nil, :defaults)
339
341
  set('application.id', nil, :defaults)
340
- set('solution.id', nil, :defaults)
342
+ set('product.id', nil, :defaults)
343
+ set('business.name', nil, :defaults)
344
+ set('application.name', nil, :defaults)
345
+ set('product.name', nil, :defaults)
341
346
  end
342
347
 
343
348
  ## Find the root of this project Directory.
@@ -395,19 +400,15 @@ module MrMurano
395
400
  # Most commands should be run from within a Murano project (sub-)directory.
396
401
  # If user is running a project command not within a project directory,
397
402
  # we'll print a message now and exit the app from run_active_command later.
398
- unless @runner.nil?
399
- the_cmd = @runner.active_command if the_cmd.nil?
400
- the_cmd = command(cmd) if the_cmd.nil?
401
- the_cmd.project_not_required = false unless defined?(the_cmd.project_not_required)
402
- if the_cmd.name != 'help' && !the_cmd.project_not_required && !@project_exists
403
- error %(The "#{the_cmd.name}" command only works in a Murano project.)
404
- say INVALID_PROJECT_HINT
405
- # Note that commander-rb uses an at_exit hook, which we hack around.
406
- @runner.command_exit = 1
407
- false
408
- end
409
- end
410
- true
403
+ return if @runner.nil?
404
+ the_cmd = @runner.active_command if the_cmd.nil?
405
+ the_cmd = command(cmd) if the_cmd.nil?
406
+ the_cmd.project_not_required = false unless defined?(the_cmd.project_not_required)
407
+ return if the_cmd.name == 'help' || the_cmd.project_not_required || @project_exists
408
+ error %(The "#{the_cmd.name}" command only works in a Murano project.)
409
+ say INVALID_PROJECT_HINT
410
+ # Note that commander-rb uses an at_exit hook, which we hack around.
411
+ @runner.command_exit = 1
411
412
  end
412
413
 
413
414
  def self.fix_modes(path)
@@ -501,7 +502,7 @@ module MrMurano
501
502
  def get(key, scope=CFG_SCOPES)
502
503
  scope = [scope] unless scope.is_a? Array
503
504
  paths = @paths.select { |p| scope.include? p.kind }
504
- paths.reject { |p| @exclude_scopes.include? p.kind }
505
+ paths.reject! { |p| @exclude_scopes.include? p.kind }
505
506
 
506
507
  section, ikey = key.split('.')
507
508
  paths.each do |path|
@@ -693,7 +694,7 @@ module MrMurano
693
694
  locat = ''
694
695
 
695
696
  scope_q = fancy_ticks(scope)
696
- scope_l = "Scope: #{scope_l}\n\n"
697
+ scope_l = "Scope: #{scope_q}\n\n"
697
698
  locat += Rainbow(scope_l).bright.underline
698
699
 
699
700
  cfg_paths = @paths.select { |p| p.kind == scope }
@@ -83,7 +83,9 @@ module MrMurano
83
83
  # ?type=
84
84
  sha256 = Digest::SHA256.new
85
85
  sha256.file(local_path.to_s)
86
- mime = MIME::Types.type_for(local_path.to_s)[0] || MIME::Types['application/octet-stream'][0]
86
+
87
+ mime = MIME::Types.type_for(local_path.to_s)[0]
88
+ mime ||= MIME::Types['application/octet-stream'][0]
87
89
 
88
90
  params = {
89
91
  sha256: sha256.hexdigest,
@@ -97,7 +99,8 @@ module MrMurano
97
99
  ret = get("/#{CGI.escape(name)}/upload?#{URI.encode_www_form(params)}")
98
100
  debug "POST instructions: #{ret}"
99
101
  raise "Method isn't POST!!!" unless ret.is_a?(Hash) && ret[:method] == 'POST'
100
- raise "EncType isn't multipart/form-data" unless ret[:enctype] == 'multipart/form-data'
102
+ is_form_data = ret[:enctype] == 'multipart/form-data'
103
+ raise "EncType isn't multipart/form-data" unless is_form_data
101
104
 
102
105
  uri = URI(ret[:url])
103
106
  request = Net::HTTP::Post.new(uri)
@@ -128,8 +131,8 @@ module MrMurano
128
131
  end
129
132
 
130
133
  return if $cfg['tool.dry']
131
- Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |ihttp|
132
- response = ihttp.request(request)
134
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
135
+ response = http.request(request)
133
136
  case response
134
137
  # rubocop:disable Lint/EmptyWhen
135
138
  # "Avoid when branches without a body."
@@ -160,28 +163,32 @@ module MrMurano
160
163
  ret = get("/#{CGI.escape(name)}/download")
161
164
  debug "GET instructions: #{ret}"
162
165
  raise "Method isn't GET!!!" unless ret.is_a?(Hash) && ret[:method] == 'GET'
163
-
164
166
  uri = URI(ret[:url])
165
167
  request = Net::HTTP::Get.new(uri)
166
168
  request['User-Agent'] = "MrMurano/#{MrMurano::VERSION}"
169
+ download_curldebug(request)
170
+ download_send(uri, request, &block)
171
+ end
167
172
 
168
- if $cfg['tool.curldebug']
169
- a = []
170
- a << %(curl -s)
171
- a << %(-H 'User-Agent: #{request['User-Agent']}')
172
- a << %(-X #{request.method})
173
- a << %('#{request.uri}')
174
- if $cfg.curlfile_f.nil?
175
- puts a.join(' ')
176
- else
177
- $cfg.curlfile_f << a.join(' ') + "\n\n"
178
- $cfg.curlfile_f.flush
179
- end
173
+ def download_curldebug(request)
174
+ return unless $cfg['tool.curldebug']
175
+ args = []
176
+ args << %(curl -s)
177
+ args << %(-H 'User-Agent: #{request['User-Agent']}')
178
+ args << %(-X #{request.method})
179
+ args << %('#{request.uri}')
180
+ if $cfg.curlfile_f.nil?
181
+ puts args.join(' ')
182
+ else
183
+ $cfg.curlfile_f << args.join(' ') + "\n\n"
184
+ $cfg.curlfile_f.flush
180
185
  end
186
+ end
181
187
 
188
+ def download_send(uri, request, &block)
182
189
  return if $cfg['tool.dry']
183
- Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |ihttp|
184
- ihttp.request(request) do |response|
190
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
191
+ http.request(request) do |response|
185
192
  case response
186
193
  when Net::HTTPSuccess
187
194
  if block_given?