123456789_123456789_123456789_123456789_123456789_

Class: Net::IMAP::ResponseReader

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, NumValidator
Inherits: Object
Defined in: lib/net/imap/response_reader.rb

Overview

Class Method Summary

Instance Attribute Summary

Instance Method Summary

NumValidator - Included

#ensure_mod_sequence_value

Ensure argument is 'mod_sequence_value' or raise DataFormatError.

#ensure_number

Ensure argument is 'number' or raise DataFormatError.

#ensure_nz_number

Ensure argument is 'nz_number' or raise DataFormatError.

#valid_mod_sequence_value?

Check is passed argument valid 'mod_sequence_value' in RFC 4551 terminology.

#valid_number?

Check is passed argument valid 'number' in RFC 3501 terminology.

#valid_nz_number?

Check is passed argument valid 'nz_number' in RFC 3501 terminology.

Constructor Details

.new(client, sock) ⇒ ResponseReader

[ GitHub ]

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

def initialize(client, sock)
  @client, @sock = client, sock
  @buff = @literal_size = nil
end

Instance Attribute Details

#buff (readonly, private)

[ GitHub ]

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

attr_reader :buff, :literal_size

#client (readonly)

[ GitHub ]

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

attr_reader :client

#done?Boolean (readonly, private)

[ GitHub ]

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

def done?               = line_done? && !literal_size

#empty?Boolean (readonly, private)

[ GitHub ]

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

def empty?              = buff.empty?

#literal_size (readonly, private)

[ GitHub ]

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

attr_reader :buff, :literal_size

#response_too_large?Boolean (readonly, private)

[ GitHub ]

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

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 34

def bytes_read          = buff.bytesize

#coerce_number64(num) (private)

copied/adapted from NumValidator in v0.6

Raises:

[ GitHub ]

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

def coerce_number64(num)
  int = num.to_i
  return int if 0 <= int && int <= 0x7fff_ffff_ffff_ffff
  raise DataFormatError,
    "number64 must be unsigned 63-bit integer: #{num}"
end

#get_literal_size(buff) (private)

[ GitHub ]

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

def get_literal_size(buff)
  buff.end_with?("}\r\n") && buff.rindex(/\{(\d+)\}\r\n\z/n) &&
    coerce_number64($1)
rescue DataFormatError
  raise DataFormatError, format("invalid response literal size (%s)", $1)
end

#line_done?Boolean (private)

[ GitHub ]

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

def line_done?          = buff.end_with?(CRLF)

#max_response_remaining (private)

[ GitHub ]

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

def max_response_remaining = max_response_size &.- bytes_read

#max_response_remaining! (private)

[ GitHub ]

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

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 66

def max_response_size      = client.max_response_size

#min_response_remaining (private)

[ GitHub ]

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

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 69

def min_response_size      = bytes_read + min_response_remaining

#read_limit(limit = nil) (private)

[ GitHub ]

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

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

#read_line (private)

[ GitHub ]

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

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

#read_literal (private)

[ GitHub ]

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

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 16

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