class HrrRbSftp::Protocol::Version1::Packets

This class implements SFTP protocol version 1 packet types, formats, and responders.

Public Class Methods

new(context, logger: nil) click to toggle source

@param context [Hash] Contextual variables.

- :version (Integer) - Negotiated protocol version.
- :handles (Hash\\{String=>File, Dir\}) - Opened handles.

@param logger [Logger] Logger.

# File lib/hrr_rb_sftp/protocol/version1/packets.rb, line 17
def initialize context, logger: nil
  self.logger = logger

  @packets = packet_classes.map{|c| {c::TYPE => c.new(context, logger: logger)}}.inject({}, :merge)
end

Public Instance Methods

respond_to(request_payload) click to toggle source

Responds to a request.

@param request_payload [String] Request payload. @return [String] Response payload that is encoded packet generated by each SFTP protocol version and each request responder. @raise [RuntimeError] When the SFTP protocol version does not support or the library does not implement the request type.

# File lib/hrr_rb_sftp/protocol/version1/packets.rb, line 30
def respond_to request_payload
  request_type = request_payload[0].unpack("C")[0]
  response_packet = if @packets.has_key?(request_type)
                      request_packet = @packets[request_type].decode request_payload
                      @packets[request_type].respond_to request_packet
                    else
                      raise RuntimeError, "Unsupported type: #{request_type}"
                    end
  response_type = response_packet[:"type"]
  @packets[response_type].encode response_packet
end

Private Instance Methods

packet_classes() click to toggle source
# File lib/hrr_rb_sftp/protocol/version1/packets.rb, line 44
def packet_classes
  self.class.constants.select{|c| c.to_s.start_with?("SSH_FXP_")}.map{|c| self.class.const_get(c)}
end