38 lines
1.1 KiB
Ruby
38 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ErrorTracking
|
|
module Collector
|
|
class SentryRequestParser
|
|
def self.parse(request)
|
|
# Request body can be "" or "gzip".
|
|
# If later then body was compressed with Zlib.gzip
|
|
encoding = request.headers['Content-Encoding']
|
|
|
|
body = if encoding == 'gzip'
|
|
Zlib.gunzip(request.body.read)
|
|
else
|
|
request.body.read
|
|
end
|
|
|
|
# Request body contains 3 json objects merged together in one StringIO.
|
|
# We need to separate and parse them into array of hash objects.
|
|
json_objects = []
|
|
parser = Yajl::Parser.new
|
|
|
|
parser.parse(body) do |json_object|
|
|
json_objects << json_object
|
|
end
|
|
|
|
# The request contains 3 objects: sentry metadata, type data and event data.
|
|
# We need only last two. Type to decide what to do with the request.
|
|
# And event data as it contains all information about the exception.
|
|
_, type, event = json_objects
|
|
|
|
{
|
|
request_type: type['type'],
|
|
event: event
|
|
}
|
|
end
|
|
end
|
|
end
|
|
end
|