bane 0.3.0 → 0.4.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.
Files changed (61) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +16 -6
  3. data/Rakefile +1 -1
  4. data/TODO +5 -8
  5. data/bin/bane +4 -12
  6. data/examples/multiple_behaviors.rb +7 -6
  7. data/examples/readme_example.rb +2 -1
  8. data/examples/single_behavior.rb +2 -1
  9. data/lib/bane.rb +18 -5
  10. data/lib/bane/arguments_parser.rb +73 -0
  11. data/lib/bane/behavior_maker.rb +39 -0
  12. data/lib/bane/behaviors/responders/close_after_pause.rb +21 -0
  13. data/lib/bane/behaviors/responders/close_immediately.rb +14 -0
  14. data/lib/bane/behaviors/responders/deluge_response.rb +27 -0
  15. data/lib/bane/behaviors/responders/echo_response.rb +16 -0
  16. data/lib/bane/behaviors/responders/exported.rb +9 -0
  17. data/lib/bane/behaviors/responders/fixed_response.rb +25 -0
  18. data/lib/bane/behaviors/responders/for_each_line.rb +18 -0
  19. data/lib/bane/behaviors/responders/http_refuse_all_credentials.rb +31 -0
  20. data/lib/bane/behaviors/responders/never_respond.rb +27 -0
  21. data/lib/bane/behaviors/responders/newline_response.rb +18 -0
  22. data/lib/bane/behaviors/responders/random_response.rb +24 -0
  23. data/lib/bane/behaviors/responders/slow_response.rb +32 -0
  24. data/lib/bane/behaviors/servers/exported.rb +18 -0
  25. data/lib/bane/behaviors/servers/responder_server.rb +50 -0
  26. data/lib/bane/behaviors/servers/timeout_in_listen_queue.rb +51 -0
  27. data/lib/bane/command_line_configuration.rb +22 -79
  28. data/lib/bane/extensions.rb +7 -0
  29. data/test/bane/acceptance_test.rb +65 -0
  30. data/test/bane/arguments_parser_test.rb +76 -0
  31. data/test/bane/bane_test.rb +12 -0
  32. data/test/bane/behaviors/responders/close_after_pause_test.rb +30 -0
  33. data/test/bane/behaviors/responders/close_immediately_test.rb +14 -0
  34. data/test/bane/behaviors/responders/deluge_response_test.rb +20 -0
  35. data/test/bane/behaviors/responders/echo_response_test.rb +16 -0
  36. data/test/bane/behaviors/responders/fixed_response_test.rb +14 -0
  37. data/test/bane/behaviors/responders/for_each_line_test.rb +29 -0
  38. data/test/bane/behaviors/responders/http_refuse_all_credentials_test.rb +18 -0
  39. data/test/bane/behaviors/responders/never_respond_test.rb +31 -0
  40. data/test/bane/behaviors/responders/newline_response_test.rb +14 -0
  41. data/test/bane/behaviors/responders/random_response_test.rb +15 -0
  42. data/test/bane/behaviors/responders/slow_response_test.rb +21 -0
  43. data/test/bane/behaviors/servers/responder_server_test.rb +77 -0
  44. data/test/bane/behaviors/servers/timeout_in_listen_queue_test.rb +23 -0
  45. data/test/bane/command_line_configuration_test.rb +54 -72
  46. data/test/bane/extensions_test.rb +17 -0
  47. data/test/bane/fake_connection_test.rb +1 -1
  48. data/test/bane/launchable_role_tests.rb +20 -0
  49. data/test/bane/naive_http_response_test.rb +1 -1
  50. data/test/test_helper.rb +42 -1
  51. metadata +143 -99
  52. data/lib/bane/behavior_server.rb +0 -47
  53. data/lib/bane/behaviors.rb +0 -171
  54. data/lib/bane/compatibility.rb +0 -36
  55. data/lib/bane/configuration_parser.rb +0 -89
  56. data/lib/bane/service_registry.rb +0 -21
  57. data/test/bane/behavior_server_test.rb +0 -59
  58. data/test/bane/behaviors_test.rb +0 -135
  59. data/test/bane/configuration_parser_test.rb +0 -111
  60. data/test/bane/integration_test.rb +0 -92
  61. data/test/bane/service_registry_test.rb +0 -20
@@ -0,0 +1,17 @@
1
+ require_relative '../test_helper'
2
+
3
+ class ExtensionsTest < Test::Unit::TestCase
4
+ def test_unqualified_name_removes_module_path
5
+ assert_equal 'String', String.unqualified_name
6
+ assert_equal 'NestedClass', TopModule::NestedClass.unqualified_name
7
+ assert_equal 'DoublyNestedClass', TopModule::NestedModule::DoublyNestedClass.unqualified_name
8
+ end
9
+ end
10
+
11
+ module TopModule
12
+ class NestedClass; end
13
+
14
+ module NestedModule
15
+ class DoublyNestedClass; end
16
+ end
17
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
3
  class FakeConnectionTest < Test::Unit::TestCase
4
4
 
@@ -0,0 +1,20 @@
1
+ module LaunchableRoleTests
2
+
3
+ # Verify the contract required for Launcher
4
+
5
+ def test_responds_to_start
6
+ assert_respond_to(@object, :start)
7
+ end
8
+
9
+ def test_responds_to_stop
10
+ assert_respond_to(@object, :stop)
11
+ end
12
+
13
+ def test_responds_to_join
14
+ assert_respond_to(@object, :join)
15
+ end
16
+
17
+ def test_responds_to_stdlog
18
+ assert_respond_to(@object, :stdlog=)
19
+ end
20
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
1
+ require_relative '../test_helper'
2
2
 
3
3
  class NaiveHttpResponseTest < Test::Unit::TestCase
4
4
 
@@ -1,12 +1,14 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'stringio'
4
+ require 'timeout'
4
5
 
5
6
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
6
7
  require 'bane'
7
-
8
+ require_relative 'bane/launchable_role_tests'
8
9
 
9
10
  IRRELEVANT_PORT = 4001
11
+ IRRELEVANT_BEHAVIOR = 'CloseImmediately'
10
12
 
11
13
  class FakeConnection < StringIO
12
14
 
@@ -28,3 +30,42 @@ class FakeConnection < StringIO
28
30
  @commands ||= []
29
31
  end
30
32
  end
33
+
34
+ module BehaviorTestHelpers
35
+
36
+ def fake_connection
37
+ @fake_connection ||= FakeConnection.new
38
+ end
39
+
40
+ def query_server(server)
41
+ server.serve(fake_connection)
42
+ end
43
+
44
+ def response
45
+ fake_connection.string
46
+ end
47
+
48
+ def assert_empty_response
49
+ assert_equal 0, response.length, "Should have sent nothing"
50
+ end
51
+
52
+ def assert_response_length(expected_length)
53
+ assert_equal expected_length, response.length, "Response was the wrong length"
54
+ end
55
+
56
+ end
57
+
58
+ module ServerTestHelpers
59
+
60
+ def run_server(server, &block)
61
+ server.stdlog = StringIO.new
62
+ launch_and_stop_safely(server, &block)
63
+ end
64
+
65
+ def launch_and_stop_safely(launcher, &block)
66
+ launcher.start
67
+ block.call(launcher)
68
+ ensure
69
+ launcher.stop if launcher
70
+ end
71
+ end
metadata CHANGED
@@ -1,143 +1,187 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: bane
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 3
8
- - 0
9
- version: 0.3.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Daniel Wellman
8
+ - Joe Leo
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-08-19 00:00:00 -04:00
18
- default_executable: bane
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- prerelease: false
22
- type: :development
12
+ date: 2014-06-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
23
15
  name: rdoc
24
- version_requirements: &id001 !ruby/object:Gem::Requirement
25
- requirements:
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
26
18
  - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 3
30
- - 12
31
- version: "3.12"
32
- requirement: *id001
33
- - !ruby/object:Gem::Dependency
34
- prerelease: false
19
+ - !ruby/object:Gem::Version
20
+ version: '3.12'
35
21
  type: :development
36
- name: bundler
37
- version_requirements: &id002 !ruby/object:Gem::Requirement
38
- requirements:
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
39
25
  - - ~>
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 1
43
- - 1
44
- - 5
26
+ - !ruby/object:Gem::Version
27
+ version: '3.12'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
45
34
  version: 1.1.5
46
- requirement: *id002
47
- - !ruby/object:Gem::Dependency
48
- prerelease: false
49
35
  type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: 1.1.5
42
+ - !ruby/object:Gem::Dependency
50
43
  name: jeweler
51
- version_requirements: &id003 !ruby/object:Gem::Requirement
52
- requirements:
53
- - - ~>
54
- - !ruby/object:Gem::Version
55
- segments:
56
- - 1
57
- - 8
58
- - 4
59
- version: 1.8.4
60
- requirement: *id003
61
- - !ruby/object:Gem::Dependency
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: 2.0.1
49
+ type: :development
62
50
  prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '='
54
+ - !ruby/object:Gem::Version
55
+ version: 2.0.1
56
+ - !ruby/object:Gem::Dependency
57
+ name: test-unit
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.2.3
63
63
  type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.2.3
70
+ - !ruby/object:Gem::Dependency
64
71
  name: mocha
65
- version_requirements: &id004 !ruby/object:Gem::Requirement
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- segments:
70
- - 0
71
- - 9
72
- - 8
73
- version: 0.9.8
74
- requirement: *id004
75
- description: " Bane is a test harness used to test your application's interaction with\n other servers. It is based upon the material from Michael Nygard's \"Release\n It!\" book as described in the \"Test Harness\" chapter.\n"
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: 0.14.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: 0.14.0
84
+ - !ruby/object:Gem::Dependency
85
+ name: wwtd
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: ! " Bane is a test harness used to test your application's interaction
99
+ with\n other servers. It is based upon the material from Michael Nygard's \"Release\n
100
+ \ It!\" book as described in the \"Test Harness\" chapter.\n"
76
101
  email: dan@danielwellman.com
77
- executables:
102
+ executables:
78
103
  - bane
79
104
  extensions: []
80
-
81
- extra_rdoc_files:
105
+ extra_rdoc_files:
82
106
  - LICENSE
83
107
  - README.md
84
108
  - TODO
85
- files:
109
+ files:
110
+ - LICENSE
111
+ - README.md
86
112
  - Rakefile
113
+ - TODO
87
114
  - bin/bane
88
115
  - examples/multiple_behaviors.rb
89
116
  - examples/readme_example.rb
90
117
  - examples/single_behavior.rb
91
118
  - lib/bane.rb
92
- - lib/bane/behavior_server.rb
93
- - lib/bane/behaviors.rb
119
+ - lib/bane/arguments_parser.rb
120
+ - lib/bane/behavior_maker.rb
121
+ - lib/bane/behaviors/responders/close_after_pause.rb
122
+ - lib/bane/behaviors/responders/close_immediately.rb
123
+ - lib/bane/behaviors/responders/deluge_response.rb
124
+ - lib/bane/behaviors/responders/echo_response.rb
125
+ - lib/bane/behaviors/responders/exported.rb
126
+ - lib/bane/behaviors/responders/fixed_response.rb
127
+ - lib/bane/behaviors/responders/for_each_line.rb
128
+ - lib/bane/behaviors/responders/http_refuse_all_credentials.rb
129
+ - lib/bane/behaviors/responders/never_respond.rb
130
+ - lib/bane/behaviors/responders/newline_response.rb
131
+ - lib/bane/behaviors/responders/random_response.rb
132
+ - lib/bane/behaviors/responders/slow_response.rb
133
+ - lib/bane/behaviors/servers/exported.rb
134
+ - lib/bane/behaviors/servers/responder_server.rb
135
+ - lib/bane/behaviors/servers/timeout_in_listen_queue.rb
94
136
  - lib/bane/command_line_configuration.rb
95
- - lib/bane/compatibility.rb
96
- - lib/bane/configuration_parser.rb
137
+ - lib/bane/extensions.rb
97
138
  - lib/bane/launcher.rb
98
139
  - lib/bane/naive_http_response.rb
99
- - lib/bane/service_registry.rb
100
- - test/bane/behavior_server_test.rb
101
- - test/bane/behaviors_test.rb
140
+ - test/bane/acceptance_test.rb
141
+ - test/bane/arguments_parser_test.rb
142
+ - test/bane/bane_test.rb
143
+ - test/bane/behaviors/responders/close_after_pause_test.rb
144
+ - test/bane/behaviors/responders/close_immediately_test.rb
145
+ - test/bane/behaviors/responders/deluge_response_test.rb
146
+ - test/bane/behaviors/responders/echo_response_test.rb
147
+ - test/bane/behaviors/responders/fixed_response_test.rb
148
+ - test/bane/behaviors/responders/for_each_line_test.rb
149
+ - test/bane/behaviors/responders/http_refuse_all_credentials_test.rb
150
+ - test/bane/behaviors/responders/never_respond_test.rb
151
+ - test/bane/behaviors/responders/newline_response_test.rb
152
+ - test/bane/behaviors/responders/random_response_test.rb
153
+ - test/bane/behaviors/responders/slow_response_test.rb
154
+ - test/bane/behaviors/servers/responder_server_test.rb
155
+ - test/bane/behaviors/servers/timeout_in_listen_queue_test.rb
102
156
  - test/bane/command_line_configuration_test.rb
103
- - test/bane/configuration_parser_test.rb
157
+ - test/bane/extensions_test.rb
104
158
  - test/bane/fake_connection_test.rb
105
- - test/bane/integration_test.rb
159
+ - test/bane/launchable_role_tests.rb
106
160
  - test/bane/naive_http_response_test.rb
107
- - test/bane/service_registry_test.rb
108
161
  - test/test_helper.rb
109
- - LICENSE
110
- - README.md
111
- - TODO
112
- has_rdoc: true
113
162
  homepage: http://github.com/danielwellman/bane
114
- licenses:
163
+ licenses:
115
164
  - BSD
165
+ metadata: {}
116
166
  post_install_message:
117
167
  rdoc_options: []
118
-
119
- require_paths:
168
+ require_paths:
120
169
  - lib
121
- required_ruby_version: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- segments:
126
- - 0
127
- version: "0"
128
- required_rubygems_version: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- segments:
133
- - 0
134
- version: "0"
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ! '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
135
180
  requirements: []
136
-
137
181
  rubyforge_project:
138
- rubygems_version: 1.3.6
182
+ rubygems_version: 2.2.2
139
183
  signing_key:
140
- specification_version: 3
141
- summary: A test harness for socket connections based upon ideas from Michael Nygard's 'Release It!'
184
+ specification_version: 4
185
+ summary: A test harness for socket connections based upon ideas from Michael Nygard's
186
+ 'Release It!'
142
187
  test_files: []
143
-
@@ -1,47 +0,0 @@
1
- require 'gserver'
2
-
3
- module Bane
4
- class BehaviorServer < GServer
5
-
6
- ALL_INTERFACES = "0.0.0.0"
7
-
8
- def initialize(port, behavior, host = BehaviorServer::DEFAULT_HOST)
9
- super(port, host)
10
- @behavior = behavior
11
- self.audit = true
12
- end
13
-
14
- def serve(io)
15
- @behavior.serve(io)
16
- end
17
-
18
- def to_s
19
- "<Bane::BehaviorServer: port=#{@port}, behavior=#{@behavior.class}>"
20
- end
21
-
22
- protected
23
-
24
- alias_method :original_log, :log
25
-
26
- def log(message)
27
- original_log("#{@behavior.class.simple_name} #{@host}:#{@port} #{message}")
28
- end
29
-
30
- def connecting(client)
31
- addr = client.peeraddr
32
- log("client:#{addr[1]} #{addr[2]}<#{addr[3]}> connect")
33
- end
34
-
35
- def disconnecting(client_port)
36
- log("client:#{client_port} disconnect")
37
- end
38
-
39
- def starting()
40
- log("start")
41
- end
42
-
43
- def stopping()
44
- log("stop")
45
- end
46
- end
47
- end
@@ -1,171 +0,0 @@
1
- module Bane
2
-
3
- module Behaviors
4
-
5
- class BasicBehavior
6
- def self.inherited(clazz)
7
- ServiceRegistry.register(clazz)
8
- end
9
-
10
- def self.simple_name
11
- self.name.split("::").last
12
- end
13
- end
14
-
15
- # This module can be used to wrap another behavior with
16
- # a "while(io.gets)" loop, which reads a line from the input and
17
- # then performs the given behavior.
18
- module ForEachLine
19
- def serve(io)
20
- while (io.gets)
21
- super(io)
22
- end
23
- end
24
- end
25
-
26
- # Closes the connection immediately after a connection is made.
27
- class CloseImmediately < BasicBehavior
28
- def serve(io)
29
- # do nothing
30
- end
31
- end
32
-
33
- # Accepts a connection, pauses a fixed duration, then closes the connection.
34
- #
35
- # Options:
36
- # - duration: The number of seconds to wait before disconnect. Default: 30
37
- class CloseAfterPause < BasicBehavior
38
- def initialize(options = {})
39
- @options = {:duration => 30}.merge(options)
40
- end
41
-
42
- def serve(io)
43
- sleep(@options[:duration])
44
- end
45
- end
46
-
47
- # Sends a static response.
48
- #
49
- # Options:
50
- # - message: The response message to send. Default: "Hello, world!"
51
- class FixedResponse < BasicBehavior
52
- def initialize(options = {})
53
- @options = {:message => "Hello, world!"}.merge(options)
54
- end
55
-
56
- def serve(io)
57
- io.write @options[:message]
58
- end
59
- end
60
-
61
- class FixedResponseForEachLine < FixedResponse
62
- include ForEachLine
63
- end
64
-
65
- # Sends a newline character as the only response
66
- class NewlineResponse < BasicBehavior
67
- def serve(io)
68
- io.write "\n"
69
- end
70
- end
71
-
72
- class NewlineResponseForEachLine < NewlineResponse
73
- include ForEachLine
74
- end
75
-
76
- # Sends a random response.
77
- class RandomResponse < BasicBehavior
78
- def serve(io)
79
- io.write random_string
80
- end
81
-
82
- private
83
- def random_string
84
- (1..rand(26)+1).map { |i| ('a'..'z').to_a[rand(26)] }.join
85
- end
86
-
87
- end
88
-
89
- class RandomResponseForEachLine < RandomResponse
90
- include ForEachLine
91
- end
92
-
93
- # Sends a fixed response character-by-character, pausing between each character.
94
- #
95
- # Options:
96
- # - message: The response to send. Default: "Hello, world!"
97
- # - pause_duration: The number of seconds to pause between each character. Default: 10 seconds
98
- class SlowResponse < BasicBehavior
99
- def initialize(options = {})
100
- @options = {:message => "Hello, world!", :pause_duration => 10}.merge(options)
101
- end
102
-
103
- def serve(io)
104
- message = @options[:message]
105
- pause_duration = @options[:pause_duration]
106
-
107
- message.each_char do |char|
108
- io.write char
109
- sleep pause_duration
110
- end
111
- end
112
- end
113
-
114
- class SlowResponseForEachLine < SlowResponse
115
- include ForEachLine
116
- end
117
-
118
- # Accepts a connection and never sends a byte of data. The connection is
119
- # left open indefinitely.
120
- class NeverRespond < BasicBehavior
121
- def serve(io)
122
- loop { sleep 1 }
123
- end
124
- end
125
-
126
- # Sends a large response. Response consists of a repeated 'x' character.
127
- #
128
- # Options
129
- # - length: The size in bytes of the response to send. Default: 1,000,000 bytes
130
- class DelugeResponse < BasicBehavior
131
- def initialize(options = {})
132
- @options = {:length => 1_000_000}.merge(options)
133
- end
134
- def serve(io)
135
- length = @options[:length]
136
-
137
- length.times { io.write('x') }
138
- end
139
- end
140
-
141
- class DelugeResponseForEachLine < DelugeResponse
142
- include ForEachLine
143
- end
144
-
145
- # Sends an HTTP 401 response (Unauthorized) for every request. This
146
- # attempts to mimic an HTTP server by reading a line (the request)
147
- # and then sending the response. This behavior responds to all
148
- # incoming request URLs on the running port.
149
- class HttpRefuseAllCredentials < BasicBehavior
150
- UNAUTHORIZED_RESPONSE_BODY = <<EOF
151
- <!DOCTYPE html>
152
- <html>
153
- <head>
154
- <title>Bane Server</title>
155
- </head>
156
- <body>
157
- <h1>Unauthorized</h1>
158
- </body>
159
- </html>
160
- EOF
161
-
162
- def serve(io)
163
- io.gets # Read the request before responding
164
- response = NaiveHttpResponse.new(401, "Unauthorized", "text/html", UNAUTHORIZED_RESPONSE_BODY)
165
- io.write(response.to_s)
166
- end
167
- end
168
-
169
- end
170
- end
171
-