Class: Net::IMAP::ResponseReader
| 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
Class Method Summary
- .new(client, sock) ⇒ ResponseReader constructor
Instance Attribute Summary
- #client readonly
-
#buff
readonly
private
response buffer state.
- #done? ⇒ Boolean readonly private
- #empty? ⇒ Boolean readonly private
-
#literal_size
readonly
private
response buffer state.
-
#max_response_size
readonly
private
cached config.
- #response_too_large? ⇒ Boolean readonly private
Instance Method Summary
- #read_response_buffer
- #bytes_read private
- #get_literal_size(buff) private
- #guard_response_too_large! private
- #line_done? ⇒ Boolean private
- #max_response_remaining private
- #min_response_remaining private
- #min_response_size private
- #read_line private
- #read_literal private
NumValidator - Included
| #coerce_mod_sequence_value | Like |
| #coerce_mod_sequence_valzer | Like |
| #coerce_number | Like |
| #coerce_number64 | Like |
| #coerce_nz_number | Like |
| #coerce_nz_number64 | Like |
| #ensure_mod_sequence_value | Ensure argument is 'mod-sequence-value' or raise |
| #ensure_mod_sequence_valzer | Ensure argument is 'mod-sequence-valzer' or raise |
| #ensure_number | Ensure argument is 'number' or raise |
| #ensure_number64 | Ensure argument is 'number64' or raise |
| #ensure_nz_number | Ensure argument is 'nz-number' or raise |
| #ensure_nz_number64 | Ensure argument is 'nz-number64' or raise |
| #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
# 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
# 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
# File 'lib/net/imap/response_reader.rb', line 43
attr_reader :buff, :literal_size
#max_response_size (readonly, private)
cached config
# 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)
# 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)
#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