Class: Maze::Servlets::Servlet
- Inherits:
-
BaseServlet
- Object
- WEBrick::HTTPServlet::AbstractServlet
- BaseServlet
- Maze::Servlets::Servlet
- Defined in:
- lib/maze/servlets/servlet.rb
Overview
Receives and parses the requests and payloads sent from the test fixture
Direct Known Subclasses
Instance Method Summary collapse
-
#do_GET(request, _response) ⇒ Object
Logs an incoming GET WEBrick request.
-
#do_OPTIONS(request, response) ⇒ Object
Logs and returns a set of valid headers for this servlet.
-
#do_POST(request, response) ⇒ Object
Logs and parses an incoming POST request.
-
#initialize(server, request_type, schema = nil) ⇒ Servlet
constructor
Constructor.
- #post_status_code ⇒ Object
- #set_response_header(header) ⇒ Object
Constructor Details
#initialize(server, request_type, schema = nil) ⇒ Servlet
Constructor
38 39 40 41 42 43 |
# File 'lib/maze/servlets/servlet.rb', line 38 def initialize(server, request_type, schema=nil) super server @request_type = request_type @schema = JSONSchemer.schema(schema) unless schema.nil? @bugsnag_repeater = Maze::Repeaters::BugsnagRepeater.new(@request_type) end |
Instance Method Details
#do_GET(request, _response) ⇒ Object
Logs an incoming GET WEBrick request.
49 50 51 |
# File 'lib/maze/servlets/servlet.rb', line 49 def do_GET(request, _response) log_request(request) end |
#do_OPTIONS(request, response) ⇒ Object
Logs and returns a set of valid headers for this servlet.
150 151 152 153 154 155 |
# File 'lib/maze/servlets/servlet.rb', line 150 def do_OPTIONS(request, response) super response.header['Access-Control-Allow-Methods'] = 'POST, OPTIONS' response.status = Server.status_code('OPTIONS') end |
#do_POST(request, response) ⇒ Object
Logs and parses an incoming POST request. Parses ‘multipart/form-data` and `application/json` content-types. Parsed requests are added to the requests list.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/maze/servlets/servlet.rb', line 59 def do_POST(request, response) @bugsnag_repeater.repeat request # Turn the WEBrick HttpRequest into our internal HttpRequest delegate request = Maze::HttpRequest.new(request) content_type = request['Content-Type'] if %r{^multipart/form-data; boundary=([^;]+)}.match(content_type) boundary = WEBrick::HTTPUtils::dequote($1) body = WEBrick::HTTPUtils.parse_form_data(request.body, boundary) hash = { body: body, request: request, response: response } else # "content-type" is assumed to be JSON (which mimics the behaviour of # the actual API). This supports browsers that can't set this header for # cross-domain requests (IE8/9) digests = check_digest request hash = { body: JSON.parse(request.body), request: request, response: response, digests: digests } end if @schema schema_errors = @schema.validate(hash[:body]) hash[:schema_errors] = schema_errors.to_a end add_request(hash) # For the response, delaying if configured to do so response_delay_ms = Server.response_delay_ms if response_delay_ms.positive? $logger.info "Waiting #{response_delay_ms} milliseconds before responding" sleep response_delay_ms / 1000.0 end set_response_header response.header response.status = post_status_code rescue JSON::ParserError => e msg = "Unable to parse request as JSON: #{e.}" if Maze.config.captured_invalid_requests.include? @request_type Bugsnag.notify e $logger.error msg Server.invalid_requests.add({ reason: msg, request: request, body: request.body }) else $logger.warn msg end rescue StandardError => e msg = "Invalid #{@request_type} request: #{e.}" if Maze.config.captured_invalid_requests.include? @request_type Bugsnag.notify e $logger.error msg Server.invalid_requests.add({ invalid: true, reason: e., request: { request_uri: request.request_uri, header: request.header, body: request.inspect } }) else $logger.warn msg end end |
#post_status_code ⇒ Object
134 135 136 137 138 139 140 |
# File 'lib/maze/servlets/servlet.rb', line 134 def post_status_code if [:errors, :sessions, :builds, :uploads, :sourcemaps, :traces].include? @request_type Server.status_code('POST') else 200 end end |
#set_response_header(header) ⇒ Object
142 143 144 |
# File 'lib/maze/servlets/servlet.rb', line 142 def set_response_header(header) header['Access-Control-Allow-Origin'] = '*' end |