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
end

Instance Attribute Details

#buff (readonly, private)

[ GitHub ]

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

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 33

def done?               = line_done? && !get_literal_size

#empty?Boolean (readonly, private)

[ GitHub ]

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

def empty?              = buff.empty?

#literal_size (readonly, private)

[ GitHub ]

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

attr_reader :buff, :literal_size

#response_too_large?Boolean (readonly, private)

[ GitHub ]

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

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 31

def bytes_read          = buff.bytesize

#get_literal_size (private)

[ GitHub ]

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

def get_literal_size    = /\{(\d+)\}\r\n\z/n =~ buff && $1.to_i

#line_done?Boolean (private)

[ GitHub ]

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

def line_done?          = buff.end_with?(CRLF)

#max_response_remaining (private)

[ GitHub ]

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

def max_response_remaining = max_response_size &.- bytes_read

#max_response_remaining! (private)

[ GitHub ]

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

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

#max_response_size (private)

[ GitHub ]

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

def max_response_size      = client.max_response_size

#min_response_remaining (private)

[ GitHub ]

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

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 58

def min_response_size      = bytes_read + min_response_remaining

#read_limit(limit = nil) (private)

[ GitHub ]

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

def read_limit(limit = nil)
  [limit, max_response_remaining!].compact.min
end

#read_line (private)

[ GitHub ]

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

def read_line
  buff << (@sock.gets(CRLF, read_limit) or throw :eof)
  max_response_remaining! unless line_done?
end

#read_literal (private)

[ GitHub ]

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

def read_literal
  # check before allocating memory for literal
  max_response_remaining!
  literal = String.new(capacity: literal_size)
  buff << (@sock.read(read_limit(literal_size), literal) or throw :eof)
ensure
  @literal_size = nil
end

#read_response_buffer

[ GitHub ]

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

def read_response_buffer
  @buff = String.new
  catch :eof do
    while true
      read_line
      break unless (@literal_size = get_literal_size)
      read_literal
    end
  end
  buff
ensure
  @buff = nil
end