forked from ahx/openapi_first
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresponse_parser.rb
More file actions
50 lines (41 loc) · 1.3 KB
/
response_parser.rb
File metadata and controls
50 lines (41 loc) · 1.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# frozen_string_literal: true
require_relative 'response_body_parsers'
module OpenapiFirst
ParsedResponse = Data.define(:body, :headers)
# Parse a response
class ResponseParser
def initialize(headers:, content_type:)
@headers_parser = build_headers_parser(headers)
@body_parser = ResponseBodyParsers[content_type]
end
def parse(rack_response)
ParsedResponse.new(
body: @body_parser.call(read_body(rack_response)),
headers: @headers_parser&.call(rack_response.headers) || {}
)
end
private
def read_body(rack_response)
buffered_body = +''
if rack_response.body.respond_to?(:each)
rack_response.body.each { |chunk| buffered_body << chunk }
return buffered_body
end
rack_response.body
rescue TypeError
raise Error, "Cannot not read response body. Response is not string-like, but is a #{rack_response.body.class}."
end
def build_headers_parser(headers)
return unless headers&.any?
headers_as_parameters = headers.map do |header|
{
'name' => header.name,
'explode' => false,
'in' => 'header',
'schema' => header.resolved_schema
}
end
OpenapiParameters::Header.new(headers_as_parameters).method(:unpack)
end
end
end