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       end

#empty?Boolean (readonly, private)

[ GitHub ]

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

def empty?;           buff.empty?                           end

#line_done?Boolean (readonly, private)

[ GitHub ]

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

def line_done?;       buff.end_with?(CRLF)                  end

#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 end

Instance Method Details

#bytes_read (private)

[ GitHub ]

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

def bytes_read;       buff.bytesize                         end

#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 end

#max_response_remaining (private)

[ GitHub ]

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

def max_response_remaining; max_response_size &.- bytes_read        end

#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: max_response_size,
    bytes_read:        bytes_read,
    literal_size:      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                end

#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     end

#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