Class: Soren::Parsers::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/soren/parsers/response.rb,
lib/soren/parsers/response/body.rb,
lib/soren/parsers/response/headers.rb,
lib/soren/parsers/response/status_line.rb

Defined Under Namespace

Classes: Body, Headers, StatusLine

Instance Method Summary collapse

Constructor Details

#initialize(source, deadline: nil) ⇒ Response

: (untyped, ?deadline: Deadline?) -> void



21
22
23
24
# File 'lib/soren/parsers/response.rb', line 21

def initialize(source, deadline: nil)
  @source = source #: untyped
  @deadline = deadline #: Deadline?
end

Instance Method Details

#parseObject

: -> Hash[Symbol, untyped]



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/soren/parsers/response.rb', line 27

def parse
  reader = Soren::Socket::Reader.new(@source, deadline: @deadline)

  status_line = reader.read_line
  if status_line.blank?
    raise Soren::Error::ParseError, 'raw_response must be a non-empty String'
  end

  header_lines = read_header_lines(reader)
  parsed_status_line = Soren::Parsers::Response::StatusLine.new(status_line.strip).parse
  parsed_headers = Soren::Parsers::Response::Headers.new(header_lines).parse

  version_object = Soren::Types::Response::Version.new(parsed_status_line[:version])
  code = Soren::Types::Response::Code.new(parsed_status_line[:code])
  message_object = Soren::Types::Response::Message.new(parsed_status_line[:message])
  headers_object = Soren::Types::Response::Headers.new(parsed_headers)
  parsed_body = Soren::Parsers::Response::Body.new(
    reader:  reader,
    headers: headers_object,
    code:    code,
  ).parse
  body_object = Soren::Types::Response::Body.new(parsed_body)

  {
    status_line: {
      version: version_object,
      code:    code,
      message: message_object,
    },
    headers:     headers_object,
    body:        body_object,
  }
end