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

Constant Summary

NumValidator - Included

NUMBER_RE, NZ_NUMBER_RE

Class Method Summary

Instance Attribute Summary

Instance Method Summary

NumValidator - Included

#coerce_mod_sequence_value

Like #ensure_mod_sequence_value, but usable with numeric String input.

#coerce_mod_sequence_valzer

Like #ensure_mod_sequence_valzer, but usable with numeric String input.

#coerce_number

Like #ensure_number, but usable with numeric String input.

#coerce_number64

Like #ensure_number64, but usable with numeric String input.

#coerce_nz_number

Like #ensure_nz_number, but usable with numeric String input.

#coerce_nz_number64

Like #ensure_nz_number64, but usable with numeric String input.

#ensure_mod_sequence_value

Ensure argument is 'mod-sequence-value' or raise DataFormatError.

#ensure_mod_sequence_valzer

Ensure argument is 'mod-sequence-valzer' or raise DataFormatError.

#ensure_number

Ensure argument is 'number' or raise DataFormatError.

#ensure_number64

Ensure argument is 'number64' or raise DataFormatError.

#ensure_nz_number

Ensure argument is 'nz-number' or raise DataFormatError.

#ensure_nz_number64

Ensure argument is 'nz-number64' or raise DataFormatError.

#valid_mod_sequence_value?

Check if argument is a valid 'mod-sequence-value' according to RFC 4551.

#valid_mod_sequence_valzer?

Check if argument is a valid 'mod-sequence-valzer' according to RFC 4551.

#valid_number64?

Check if argument is a valid 'number64' according to RFC 9051.

#valid_number?

Check if argument is a valid 'number' according to RFC 3501.

#valid_nz_number64?

Check if argument is a valid 'number64' according to RFC 9051.

#valid_nz_number?

Check if argument is a valid 'nz-number' according to RFC 3501.

Constructor Details

.new(client, sock) ⇒ ResponseReader

[ GitHub ]

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

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 43

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 47

def done?               = line_done? && !literal_size

#empty?Boolean (readonly, private)

[ GitHub ]

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

def empty?              = buff.empty?

#literal_size (readonly, private)

response buffer state

[ GitHub ]

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

attr_reader :buff, :literal_size

#max_response_size (readonly, private)

cached config

[ GitHub ]

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

attr_reader :max_response_size

#response_too_large?Boolean (readonly, private)

[ GitHub ]

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

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 45

def bytes_read          = buff.bytesize

#get_literal_size(buff) (private)

[ GitHub ]

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

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

#guard_response_too_large! (private)

[ GitHub ]

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

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 48

def line_done?          = buff.end_with?(CRLF)

#max_response_remaining (private)

[ GitHub ]

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

def max_response_remaining = max_response_size &.- bytes_read

#min_response_remaining (private)

[ GitHub ]

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

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 72

def min_response_size      = bytes_read + min_response_remaining

#read_line (private)

[ GitHub ]

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

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 63

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 19

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