Class: Maze::Server
- Inherits:
-
Object
- Object
- Maze::Server
- Defined in:
- lib/maze/server.rb
Overview
Receives and stores requests through a WEBrick HTTPServer
Constant Summary collapse
- ALLOWED_HTTP_VERBS =
%w[OPTIONS GET POST PUT DELETE HEAD TRACE PATCH CONNECT]
- DEFAULT_RESPONSE_DELAY =
0
- DEFAULT_SAMPLING_PROBABILITY =
1
- DEFAULT_STATUS_CODE =
200
Class Method Summary collapse
-
.builds ⇒ RequestList
A list of build requests received.
-
.commands ⇒ RequestList
A list of commands for a test fixture to perform.
-
.errors ⇒ RequestList
A list of error requests received.
-
.invalid_requests ⇒ RequestList
Whether the server thread is running An array of any invalid requests received.
-
.list_for(type) ⇒ Object
Provides dynamic access to request lists by name.
-
.logs ⇒ RequestList
A list of log requests received.
-
.metrics ⇒ RequestList
A list of metric requests received.
- .reset! ⇒ Object
- .response_delay_ms ⇒ Object
-
.running? ⇒ Boolean
Whether the server thread is running.
- .sampling_probability ⇒ Object
-
.sessions ⇒ RequestList
A list of session requests received.
-
.set_response_delay_generator(generator) ⇒ Object
Sets the response delay generator.
-
.set_sampling_probability_generator(generator) ⇒ Object
Sets the sampling probability generator.
-
.set_status_code_generator(generator, verb = nil) ⇒ Object
Sets the status code generator for the HTTP verb given.
-
.sourcemaps ⇒ RequestList
A list of sourcemap requests received.
-
.start ⇒ Object
Starts the WEBrick server in a separate thread.
-
.status_code(verb) ⇒ Integer
The intended HTTP status code on a successful request.
-
.stop ⇒ Object
Stops the WEBrick server thread if it’s running.
-
.traces ⇒ RequestList
A list of trace requests received.
-
.uploads ⇒ RequestList
A list of upload requests received.
Class Method Details
.builds ⇒ RequestList
A list of build requests received
125 126 127 |
# File 'lib/maze/server.rb', line 125 def builds @builds ||= RequestList.new end |
.commands ⇒ RequestList
A list of commands for a test fixture to perform. Strictly speaking these are responses to HTTP requests, but the list behavior is all we need.
161 162 163 |
# File 'lib/maze/server.rb', line 161 def commands @commands ||= RequestList.new end |
.errors ⇒ RequestList
A list of error requests received
104 105 106 |
# File 'lib/maze/server.rb', line 104 def errors @errors ||= RequestList.new end |
.invalid_requests ⇒ RequestList
Whether the server thread is running An array of any invalid requests received. Each request is hash consisting of:
request: The original HTTPRequest object
reason: Reason for being considered invalid. Examples include invalid JSON and missing/invalid digest.
171 172 173 |
# File 'lib/maze/server.rb', line 171 def invalid_requests @invalid_requests ||= RequestList.new end |
.list_for(type) ⇒ Object
Provides dynamic access to request lists by name
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/maze/server.rb', line 75 def list_for(type) type = type.to_s case type when 'error', 'errors' errors when 'session', 'sessions' sessions when 'build', 'builds' builds when 'log', 'logs' logs when 'metric', 'metrics' metrics when 'trace', 'traces' traces when 'upload', 'uploads' uploads when 'sourcemap', 'sourcemaps' sourcemaps when 'invalid', 'invalid requests' invalid_requests else raise "Invalid request type '#{type}'" end end |
.logs ⇒ RequestList
A list of log requests received
146 147 148 |
# File 'lib/maze/server.rb', line 146 def logs @logs ||= RequestList.new end |
.metrics ⇒ RequestList
A list of metric requests received
153 154 155 |
# File 'lib/maze/server.rb', line 153 def metrics @metrics ||= RequestList.new end |
.reset! ⇒ Object
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
# File 'lib/maze/server.rb', line 243 def reset! # Reset generators set_response_delay_generator(Maze::Generator.new [DEFAULT_RESPONSE_DELAY].cycle) set_status_code_generator(Maze::Generator.new [DEFAULT_STATUS_CODE].cycle) set_sampling_probability_generator(Maze::Generator.new [DEFAULT_SAMPLING_PROBABILITY].cycle) # Clear request lists errors.clear sessions.clear builds.clear uploads.clear sourcemaps.clear traces.clear logs.clear invalid_requests.clear end |
.response_delay_ms ⇒ Object
67 68 69 |
# File 'lib/maze/server.rb', line 67 def response_delay_ms @response_delay_generator.next end |
.running? ⇒ Boolean
Whether the server thread is running
178 179 180 |
# File 'lib/maze/server.rb', line 178 def running? @thread&.alive? end |
.sampling_probability ⇒ Object
63 64 65 |
# File 'lib/maze/server.rb', line 63 def sampling_probability @sampling_probability_generator.next end |
.sessions ⇒ RequestList
A list of session requests received
111 112 113 |
# File 'lib/maze/server.rb', line 111 def sessions @sessions ||= RequestList.new end |
.set_response_delay_generator(generator) ⇒ Object
Sets the response delay generator.
21 22 23 24 |
# File 'lib/maze/server.rb', line 21 def set_response_delay_generator(generator) @response_delay_generator&.close @response_delay_generator = generator end |
.set_sampling_probability_generator(generator) ⇒ Object
Sets the sampling probability generator.
29 30 31 32 |
# File 'lib/maze/server.rb', line 29 def set_sampling_probability_generator(generator) @sampling_probability_generator&.close @sampling_probability_generator = generator end |
.set_status_code_generator(generator, verb = nil) ⇒ Object
Sets the status code generator for the HTTP verb given. If no verb is given then the generator will be shared across all allowable HTTP verbs.
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/maze/server.rb', line 39 def set_status_code_generator(generator, verb = nil) @status_code_generators ||= {} Array(verb || ALLOWED_HTTP_VERBS).each do |verb| old = @status_code_generators[verb] @status_code_generators[verb] = generator # Close the old generator unless it's still being used by another verb old&.close unless @status_code_generators.value?(old) end end |
.sourcemaps ⇒ RequestList
A list of sourcemap requests received
139 140 141 |
# File 'lib/maze/server.rb', line 139 def sourcemaps @sourcemaps ||= RequestList.new end |
.start ⇒ Object
Starts the WEBrick server in a separate thread
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/maze/server.rb', line 183 def start attempts = 0 loop do @thread = Thread.new do = { Port: Maze.config.port, Logger: $logger, AccessLog: [] } [:BindAddress] = Maze.config.bind_address unless Maze.config.bind_address.nil? server = WEBrick::HTTPServer.new() # Mount a block to respond to all requests with status:200 server.mount_proc '/' do |_request, response| $logger.debug 'Received request on server root, responding with 200' response.header['Access-Control-Allow-Origin'] = '*' response.body = 'Maze runner received request' response.status = 200 end # When adding more endpoints, be sure to update the 'I should receive no requests' step server.mount '/notify', Servlets::Servlet, :errors server.mount '/sessions', Servlets::Servlet, :sessions server.mount '/builds', Servlets::Servlet, :builds server.mount '/uploads', Servlets::Servlet, :uploads server.mount '/sourcemap', Servlets::Servlet, :sourcemaps server.mount '/traces', Servlets::TraceServlet, :traces, Maze::Schemas::TRACE_SCHEMA server.mount '/react-native-source-map', Servlets::Servlet, :sourcemaps server.mount '/command', Servlets::CommandServlet server.mount '/logs', Servlets::LogServlet server.mount '/metrics', Servlets::Servlet, :metrics server.mount '/reflect', Servlets::ReflectiveServlet server.start rescue StandardError => e $logger.warn "Failed to start mock server: #{e.}" ensure server&.shutdown end # Need a short sleep here as a dying thread is still alive momentarily sleep 1 break if running? # Bail out after 3 attempts attempts += 1 raise 'Too many failed attempts to start mock server' if attempts == 3 # Failed to start - sleep before retrying $logger.info 'Retrying in 5 seconds' sleep 5 end end |
.status_code(verb) ⇒ Integer
The intended HTTP status code on a successful request
55 56 57 58 59 60 61 |
# File 'lib/maze/server.rb', line 55 def status_code(verb) if @status_code_generators[verb].nil? || @status_code_generators[verb].closed? DEFAULT_STATUS_CODE else @status_code_generators[verb].next end end |
.stop ⇒ Object
Stops the WEBrick server thread if it’s running
238 239 240 241 |
# File 'lib/maze/server.rb', line 238 def stop @thread&.kill if @thread&.alive? @thread = nil end |
.traces ⇒ RequestList
A list of trace requests received
118 119 120 |
# File 'lib/maze/server.rb', line 118 def traces @traces ||= RequestList.new end |
.uploads ⇒ RequestList
A list of upload requests received
132 133 134 |
# File 'lib/maze/server.rb', line 132 def uploads @uploads ||= RequestList.new end |