class ConsoleUtils::RequestUtils::Remo::Curl

Constants

HEADER_JOIN_PROC
KEY_MAP
OUT_FORMAT

Attributes

payload[R]
request[R]
response[R]

Public Class Methods

call(*args) { |to_h, payload| ... } click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 72
def self.call(*args)
  result = new(*args)
  yield(result.to_h, result.payload)
end
new(request_method, url, data: nil, headers: nil) click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 79
def initialize(request_method, url, data: nil, headers: nil)
  cmd = %W(#{ConsoleUtils.curl_bin} --silent -v -g)
  cmd.push("-X#{request_method}")
  cmd.push(url)

  cmd.concat(headers.flat_map(&HEADER_JOIN_PROC)) if headers.present?
  cmd.push("-d", data) if data.present?

  cmd_line = Shellwords.join(cmd)
  cmd_line << %( --write-out "#{OUT_FORMAT}")

  puts "$ #{cmd_line}" if verbose?

  @response = {}
  @request  = {}
  @payload  = []

  Open3.popen3(cmd_line) do |stdin, stdout, stderr, thr|
    # stdin.close
    { stderr: stderr, stdout: stdout }.each do |key, io|
      Thread.new do
        begin
          until (line = io.gets).nil? do
            key == :stderr ? process_stderr(line) : @payload << line
          end
        rescue => e
          warn e
        end
      end
    end
    thr.join
  end
end

Public Instance Methods

process_stderr(line) click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 115
def process_stderr(line)
  # warn(line)
  if type = KEY_MAP[line.chr]
    line = line[2, line.size-1].strip

    return if line.size == 0

    case type
    when :request; set_request(line)
    when :response; set_response(line)
    end
  end
end
set_request(line) click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 129
def set_request(line)
  # warn("Request: #{line}")
  if !@request.key?(:http_version) && line =~ /^(GET|POST|PUT|PATCH|HEAD|OPTION|DELETE) (.+?) HTTP\/(.+)$/
    @request.merge!(method: $1, url: $2, http_version: $3)
  else
    header, value = line.split(": ", 2)
    @request[header] = value
  end
end
set_response(line) click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 139
def set_response(line)
  # warn("Response: #{line}")
  if !@response.key?(:http_version) && line =~ /^HTTP\/(.+) (\d+?) (.+)$/
    @response.merge!(http_version: $1, http_code: $2.to_i, http_status: $3)
  else
    header, value = line.split(": ", 2)
    @response[header] = value
  end
end
to_h() click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 149
def to_h
  { response: @response, request: @request }
end
verbose?() click to toggle source
# File lib/console_utils/request_utils/remo.rb, line 153
def verbose?
  !ConsoleUtils.curl_silence
end