Class: ConsoleUtils::RequestUtils::Remo::Curl

Inherits:
Object
  • Object
show all
Defined in:
lib/console_utils/request_utils/remo.rb

Constant Summary collapse

OUT_FORMAT =
'\n%{http_code}\n%{time_total}\n%{size_download}'.freeze
HEADER_JOIN_PROC =
proc { |*kv| ["-H", kv.flatten.join(": ")] }
KEY_MAP =
{ ">" => :request, "<" => :response }

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(request_method, url, data: nil, headers: nil) ⇒ Curl

Returns a new instance of Curl.



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# 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

Instance Attribute Details

#payloadObject (readonly)

Returns the value of attribute payload.



77
78
79
# File 'lib/console_utils/request_utils/remo.rb', line 77

def payload
  @payload
end

#requestObject (readonly)

Returns the value of attribute request.



77
78
79
# File 'lib/console_utils/request_utils/remo.rb', line 77

def request
  @request
end

#responseObject (readonly)

Returns the value of attribute response.



77
78
79
# File 'lib/console_utils/request_utils/remo.rb', line 77

def response
  @response
end

Class Method Details

.call(*args) {|result.to_h, result.payload| ... } ⇒ Object

Yields:



72
73
74
75
# File 'lib/console_utils/request_utils/remo.rb', line 72

def self.call(*args)
  result = new(*args)
  yield(result.to_h, result.payload)
end

Instance Method Details

#process_stderr(line) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
# 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) ⇒ Object



129
130
131
132
133
134
135
136
137
# 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) ⇒ Object



139
140
141
142
143
144
145
146
147
# 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_hObject



149
150
151
# File 'lib/console_utils/request_utils/remo.rb', line 149

def to_h
  { response: @response, request: @request }
end

#verbose?Boolean

Returns:

  • (Boolean)


153
154
155
# File 'lib/console_utils/request_utils/remo.rb', line 153

def verbose?
  !ConsoleUtils.curl_silence
end