123456789_123456789_123456789_123456789_123456789_

Class: Net::IMAP::ResponseReader

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/net/imap/response_reader.rb

Overview

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(client, sock) ⇒ ResponseReader

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 9

def initialize(client, sock)
  @client, @sock = client, sock
  # cached config
  @max_response_size = nil
  # response buffer state
  @buff = @literal_size = nil
end

Instance Attribute Details

#buff (readonly, private)

response buffer state

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 41

attr_reader :buff, :literal_size

#client (readonly)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 7

attr_reader :client

#done?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 45

def done?               = line_done? && !literal_size

#empty?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 44

def empty?              = buff.empty?

#literal_size (readonly, private)

response buffer state

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 41

attr_reader :buff, :literal_size

#max_response_size (readonly, private)

cached config

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 38

attr_reader :max_response_size

#response_too_large?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 66

def response_too_large?    = max_response_size &.< min_response_size

Instance Method Details

#bytes_read (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 43

def bytes_read          = buff.bytesize

#get_literal_size(buff) (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 48

def get_literal_size(buff)
  buff.end_with?("}\r\n") && buff.rindex(/\{(\d+)\}\r\n\z/n) && $1.to_i
end

#guard_response_too_large! (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 73

def guard_response_too_large!
  return unless response_too_large?
  raise ResponseTooLargeError.new(
    max_response_size:, bytes_read:, literal_size:,
  )
end

#line_done?Boolean (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 46

def line_done?          = buff.end_with?(CRLF)

#max_response_remaining (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 65

def max_response_remaining = max_response_size &.- bytes_read

#min_response_remaining (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 69

def min_response_remaining
  empty? ? 3 : done? ? 0 : (literal_size || 0) + 2
end

#min_response_size (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 67

def min_response_size      = bytes_read + min_response_remaining

#read_line (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 52

def read_line
  line = (@sock.gets(CRLF, max_response_remaining) or throw :eof)
  @literal_size = get_literal_size(line)
  buff << line
end

#read_literal (private)

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 58

def read_literal
  literal = String.new(capacity: literal_size)
  buff << (@sock.read(literal_size, literal) or throw :eof)
ensure
  @literal_size = nil
end

#read_response_buffer

[ GitHub ]

  
# File 'lib/net/imap/response_reader.rb', line 17

def read_response_buffer
  @max_response_size = client.max_response_size
  @buff = String.new
  catch :eof do
    while true
      guard_response_too_large!
      read_line
      # check before allocating memory for literal
      guard_response_too_large!
      break unless literal_size
      read_literal
    end
  end
  buff
ensure
  @buff = @literal_size = nil
end