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.
- checksums.yaml +15 -0
- data/README.md +16 -6
- data/Rakefile +1 -1
- data/TODO +5 -8
- data/bin/bane +4 -12
- data/examples/multiple_behaviors.rb +7 -6
- data/examples/readme_example.rb +2 -1
- data/examples/single_behavior.rb +2 -1
- data/lib/bane.rb +18 -5
- data/lib/bane/arguments_parser.rb +73 -0
- data/lib/bane/behavior_maker.rb +39 -0
- data/lib/bane/behaviors/responders/close_after_pause.rb +21 -0
- data/lib/bane/behaviors/responders/close_immediately.rb +14 -0
- data/lib/bane/behaviors/responders/deluge_response.rb +27 -0
- data/lib/bane/behaviors/responders/echo_response.rb +16 -0
- data/lib/bane/behaviors/responders/exported.rb +9 -0
- data/lib/bane/behaviors/responders/fixed_response.rb +25 -0
- data/lib/bane/behaviors/responders/for_each_line.rb +18 -0
- data/lib/bane/behaviors/responders/http_refuse_all_credentials.rb +31 -0
- data/lib/bane/behaviors/responders/never_respond.rb +27 -0
- data/lib/bane/behaviors/responders/newline_response.rb +18 -0
- data/lib/bane/behaviors/responders/random_response.rb +24 -0
- data/lib/bane/behaviors/responders/slow_response.rb +32 -0
- data/lib/bane/behaviors/servers/exported.rb +18 -0
- data/lib/bane/behaviors/servers/responder_server.rb +50 -0
- data/lib/bane/behaviors/servers/timeout_in_listen_queue.rb +51 -0
- data/lib/bane/command_line_configuration.rb +22 -79
- data/lib/bane/extensions.rb +7 -0
- data/test/bane/acceptance_test.rb +65 -0
- data/test/bane/arguments_parser_test.rb +76 -0
- data/test/bane/bane_test.rb +12 -0
- data/test/bane/behaviors/responders/close_after_pause_test.rb +30 -0
- data/test/bane/behaviors/responders/close_immediately_test.rb +14 -0
- data/test/bane/behaviors/responders/deluge_response_test.rb +20 -0
- data/test/bane/behaviors/responders/echo_response_test.rb +16 -0
- data/test/bane/behaviors/responders/fixed_response_test.rb +14 -0
- data/test/bane/behaviors/responders/for_each_line_test.rb +29 -0
- data/test/bane/behaviors/responders/http_refuse_all_credentials_test.rb +18 -0
- data/test/bane/behaviors/responders/never_respond_test.rb +31 -0
- data/test/bane/behaviors/responders/newline_response_test.rb +14 -0
- data/test/bane/behaviors/responders/random_response_test.rb +15 -0
- data/test/bane/behaviors/responders/slow_response_test.rb +21 -0
- data/test/bane/behaviors/servers/responder_server_test.rb +77 -0
- data/test/bane/behaviors/servers/timeout_in_listen_queue_test.rb +23 -0
- data/test/bane/command_line_configuration_test.rb +54 -72
- data/test/bane/extensions_test.rb +17 -0
- data/test/bane/fake_connection_test.rb +1 -1
- data/test/bane/launchable_role_tests.rb +20 -0
- data/test/bane/naive_http_response_test.rb +1 -1
- data/test/test_helper.rb +42 -1
- metadata +143 -99
- data/lib/bane/behavior_server.rb +0 -47
- data/lib/bane/behaviors.rb +0 -171
- data/lib/bane/compatibility.rb +0 -36
- data/lib/bane/configuration_parser.rb +0 -89
- data/lib/bane/service_registry.rb +0 -21
- data/test/bane/behavior_server_test.rb +0 -59
- data/test/bane/behaviors_test.rb +0 -135
- data/test/bane/configuration_parser_test.rb +0 -111
- data/test/bane/integration_test.rb +0 -92
- 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
|
@@ -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
|
data/test/test_helper.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
18
|
-
|
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
|
-
|
25
|
-
requirements:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
26
18
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
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
|
-
|
37
|
-
version_requirements:
|
38
|
-
requirements:
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
39
25
|
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
|
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
|
-
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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/
|
93
|
-
- lib/bane/
|
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/
|
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
|
-
-
|
100
|
-
- test/bane/
|
101
|
-
- test/bane/
|
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/
|
157
|
+
- test/bane/extensions_test.rb
|
104
158
|
- test/bane/fake_connection_test.rb
|
105
|
-
- test/bane/
|
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
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
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:
|
182
|
+
rubygems_version: 2.2.2
|
139
183
|
signing_key:
|
140
|
-
specification_version:
|
141
|
-
summary: A test harness for socket connections based upon ideas from Michael Nygard's
|
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
|
-
|
data/lib/bane/behavior_server.rb
DELETED
@@ -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
|
data/lib/bane/behaviors.rb
DELETED
@@ -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
|
-
|