eac_tools 0.65.0 → 0.65.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +28 -22
- data/lib/eac_tools/version.rb +1 -1
- data/sub/aranha-parsers/aranha-parsers.gemspec +4 -4
- data/sub/aranha-parsers/lib/aranha/parsers/base.rb +10 -5
- data/sub/aranha-parsers/lib/aranha/parsers/html/base.rb +14 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/node/default/string_support.rb +6 -6
- data/sub/aranha-parsers/lib/aranha/parsers/html/node/default.rb +16 -2
- data/sub/aranha-parsers/lib/aranha/parsers/version.rb +1 -1
- data/sub/avm-eac_ruby_base1/avm-eac_ruby_base1.gemspec +4 -3
- data/sub/avm-eac_ruby_base1/lib/avm/eac_ruby_base1/launcher_stereotypes/base/publish.rb +8 -9
- data/sub/avm-eac_ruby_base1/lib/avm/eac_ruby_base1/version.rb +1 -1
- data/sub/eac_envs-http/Gemfile +8 -0
- data/sub/eac_envs-http/eac_envs-http.gemspec +25 -0
- data/sub/eac_envs-http/lib/eac_envs/http/error.rb +8 -0
- data/sub/eac_envs-http/lib/eac_envs/http/request/body_field.rb +51 -0
- data/sub/eac_envs-http/lib/eac_envs/http/request/body_field_value.rb +32 -0
- data/sub/eac_envs-http/lib/eac_envs/http/request/body_fields.rb +39 -0
- data/sub/eac_envs-http/lib/eac_envs/http/request/faraday_connection.rb +75 -0
- data/sub/eac_envs-http/lib/eac_envs/http/request.rb +58 -0
- data/sub/eac_envs-http/lib/eac_envs/http/response/body.rb +57 -0
- data/sub/eac_envs-http/lib/eac_envs/http/response/headers.rb +41 -0
- data/sub/eac_envs-http/lib/eac_envs/http/response/links.rb +28 -0
- data/sub/eac_envs-http/lib/eac_envs/http/response/statuses.rb +21 -0
- data/sub/eac_envs-http/lib/eac_envs/http/response.rb +30 -0
- data/sub/eac_envs-http/lib/eac_envs/http/rspec/echo_server/request_processor.rb +42 -0
- data/sub/eac_envs-http/lib/eac_envs/http/rspec/echo_server/webrick_servlet.rb +22 -0
- data/sub/eac_envs-http/lib/eac_envs/http/rspec/echo_server.rb +63 -0
- data/sub/eac_envs-http/lib/eac_envs/http/rspec.rb +11 -0
- data/sub/eac_envs-http/lib/eac_envs/http/version.rb +7 -0
- data/sub/eac_envs-http/lib/eac_envs/http.rb +9 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request/body_fields_spec.rb +47 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec.rb +68 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/get.source.yaml +5 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/get.target.yaml +9 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/get_with_auth.source.yaml +8 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/get_with_auth.target.yaml +10 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/post_array_body.source.yaml +10 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/post_array_body.target.yaml +11 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/post_string_body.source.yaml +4 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/post_string_body.target.yaml +11 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/put_hash_body.source.yaml +6 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/put_hash_body.target.yaml +11 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/put_with_file.source.yaml +5 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/put_with_file.target.yaml +13 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/root.source.yaml +2 -0
- data/sub/eac_envs-http/spec/lib/eac_envs/http/request_spec_files/root.target.yaml +9 -0
- data/sub/eac_envs-http/spec/rubocop_spec.rb +3 -0
- data/sub/eac_envs-http/spec/spec_helper/request_builder.rb +61 -0
- data/sub/eac_envs-http/spec/spec_helper.rb +7 -0
- data/sub/eac_ruby_utils/lib/eac_ruby_utils/envs/executable.rb +14 -2
- data/sub/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
- metadata +44 -6
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
|
+
require 'json'
|
|
5
|
+
|
|
6
|
+
module EacEnvs
|
|
7
|
+
module Http
|
|
8
|
+
class Response < ::StandardError
|
|
9
|
+
module Body
|
|
10
|
+
delegate :response_body_data_proc, to: :request
|
|
11
|
+
|
|
12
|
+
def body_data
|
|
13
|
+
r = body_data_method_name.if_present(body_str) do |v|
|
|
14
|
+
respond_to?(v, true) ? send(v) : body_str
|
|
15
|
+
end
|
|
16
|
+
r = response_body_data_proc.call(r) if response_body_data_proc.present?
|
|
17
|
+
r
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def body_data_or_raise
|
|
21
|
+
raise_unless_200
|
|
22
|
+
|
|
23
|
+
body_data
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @return [String]
|
|
27
|
+
def body_str
|
|
28
|
+
performed.body
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def body_str_or_raise
|
|
32
|
+
raise_unless_200
|
|
33
|
+
|
|
34
|
+
body_str
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def body_data_from_application_json
|
|
40
|
+
::JSON.parse(body_str)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def body_data_from_application_xml
|
|
44
|
+
Hash.from_xml(body_str)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @return [String]
|
|
48
|
+
def body_data_method_name
|
|
49
|
+
content_type.if_present do |v|
|
|
50
|
+
'body_data_from_' +
|
|
51
|
+
v.split(';').first.force_encoding(::Encoding::UTF_8).variableize
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
|
+
|
|
5
|
+
module EacEnvs
|
|
6
|
+
module Http
|
|
7
|
+
class Response < ::StandardError
|
|
8
|
+
module Headers
|
|
9
|
+
COMMON_HEADERS = %w[Content-Type].freeze
|
|
10
|
+
HEADER_LINE_PARSER = /\A([^:]+):(.*)\z/.to_parser do |m|
|
|
11
|
+
[m[1].strip, m[2].strip]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def header(name)
|
|
15
|
+
hash_search(headers, name)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @return [Hash<String, String>]
|
|
19
|
+
def headers
|
|
20
|
+
performed.headers.to_hash
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
COMMON_HEADERS.each do |header_key|
|
|
24
|
+
define_method header_key.underscore do
|
|
25
|
+
header(header_key)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def hash_search(hash, key)
|
|
32
|
+
key = key.to_s.downcase
|
|
33
|
+
hash.each do |k, v|
|
|
34
|
+
return v if k.to_s.downcase == key
|
|
35
|
+
end
|
|
36
|
+
nil
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
|
+
module EacEnvs
|
|
5
|
+
module Http
|
|
6
|
+
class Response < ::StandardError
|
|
7
|
+
module Links
|
|
8
|
+
# https://www.w3.org/wiki/LinkHeader
|
|
9
|
+
LINKS_HEADER_NAME = 'Link'
|
|
10
|
+
|
|
11
|
+
# https://www.w3.org/wiki/LinkHeader
|
|
12
|
+
LINK_PARSER = /\A\<(.+)\>\s*;\s*rel\s*=\s*\"(.*)\"\z/.to_parser do |m|
|
|
13
|
+
[m[2], m[1]]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def link(rel)
|
|
17
|
+
hash_search(links, rel)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def links
|
|
21
|
+
header(LINKS_HEADER_NAME).if_present({}) do |v|
|
|
22
|
+
v.split(',').map { |w| LINK_PARSER.parse!(w.strip) }.to_h
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
|
+
|
|
5
|
+
module EacEnvs
|
|
6
|
+
module Http
|
|
7
|
+
class Response < ::StandardError
|
|
8
|
+
module Statuses
|
|
9
|
+
def raise_unless_200
|
|
10
|
+
return nil if status == 200
|
|
11
|
+
|
|
12
|
+
raise self
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def status
|
|
16
|
+
performed.status.to_i
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_support/core_ext/hash/conversions'
|
|
4
|
+
require 'eac_envs/http/error'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
require 'faraday'
|
|
7
|
+
require 'json'
|
|
8
|
+
|
|
9
|
+
module EacEnvs
|
|
10
|
+
module Http
|
|
11
|
+
class Response < ::StandardError
|
|
12
|
+
common_constructor :request
|
|
13
|
+
delegate :url, to: :request
|
|
14
|
+
|
|
15
|
+
def to_s
|
|
16
|
+
"URL: #{url}\nStatus: #{status}\nBody:\n\n#{body_str}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def performed
|
|
22
|
+
@performed ||= request.faraday_response
|
|
23
|
+
rescue ::Faraday::Error
|
|
24
|
+
raise ::EacEnvs::Http::Error
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
require_sub __FILE__, include_modules: true
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_envs/http/request'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
require 'webrick'
|
|
6
|
+
|
|
7
|
+
module EacEnvs
|
|
8
|
+
module Http
|
|
9
|
+
module Rspec
|
|
10
|
+
class EchoServer
|
|
11
|
+
class RequestProcessor
|
|
12
|
+
REQUEST_TO_DATA = {
|
|
13
|
+
ssl: :ssl?,
|
|
14
|
+
method: :request_method,
|
|
15
|
+
uri: :unparsed_uri,
|
|
16
|
+
body: :body
|
|
17
|
+
}.freeze
|
|
18
|
+
|
|
19
|
+
common_constructor :request, :response
|
|
20
|
+
|
|
21
|
+
def perform
|
|
22
|
+
response.body = response_body
|
|
23
|
+
response.header['Content-type'] = 'application/json'
|
|
24
|
+
response.status = 200
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def request_data
|
|
28
|
+
REQUEST_TO_DATA.map { |k, v| [k, request.send(v)] }.to_h.merge(headers: request_headers)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def request_headers
|
|
32
|
+
request.header.map { |k, v| [k, v.first] }.to_h
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def response_body
|
|
36
|
+
::JSON.generate(request_data)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_envs/http/request'
|
|
4
|
+
require 'eac_envs/http/rspec/echo_server/request_processor'
|
|
5
|
+
require 'eac_ruby_utils/core_ext'
|
|
6
|
+
require 'webrick'
|
|
7
|
+
|
|
8
|
+
module EacEnvs
|
|
9
|
+
module Http
|
|
10
|
+
module Rspec
|
|
11
|
+
class EchoServer
|
|
12
|
+
class WebrickServlet < WEBrick::HTTPServlet::AbstractServlet
|
|
13
|
+
::EacEnvs::Http::Request.lists.verb.each_value do |verb|
|
|
14
|
+
define_method "do_#{verb.to_s.upcase}" do |request, response|
|
|
15
|
+
::EacEnvs::Http::Rspec::EchoServer::RequestProcessor.new(request, response).perform
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'addressable'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
require 'webrick'
|
|
6
|
+
require 'webrick/https'
|
|
7
|
+
|
|
8
|
+
module EacEnvs
|
|
9
|
+
module Http
|
|
10
|
+
module Rspec
|
|
11
|
+
class EchoServer
|
|
12
|
+
HOSTNAME = 'localhost'
|
|
13
|
+
SCHEMES = {
|
|
14
|
+
http: { Port: 8080 },
|
|
15
|
+
https: { Port: 8443, SSLEnable: true, SSLCertName: [['CN', HOSTNAME]] }
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
SCHEMES.each do |scheme, webrick_options|
|
|
20
|
+
# @return [::EacEnvs::Http::Rspec::EchoServer]
|
|
21
|
+
define_method scheme do
|
|
22
|
+
new(scheme, webrick_options)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
common_constructor :scheme, :webrick_options
|
|
28
|
+
|
|
29
|
+
def on_active(&block)
|
|
30
|
+
servlet = webrick_servlet
|
|
31
|
+
::Thread.abort_on_exception = true
|
|
32
|
+
servlet_thread = ::Thread.new { servlet.start }
|
|
33
|
+
begin
|
|
34
|
+
sleep 0.001 while servlet.status != :Running
|
|
35
|
+
block.call
|
|
36
|
+
ensure
|
|
37
|
+
servlet.shutdown
|
|
38
|
+
servlet_thread.join
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def root_url
|
|
43
|
+
::Addressable::URI.new(
|
|
44
|
+
scheme: scheme.to_s,
|
|
45
|
+
host: ::EacEnvs::Http::Rspec::EchoServer::HOSTNAME,
|
|
46
|
+
port: webrick_options.fetch(:Port)
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
# @return [EacEnvs::Http::Rspec::EchoServer::WebrickServlet]
|
|
53
|
+
def webrick_servlet
|
|
54
|
+
r = ::WEBrick::HTTPServer.new(webrick_options)
|
|
55
|
+
r.mount '/', ::EacEnvs::Http::Rspec::EchoServer::WebrickServlet
|
|
56
|
+
r
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
require_sub __FILE__
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_envs/http/request/body_fields'
|
|
4
|
+
|
|
5
|
+
::RSpec.describe ::EacEnvs::Http::Request::BodyFields do
|
|
6
|
+
describe '#to_h' do
|
|
7
|
+
[
|
|
8
|
+
[
|
|
9
|
+
{ field1: 'value1', field2: %w[value2 value3] },
|
|
10
|
+
{ 'field1' => ['value1'], 'field2' => %w[value2 value3] }
|
|
11
|
+
], [
|
|
12
|
+
'field1=value1&field2=value2',
|
|
13
|
+
nil
|
|
14
|
+
], [
|
|
15
|
+
[%w[field1 value1], %w[field2 value2], %w[field2 value3]],
|
|
16
|
+
{ 'field1' => ['value1'], 'field2' => %w[value2 value3] }
|
|
17
|
+
]
|
|
18
|
+
].each do |d|
|
|
19
|
+
source_body = d[0]
|
|
20
|
+
expected_result = d[1]
|
|
21
|
+
context "when source_body is #{source_body}" do
|
|
22
|
+
let(:instance) { described_class.new(source_body) }
|
|
23
|
+
|
|
24
|
+
it do
|
|
25
|
+
expect(instance.to_h).to eq(expected_result)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'when source_body has a file' do
|
|
31
|
+
let(:file) do
|
|
32
|
+
temp = ::EacRubyUtils::Fs::Temp.file
|
|
33
|
+
temp.write('TEMPORARY')
|
|
34
|
+
::File.new(temp.to_path)
|
|
35
|
+
end
|
|
36
|
+
let(:source_body) { { file1: file } }
|
|
37
|
+
let(:instance) { described_class.new(source_body) }
|
|
38
|
+
let(:expected_file) { ::Faraday::Multipart::FilePart.new(file.path, 'text/plain') }
|
|
39
|
+
|
|
40
|
+
%w[class original_filename local_path content_type].each do |attr|
|
|
41
|
+
it do
|
|
42
|
+
expect(instance.to_h.fetch('file1').first.send(attr)).to eq(expected_file.send(attr))
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_envs/http/error'
|
|
4
|
+
require 'eac_envs/http/request'
|
|
5
|
+
require 'eac_envs/http/rspec/echo_server'
|
|
6
|
+
|
|
7
|
+
::RSpec.describe ::EacEnvs::Http::Request do
|
|
8
|
+
let(:http_server) { ::EacEnvs::Http::Rspec::EchoServer.http }
|
|
9
|
+
|
|
10
|
+
around { |example| http_server.on_active(&example) }
|
|
11
|
+
|
|
12
|
+
before do
|
|
13
|
+
allow_any_instance_of(::Faraday::Multipart::Middleware).to( # rubocop:disable RSpec/AnyInstance
|
|
14
|
+
receive(:unique_boundary)
|
|
15
|
+
.and_return('-----------RubyMultipartPost-0123456789abcdef0123456789abcdef')
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
include_examples 'source_target_fixtures', __FILE__
|
|
20
|
+
|
|
21
|
+
def source_data(source_file)
|
|
22
|
+
remove_variable_values(
|
|
23
|
+
::JSON.parse(
|
|
24
|
+
::RequestBuilder.from_file(http_server.root_url, source_file).result.response.body_str
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def remove_variable_values(obj)
|
|
30
|
+
if obj.is_a?(::Hash)
|
|
31
|
+
remove_variable_values_from_hash(obj)
|
|
32
|
+
elsif obj.is_a?(::Enumerable)
|
|
33
|
+
remove_variable_values_from_enumerable(obj)
|
|
34
|
+
end
|
|
35
|
+
obj
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def remove_variable_values_from_hash(hash)
|
|
39
|
+
%w[host hostname ip].each { |key| hash.delete(key) }
|
|
40
|
+
hash.each_value { |value| remove_variable_values(value) }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def remove_variable_values_from_enumerable(enumerable)
|
|
44
|
+
enumerable.each { |value| remove_variable_values(value) }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context 'with self signed https server' do
|
|
48
|
+
let(:http_server) { ::EacEnvs::Http::Rspec::EchoServer.https }
|
|
49
|
+
let(:instance) { described_class.new.url(http_server.root_url + '/any/path') }
|
|
50
|
+
let(:response_body) { request.response.body_str }
|
|
51
|
+
|
|
52
|
+
context 'when no additional flag' do
|
|
53
|
+
let(:request) { instance }
|
|
54
|
+
|
|
55
|
+
it do
|
|
56
|
+
expect { response_body }.to(raise_error(::EacEnvs::Http::Error))
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context 'when ssl_verify disabled' do
|
|
61
|
+
let(:request) { instance.ssl_verify(false) }
|
|
62
|
+
|
|
63
|
+
it do
|
|
64
|
+
expect { response_body }.not_to raise_error
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
ssl: false
|
|
3
|
+
method: POST
|
|
4
|
+
uri: "/path/to/service"
|
|
5
|
+
body: field1=value1&field1=value3&field2=value2
|
|
6
|
+
headers:
|
|
7
|
+
user-agent: Faraday v2.7.4
|
|
8
|
+
content-type: application/x-www-form-urlencoded
|
|
9
|
+
accept-encoding: gzip,deflate
|
|
10
|
+
accept: "*/*"
|
|
11
|
+
content-length: '41'
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
ssl: false
|
|
3
|
+
method: PUT
|
|
4
|
+
uri: "/path/to/service"
|
|
5
|
+
body: "-------------RubyMultipartPost-0123456789abcdef0123456789abcdef\r\nContent-Disposition:
|
|
6
|
+
form-data; name=\"field1\"; filename=\"basename\"\r\nContent-Length: 6\r\nContent-Type:
|
|
7
|
+
text/plain\r\nContent-Transfer-Encoding: binary\r\n\r\nvalue1\r\n-------------RubyMultipartPost-0123456789abcdef0123456789abcdef--\r\n"
|
|
8
|
+
headers:
|
|
9
|
+
user-agent: Faraday v2.7.4
|
|
10
|
+
content-type: multipart/form-data; boundary=-----------RubyMultipartPost-0123456789abcdef0123456789abcdef
|
|
11
|
+
content-length: '290'
|
|
12
|
+
accept-encoding: gzip,deflate
|
|
13
|
+
accept: "*/*"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
|
+
require 'eac_ruby_utils/fs/temp'
|
|
5
|
+
require 'eac_ruby_utils/yaml'
|
|
6
|
+
|
|
7
|
+
class RequestBuilder
|
|
8
|
+
class << self
|
|
9
|
+
def from_file(root_url, path)
|
|
10
|
+
new(root_url, ::EacRubyUtils::Yaml.load_file(path))
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
FILE_FIELD_PARSER = /\A@(.+)\z/.to_parser { |m| m[1] }
|
|
15
|
+
|
|
16
|
+
common_constructor :root_url, :data do
|
|
17
|
+
self.root_url = root_url.to_uri
|
|
18
|
+
self.data = data.with_indifferent_access
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def new_request
|
|
22
|
+
::EacEnvs::Http::Request.new.url(root_url + data.fetch(:url_suffix))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def result
|
|
26
|
+
r = %i[verb headers].inject(new_request) do |a, e|
|
|
27
|
+
data[e].if_present(a) { |v| a.send(e, v) }
|
|
28
|
+
end
|
|
29
|
+
result_body_data(result_auth(r))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def build_body_data(source)
|
|
33
|
+
return source unless source.is_a?(::Hash)
|
|
34
|
+
|
|
35
|
+
source.map { |k, v| build_body_field(k, v) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def build_body_field(name, value)
|
|
39
|
+
FILE_FIELD_PARSER.parse(name).if_present([name, value]) do |v|
|
|
40
|
+
[v, file_with_value(value)]
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def file_with_value(value)
|
|
45
|
+
r = ::EacRubyUtils::Fs::Temp.directory.join('basename')
|
|
46
|
+
r.write(value)
|
|
47
|
+
::File.new(r.to_path)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def result_auth(request)
|
|
53
|
+
request = data[:auth].if_present(request) do |v|
|
|
54
|
+
request.basic_auth(v.fetch(:username), v.fetch(:password))
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def result_body_data(request)
|
|
59
|
+
data[:body_data].if_present(request) { |v| request.body_data(build_body_data(v)) }
|
|
60
|
+
end
|
|
61
|
+
end
|