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
60
61
62
63
# File 'lib/soren/parsers/response.rb', line 27

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

  loop do
    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

    next if (100..199).cover?(parsed_status_line[:code])

    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)

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