Class: ConsoleUtils::RequestUtils::Remo::Curl
- Inherits:
-
Object
- Object
- ConsoleUtils::RequestUtils::Remo::Curl
- 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
-
#payload ⇒ Object
readonly
Returns the value of attribute payload.
-
#request ⇒ Object
readonly
Returns the value of attribute request.
-
#response ⇒ Object
readonly
Returns the value of attribute response.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(request_method, url, data: nil, headers: nil) ⇒ Curl
constructor
A new instance of Curl.
- #process_stderr(line) ⇒ Object
- #set_request(line) ⇒ Object
- #set_response(line) ⇒ Object
- #to_h ⇒ Object
- #verbose? ⇒ Boolean
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
#payload ⇒ Object (readonly)
Returns the value of attribute payload.
77 78 79 |
# File 'lib/console_utils/request_utils/remo.rb', line 77 def payload @payload end |
#request ⇒ Object (readonly)
Returns the value of attribute request.
77 78 79 |
# File 'lib/console_utils/request_utils/remo.rb', line 77 def request @request end |
#response ⇒ Object (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
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_h ⇒ Object
149 150 151 |
# File 'lib/console_utils/request_utils/remo.rb', line 149 def to_h { response: @response, request: @request } end |
#verbose? ⇒ Boolean
153 154 155 |
# File 'lib/console_utils/request_utils/remo.rb', line 153 def verbose? !ConsoleUtils.curl_silence end |