pact-mock_service 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/lib/pact/consumer/app_manager.rb +23 -35
  4. data/lib/pact/consumer/mock_service/app.rb +11 -75
  5. data/lib/pact/consumer/mock_service/error_handler.rb +28 -0
  6. data/lib/pact/consumer/mock_service/index_get.rb +22 -0
  7. data/lib/pact/consumer/mock_service/interaction_delete.rb +3 -3
  8. data/lib/pact/consumer/mock_service/interaction_post.rb +2 -2
  9. data/lib/pact/consumer/mock_service/log_get.rb +2 -2
  10. data/lib/pact/consumer/mock_service/missing_interactions_get.rb +2 -3
  11. data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +11 -13
  12. data/lib/pact/consumer/mock_service/pact_post.rb +2 -2
  13. data/lib/pact/consumer/mock_service/request_handlers.rb +41 -0
  14. data/lib/pact/consumer/mock_service/verification_get.rb +2 -2
  15. data/lib/pact/consumer/mock_service.rb +41 -0
  16. data/lib/pact/consumer/server.rb +28 -7
  17. data/lib/pact/mock_service/cli/pidfile.rb +97 -0
  18. data/lib/pact/mock_service/cli.rb +109 -59
  19. data/lib/pact/mock_service/control_server/app.rb +42 -0
  20. data/lib/pact/mock_service/control_server/delegator.rb +55 -0
  21. data/lib/pact/mock_service/control_server/index.rb +25 -0
  22. data/lib/pact/mock_service/control_server/mock_service_creator.rb +34 -0
  23. data/lib/pact/mock_service/control_server/mock_services.rb +26 -0
  24. data/lib/pact/mock_service/control_server/require_pacticipant_headers.rb +20 -0
  25. data/lib/pact/mock_service/control_server/run.rb +68 -0
  26. data/lib/pact/mock_service/run.rb +81 -0
  27. data/lib/pact/mock_service/server/restart.rb +20 -0
  28. data/lib/pact/mock_service/server/spawn.rb +37 -0
  29. data/lib/pact/mock_service/server/wait_for_server_up.rb +35 -0
  30. data/lib/pact/mock_service/spawn.rb +68 -0
  31. data/lib/pact/mock_service/version.rb +1 -1
  32. metadata +18 -3
  33. data/lib/pact/consumer/mock_service/web_request_administration.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22b2ac0e4b25a237d1b534c112e0dae09fbf268f
4
- data.tar.gz: 2d3d54b21a35501ea75660f2007a17a8be8c12f7
3
+ metadata.gz: ebcb0082a273a588dcca76818918e469ad66fad1
4
+ data.tar.gz: 0555f3c7bc6f652577e3efb3f96967fd203437f5
5
5
  SHA512:
6
- metadata.gz: 535ec260ca77b6b4e02f7f35959695a0991c5ec62b16c7a9b16411b77665fcbda76873daf20146ff809dc10e2d1ffeb0741570b75a17fd9bcae783f3d521cd56
7
- data.tar.gz: 42f362f541e289fe68358cedcb39573c144131615f7b0f78470276fc32c7d39d541c15a534af93289dcd51489a3093bd0e7d97ff6303ea3537a45289a71781bb
6
+ metadata.gz: ca2923d11a5d07fec5906ef98eb2300048d23247fff17efcbc99ea4c1706aec9f9116c346debaf8fdcbb19725ce36f5ce7719a4181764b71402d4d7298cb1155
7
+ data.tar.gz: 368e8f6e568cbf212f5c6e64009b9cd0caa7832979025091ccd7676853aa4e413b1631a8ec92805b58cf59d0881a9c0a9f844ac368771d0449ebbd76073880e7
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@ Do this to generate your change history
2
2
 
3
3
  git log --pretty=format:' * %h - %s (%an, %ad)'
4
4
 
5
+ ### 0.2.4 (24 Jan 2015)
6
+
7
+ * b14050e - Add --ssl option for control server (Beth, Sat Jan 24 22:14:14 2015 +1100)
8
+ * a9821fd - Add --cors option to control command (Beth, Sat Jan 24 21:51:40 2015 +1100)
9
+ * 16d62c8 - Added endpoint to check if server is up and running without causing an error (Beth, Thu Jan 8 14:33:26 2015 +1100)
10
+ * f93ff1f - Added restart for control and mock service (Beth, Thu Jan 8 14:02:19 2015 +1100)
11
+ * 54b2cb8 - Added control server to allow mock servers to be dynamically set up (Beth, Wed Jan 7 08:24:19 2015 +1100)
12
+
5
13
  ### 0.2.3 (21 Jan 2015)
6
14
 
7
15
  * 560671e - Add support for using Pact::Terms in the path (Beth, Wed Jan 21 07:42:10 2015 +1100)
@@ -6,7 +6,8 @@ require 'find_a_port'
6
6
  require 'pact/logging'
7
7
  require 'pact/consumer/server'
8
8
  require 'singleton'
9
- require 'pact/consumer/mock_service/app'
9
+ require 'pact/consumer/mock_service'
10
+ require 'find_a_port'
10
11
 
11
12
  module Pact
12
13
  module Consumer
@@ -37,15 +38,6 @@ module Pact
37
38
  port
38
39
  end
39
40
 
40
- def existing_app_on_port port
41
- app_registration = @app_registrations.find { |app_registration| app_registration.port == port }
42
- app_registration ? app_registration.app : nil
43
- end
44
-
45
- def app_registered_on?(port)
46
- app_registrations.any? { |app_registration| app_registration.port == port }
47
- end
48
-
49
41
  def ports_of_mock_services
50
42
  app_registrations.find_all(&:is_a_mock_service?).collect(&:port)
51
43
  end
@@ -65,8 +57,21 @@ module Pact
65
57
  @apps_spawned = true
66
58
  end
67
59
 
60
+ def app_registered_on?(port)
61
+ app_registrations.any? { |app_registration| app_registration.port == port }
62
+ end
63
+
68
64
  private
69
65
 
66
+ def existing_app_on_port port
67
+ app_registration = registration_on_port port
68
+ app_registration ? app_registration.app : nil
69
+ end
70
+
71
+ def registration_on_port port
72
+ @app_registrations.find { |app_registration| app_registration.port == port }
73
+ end
74
+
70
75
  def pact_dir
71
76
  Pact.configuration.pact_dir
72
77
  end
@@ -106,22 +111,17 @@ module Pact
106
111
  include Pact::Logging
107
112
  attr_accessor :port
108
113
  attr_accessor :app
109
- attr_accessor :pid
110
114
 
111
115
  def initialize opts
112
116
  @max_wait = 10
113
117
  @port = opts[:port]
114
- @pid = opts[:pid]
115
118
  @app = opts[:app]
119
+ @spawned = false
116
120
  end
117
121
 
118
122
  def kill
119
- # TODO: need to work out how to kill
120
- # logger.info "Killing #{self}"
121
- # Process.kill(9, pid)
122
- # Process.wait(pid)
123
- # self.pid = nil
124
- self.pid = nil
123
+ logger.debug "Supposed to be stopping"
124
+ @spawned = false
125
125
  end
126
126
 
127
127
  def not_spawned?
@@ -129,7 +129,7 @@ module Pact
129
129
  end
130
130
 
131
131
  def spawned?
132
- self.pid != nil
132
+ @spawned
133
133
  end
134
134
 
135
135
  def is_a_mock_service?
@@ -137,27 +137,15 @@ module Pact
137
137
  end
138
138
 
139
139
  def to_s
140
- "#{app} on port #{port}" + (@pid ? " with pid #{pid}" : "")
140
+ "#{app} on port #{port}"
141
141
  end
142
142
 
143
143
  def spawn
144
144
  logger.info "Starting app #{self}..."
145
- Pact::Server.new(app, port).boot
146
- self.pid = 'unknown'
147
- logger.info "Started with pid #{pid}"
148
- end
149
-
150
- def wait_until
151
- waited = 0
152
- wait_time = 0.1
153
- while waited < @max_wait do
154
- break if yield
155
- sleep wait_time
156
- waited += wait_time
157
- raise "Waited longer than #{@max_wait} seconds" if waited >= @max_wait
158
- end
145
+ @server = Pact::Server.new(app, port).boot
146
+ @spawned = true
147
+ logger.info "Started on port #{port}"
159
148
  end
160
-
161
149
  end
162
150
  end
163
151
  end
@@ -2,46 +2,17 @@ require 'rack'
2
2
  require 'uri'
3
3
  require 'json'
4
4
  require 'logger'
5
- require 'pact/consumer/request'
6
- require 'pact/consumer/mock_service/expected_interactions'
7
- require 'pact/consumer/mock_service/actual_interactions'
8
- require 'pact/consumer/mock_service/verified_interactions'
9
- require 'pact/consumer/mock_service/interaction_delete'
10
- require 'pact/consumer/mock_service/interaction_post'
11
- require 'pact/consumer/mock_service/interaction_replay'
12
- require 'pact/consumer/mock_service/missing_interactions_get'
13
- require 'pact/consumer/mock_service/verification_get'
14
- require 'pact/consumer/mock_service/log_get'
15
- require 'pact/consumer/mock_service/pact_post'
16
- require 'pact/consumer/mock_service/options'
17
5
  require 'pact/consumer/mock_service/cors_origin_header_middleware'
18
- require 'pact/support'
6
+ require 'pact/consumer/mock_service/request_handlers'
19
7
 
20
8
  module Pact
21
9
  module Consumer
22
-
23
10
  class MockService
24
-
25
- def initialize options = {}
26
- inner_app = InnerApp.new(options)
27
- @app = CorsOriginHeaderMiddleware.new(inner_app, options[:cors_enabled])
28
- end
29
-
30
- def call env
31
- @app.call env
32
- end
33
-
34
- def shutdown
35
- @app.shutdown
36
- end
37
-
38
- class InnerApp
11
+ class App
39
12
 
40
13
  def initialize options = {}
41
- log_description = configure_logger options
42
-
43
14
  @name = options.fetch(:name, "MockService")
44
- pact_dir = options[:pact_dir]
15
+ @logger = options.fetch(:logger)
45
16
  expected_interactions = ExpectedInteractions.new
46
17
  actual_interactions = ActualInteractions.new
47
18
  verified_interactions = VerifiedInteractions.new
@@ -52,33 +23,11 @@ module Pact
52
23
  interactions: verified_interactions
53
24
  }
54
25
 
55
- @handlers = [
56
- Options.new(@name, @logger, options[:cors_enabled]),
57
- MissingInteractionsGet.new(@name, @logger, expected_interactions, actual_interactions),
58
- VerificationGet.new(@name, @logger, expected_interactions, actual_interactions, log_description),
59
- InteractionPost.new(@name, @logger, expected_interactions, verified_interactions),
60
- InteractionDelete.new(@name, @logger, expected_interactions, actual_interactions),
61
- LogGet.new(@name, @logger),
62
- PactPost.new(@name, @logger, verified_interactions, pact_dir, options[:consumer_contract_details]),
63
- InteractionReplay.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options[:cors_enabled])
64
- ]
26
+ @request_handlers = Pact::Consumer::MockService::RequestHandlers.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options)
65
27
  end
66
28
 
67
29
  def call env
68
- response = []
69
- begin
70
- relevant_handler = @handlers.detect { |handler| handler.match? env }
71
- response = relevant_handler.respond(env)
72
- rescue StandardError => e
73
- @logger.error "Error ocurred in mock service: #{e.class} - #{e.message}"
74
- @logger.error e.backtrace.join("\n")
75
- response = [500, {'Content-Type' => 'application/json'}, [{message: e.message, backtrace: e.backtrace}.to_json]]
76
- rescue Exception => e
77
- @logger.error "Exception ocurred in mock service: #{e.class} - #{e.message}"
78
- @logger.error e.backtrace.join("\n")
79
- raise e
80
- end
81
- response
30
+ @request_handlers.call(env)
82
31
  end
83
32
 
84
33
  def shutdown
@@ -92,30 +41,17 @@ module Pact
92
41
  consumer_contract_writer.write if consumer_contract_writer.can_write?
93
42
  end
94
43
 
95
- def configure_logger options
96
- options = {log_file: $stdout}.merge options
97
- log_stream = options[:log_file]
98
- @logger = Logger.new log_stream
99
- @logger.formatter = options[:log_formatter] if options[:log_formatter]
100
- @logger.level = Pact.configuration.logger.level
101
-
102
- if log_stream.is_a? File
103
- File.absolute_path(log_stream).gsub(Dir.pwd + "/", '')
104
- else
105
- "standard out/err"
106
- end
107
- end
108
-
109
44
  def to_s
110
45
  "#{@name} #{super.to_s}"
111
46
  end
112
47
 
113
- class StdoutLogger
114
- def info message
115
- $stdout.puts "\n#{message}"
116
- end
117
- end
48
+ end
118
49
 
50
+ # Can't write to a file in a TRAP, might deadlock
51
+ class StdoutLogger
52
+ def info message
53
+ $stdout.puts "\n#{message}"
54
+ end
119
55
  end
120
56
  end
121
57
  end
@@ -0,0 +1,28 @@
1
+ module Pact
2
+ module Consumer
3
+ class MockService
4
+ class ErrorHandler
5
+
6
+ def initialize app, logger
7
+ @app = app
8
+ @logger = logger
9
+ end
10
+
11
+ def call env
12
+ begin
13
+ @app.call(env)
14
+ rescue StandardError => e
15
+ message = "Error ocurred in mock service: #{e.class} - #{e.message}"
16
+ @logger.error message
17
+ @logger.error e.backtrace.join("\n")
18
+ [500, {'Content-Type' => 'application/json'}, [{message: message, backtrace: e.backtrace}.to_json]]
19
+ end
20
+ end
21
+
22
+ def shutdown
23
+ @app.shutdown
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ require 'pact/consumer/mock_service/rack_request_helper'
2
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
3
+
4
+ module Pact
5
+ module Consumer
6
+
7
+ class IndexGet < MockServiceAdministrationEndpoint
8
+
9
+ def request_path
10
+ ''
11
+ end
12
+
13
+ def request_method
14
+ 'GET'
15
+ end
16
+
17
+ def respond env
18
+ [200, {'Content-Type' => 'text/plain'}, ['Mock service running']]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,10 +1,10 @@
1
1
  require 'pact/consumer/mock_service/rack_request_helper'
2
- require 'pact/consumer/mock_service/web_request_administration'
2
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
3
3
 
4
4
  module Pact
5
5
  module Consumer
6
6
 
7
- class InteractionDelete < WebRequestAdministration
7
+ class InteractionDelete < MockServiceAdministrationEndpoint
8
8
 
9
9
  include RackRequestHelper
10
10
 
@@ -36,4 +36,4 @@ module Pact
36
36
  end
37
37
  end
38
38
  end
39
- end
39
+ end
@@ -1,10 +1,10 @@
1
- require 'pact/consumer/mock_service/web_request_administration'
1
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
2
2
  require 'pact/mock_service/interaction_decorator'
3
3
  require 'pact/shared/json_differ'
4
4
 
5
5
  module Pact
6
6
  module Consumer
7
- class InteractionPost < WebRequestAdministration
7
+ class InteractionPost < MockServiceAdministrationEndpoint
8
8
 
9
9
  def initialize name, logger, expected_interactions, verified_interactions
10
10
  super name, logger
@@ -1,8 +1,8 @@
1
- require 'pact/consumer/mock_service/web_request_administration'
1
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
2
2
 
3
3
  module Pact
4
4
  module Consumer
5
- class LogGet < WebRequestAdministration
5
+ class LogGet < MockServiceAdministrationEndpoint
6
6
 
7
7
  include RackRequestHelper
8
8
 
@@ -1,10 +1,10 @@
1
- require 'pact/consumer/mock_service/web_request_administration'
1
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
2
2
  require 'pact/consumer/mock_service/verification'
3
3
 
4
4
  module Pact
5
5
  module Consumer
6
6
 
7
- class MissingInteractionsGet < WebRequestAdministration
7
+ class MissingInteractionsGet < MockServiceAdministrationEndpoint
8
8
  include RackRequestHelper
9
9
 
10
10
  def initialize name, logger, expected_interactions, actual_interactions
@@ -27,7 +27,6 @@ module Pact
27
27
  logger.info "Number of missing interactions for mock \"#{name}\" = #{number_of_missing_interactions}"
28
28
  [200, {}, [{size: number_of_missing_interactions}.to_json]]
29
29
  end
30
-
31
30
  end
32
31
  end
33
32
  end
@@ -13,29 +13,27 @@ module Pact
13
13
  end
14
14
 
15
15
  def match? env
16
- (request_header_match? env) && (request_path_match? env) && (request_method_match? env)
16
+ has_mock_service_header?(env) && path_matches?(env) && method_matches?(env)
17
17
  end
18
18
 
19
- def request_path
20
- raise NotImplementedError
19
+ def has_mock_service_header? env
20
+ env['HTTP_X_PACT_MOCK_SERVICE']
21
21
  end
22
22
 
23
- def request_method
24
- raise NotImplementedError
23
+ def path_matches? env
24
+ env['PATH_INFO'].chomp("/") == request_path
25
25
  end
26
26
 
27
- private
28
-
29
- def request_header_match? env
30
- raise NotImplementedError
27
+ def method_matches? env
28
+ env['REQUEST_METHOD'] == request_method
31
29
  end
32
30
 
33
- def request_path_match? env
34
- env['PATH_INFO'] == request_path
31
+ def request_path
32
+ raise NotImplementedError
35
33
  end
36
34
 
37
- def request_method_match? env
38
- env['REQUEST_METHOD'] == request_method
35
+ def request_method
36
+ raise NotImplementedError
39
37
  end
40
38
  end
41
39
  end
@@ -1,9 +1,9 @@
1
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
1
2
  require 'pact/consumer_contract/consumer_contract_writer'
2
- require 'pact/consumer/mock_service/web_request_administration'
3
3
 
4
4
  module Pact
5
5
  module Consumer
6
- class PactPost < WebRequestAdministration
6
+ class PactPost < MockServiceAdministrationEndpoint
7
7
 
8
8
  attr_accessor :consumer_contract, :verified_interactions, :default_options
9
9
 
@@ -0,0 +1,41 @@
1
+ require 'pact/consumer/mock_service/expected_interactions'
2
+ require 'pact/consumer/mock_service/actual_interactions'
3
+ require 'pact/consumer/mock_service/verified_interactions'
4
+ require 'pact/consumer/mock_service/interaction_delete'
5
+ require 'pact/consumer/mock_service/interaction_post'
6
+ require 'pact/consumer/mock_service/interaction_replay'
7
+ require 'pact/consumer/mock_service/missing_interactions_get'
8
+ require 'pact/consumer/mock_service/verification_get'
9
+ require 'pact/consumer/mock_service/log_get'
10
+ require 'pact/consumer/mock_service/pact_post'
11
+ require 'pact/consumer/mock_service/index_get'
12
+ require 'pact/consumer/mock_service/options'
13
+ require 'pact/consumer/request'
14
+ require 'pact/support'
15
+
16
+ module Pact
17
+ module Consumer
18
+ class MockService
19
+ class RequestHandlers
20
+ def initialize name, logger, expected_interactions, actual_interactions, verified_interactions, options
21
+ @handlers = [
22
+ Options.new(name, logger, options[:cors_enabled]),
23
+ MissingInteractionsGet.new(name, logger, expected_interactions, actual_interactions),
24
+ VerificationGet.new(name, logger, expected_interactions, actual_interactions, options[:log_description]),
25
+ InteractionPost.new(name, logger, expected_interactions, verified_interactions),
26
+ InteractionDelete.new(name, logger, expected_interactions, actual_interactions),
27
+ LogGet.new(name, logger),
28
+ PactPost.new(name, logger, verified_interactions, options[:pact_dir], options[:consumer_contract_details]),
29
+ IndexGet.new(name, logger),
30
+ InteractionReplay.new(name, logger, expected_interactions, actual_interactions, verified_interactions, options[:cors_enabled])
31
+ ]
32
+ end
33
+
34
+ def call env
35
+ relevant_handler = @handlers.detect { |handler| handler.match? env }
36
+ response = relevant_handler.respond(env)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,8 +1,8 @@
1
- require 'pact/consumer/mock_service/web_request_administration'
1
+ require 'pact/consumer/mock_service/mock_service_administration_endpoint'
2
2
 
3
3
  module Pact
4
4
  module Consumer
5
- class VerificationGet < WebRequestAdministration
5
+ class VerificationGet < MockServiceAdministrationEndpoint
6
6
 
7
7
  include RackRequestHelper
8
8
 
@@ -1,2 +1,43 @@
1
1
  require 'pact/consumer/mock_service/app'
2
+ require 'pact/consumer/mock_service/error_handler'
2
3
 
4
+ module Pact
5
+ module Consumer
6
+
7
+ class MockService
8
+
9
+ def initialize options = {}
10
+ logger, log_description = configure_logger(options)
11
+ app_options = options.merge(logger: logger, log_description: log_description)
12
+ @app = Rack::Builder.app do
13
+ use ErrorHandler, logger
14
+ use CorsOriginHeaderMiddleware, options[:cors_enabled]
15
+ run App.new(app_options)
16
+ end
17
+ end
18
+
19
+ def call env
20
+ @app.call env
21
+ end
22
+
23
+ def shutdown
24
+ @app.shutdown
25
+ end
26
+
27
+ def configure_logger options
28
+ options = {log_file: $stdout}.merge options
29
+ log_stream = options[:log_file]
30
+ logger = Logger.new log_stream
31
+ logger.formatter = options[:log_formatter] if options[:log_formatter]
32
+ logger.level = Pact.configuration.logger.level
33
+
34
+ log_description = if log_stream.is_a? File
35
+ File.absolute_path(log_stream).gsub(Dir.pwd + "/", '')
36
+ else
37
+ "standard out/err"
38
+ end
39
+ return logger, log_description
40
+ end
41
+ end
42
+ end
43
+ end
@@ -32,13 +32,14 @@ module Pact
32
32
  end
33
33
  end
34
34
 
35
- attr_reader :app, :port
35
+ attr_reader :app, :port, :options
36
36
 
37
- def initialize(app, port)
37
+ def initialize(app, port, options = {})
38
38
  @app = app
39
39
  @middleware = Middleware.new(@app)
40
- @server_thread = nil # supress warnings
40
+ @server_thread = nil
41
41
  @port = port
42
+ @options = options
42
43
  end
43
44
 
44
45
  def reset_error!
@@ -55,9 +56,7 @@ module Pact
55
56
 
56
57
  def responsive?
57
58
  return false if @server_thread && @server_thread.join(0)
58
-
59
- res = Net::HTTP.start(host, @port) { |http| http.get('/__identify__') }
60
-
59
+ res = get_identity
61
60
  if res.is_a?(Net::HTTPSuccess) or res.is_a?(Net::HTTPRedirection)
62
61
  return res.body == @app.object_id.to_s
63
62
  end
@@ -69,7 +68,29 @@ module Pact
69
68
 
70
69
  def run_default_server(app, port)
71
70
  require 'rack/handler/webrick'
72
- Rack::Handler::WEBrick.run(app, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0))
71
+ Rack::Handler::WEBrick.run(app, webrick_opts)
72
+ end
73
+
74
+ def get_identity
75
+ http = Net::HTTP.new host, @port
76
+ if options[:ssl]
77
+ http.use_ssl = true
78
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
79
+ end
80
+ http.get('/__identify__')
81
+ end
82
+
83
+ def webrick_opts
84
+ opts = {:Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0)}
85
+ opts.merge!(ssl_opts) if options[:ssl]
86
+ opts
87
+ end
88
+
89
+ def ssl_opts
90
+ {
91
+ :SSLEnable => true,
92
+ :SSLCertName => [ %w[CN localhost] ]
93
+ }
73
94
  end
74
95
 
75
96
  def boot