class WinRM::PSRP::ReceiveResponseReader

Class for reading powershell responses in Receive_Response messages

Public Class Methods

new(transport, logger) click to toggle source

Creates a new ReceiveResponseReader @param transport [HttpTransport] The WinRM SOAP transport @param logger [Logger] The logger to log diagnostic messages to

Calls superclass method
# File lib/winrm/psrp/receive_response_reader.rb, line 26
def initialize(transport, logger)
  super
  @output_decoder = PowershellOutputDecoder.new
end

Public Instance Methods

read_message(wsmv_message, wait_for_done_state = false) { |message| ... } click to toggle source

Reads PSRP messages sent in one or more receive response messages @param wsmv_message [WinRM::WSMV::Base] A wsmv message to send to endpoint @param wait_for_done_state whether to poll for a CommandState of Done @yield [Message] PSRP Message in response @yieldreturn [Array<Message>] All messages in response

# File lib/winrm/psrp/receive_response_reader.rb, line 36
def read_message(wsmv_message, wait_for_done_state = false)
  messages = []
  defragmenter = MessageDefragmenter.new
  read_response(wsmv_message, wait_for_done_state) do |stream|
    message = defragmenter.defragment(stream[:text])
    next unless message

    if block_given?
      yield message
    else
      messages.push(message)
    end
  end
  messages unless block_given?
end
read_output(wsmv_message) { |out, out| ... } click to toggle source

Reads streams and returns decoded output @param wsmv_message [WinRM::WSMV::Base] A wsmv message to send to endpoint @yieldparam [string] standard out response text @yieldparam [string] standard error response text @yieldreturn [WinRM::Output] The command output

# File lib/winrm/psrp/receive_response_reader.rb, line 57
def read_output(wsmv_message)
  with_output do |output|
    read_message(wsmv_message, true) do |message|
      exit_code = find_exit_code(message)
      output.exitcode = exit_code if exit_code
      decoded_text = @output_decoder.decode(message)
      next unless decoded_text

      out = { stream_type(message) => decoded_text }
      output << out
      yield [out[:stdout], out[:stderr]] if block_given?
    end
  end
end

Private Instance Methods

find_exit_code(message) click to toggle source
# File lib/winrm/psrp/receive_response_reader.rb, line 87
def find_exit_code(message)
  parsed = message.parsed_data
  return nil unless parsed.is_a?(MessageData::PipelineHostCall)

  parsed.method_parameters[:i32].to_i if parsed.method_identifier == 'SetShouldExit'
end
stream_type(message) click to toggle source
# File lib/winrm/psrp/receive_response_reader.rb, line 74
def stream_type(message)
  type = :stdout
  case message.type
  when WinRM::PSRP::Message::MESSAGE_TYPES[:error_record]
    type = :stderr
  when WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_host_call]
    type = :stderr if message.data.include?('WriteError')
  when WinRM::PSRP::Message::MESSAGE_TYPES[:pipeline_state]
    type = :stderr if message.parsed_data.pipeline_state == WinRM::PSRP::MessageData::PipelineState::FAILED
  end
  type
end