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
- .new(client, sock) ⇒ ResponseReader constructor
Instance Attribute Summary
- #client readonly
- #buff readonly private
- #done? ⇒ Boolean readonly private
- #empty? ⇒ Boolean readonly private
- #literal_size readonly private
- #response_too_large? ⇒ Boolean readonly private
Instance Method Summary
- #read_response_buffer
- #bytes_read private
-
#coerce_number64(num)
private
copied/adapted from
NumValidatorin v0.6. - #get_literal_size(buff) private
- #line_done? ⇒ Boolean private
- #max_response_remaining private
- #max_response_remaining! private
- #max_response_size private
- #min_response_remaining private
- #min_response_size private
- #read_limit(limit = nil) private
- #read_line private
- #read_literal private
NumValidator - Included
| #ensure_mod_sequence_value | Ensure argument is 'mod_sequence_value' or raise |
| #ensure_number | Ensure argument is 'number' or raise |
| #ensure_nz_number | Ensure argument is 'nz_number' or raise |
| #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
# 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
# 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)
#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)
# 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