fluent-plugin-http_shadow 0.0.1 → 0.0.2
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/fluent-plugin-http_shadow.gemspec +3 -1
- data/lib/fluent/plugin/out_http_shadow.rb +60 -41
- data/test/plugin/test_out_http_shadow.rb +3 -20
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85934dddb2f9ec1e02ec98997f0fb71dff86153e
|
4
|
+
data.tar.gz: 41cc427fce05f732a149e5196f012507fea3d5b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fe72dfeaa974d5bcfe7ae08bbad021fa149b24c62440d954a854b6993679aae74fd983ddeca2da1500265107b40c2468ae926b87f8977cfd905d2d285a9b300
|
7
|
+
data.tar.gz: 84ff822909dc2b4cf154a75e8d7b62c3d4a9a97949122cbaecc254b70cd9189503512d1844ba24755071aa1c475080ee54a65e6e87111fe5dfebccbcc8eed6e4
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = "fluent-plugin-http_shadow"
|
5
|
-
gem.version = "0.0.
|
5
|
+
gem.version = "0.0.2"
|
6
6
|
gem.summary = %q{copy http request. use shadow proxy server.}
|
7
7
|
gem.description = %q{copy http request. use shadow proxy server.}
|
8
8
|
gem.license = "MIT"
|
@@ -15,6 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
16
16
|
gem.require_paths = ['lib']
|
17
17
|
|
18
|
+
gem.add_runtime_dependency "typhoeus"
|
19
|
+
gem.add_runtime_dependency "addressable"
|
18
20
|
gem.add_development_dependency 'bundler', '~> 1.7.2'
|
19
21
|
gem.add_development_dependency 'fluentd', '~> 0.10.58'
|
20
22
|
gem.add_development_dependency 'pry', '~> 0.10.1'
|
@@ -1,34 +1,32 @@
|
|
1
|
-
require 'json'
|
2
1
|
module Fluent
|
3
|
-
class HttpShadowOutput < Fluent::
|
2
|
+
class HttpShadowOutput < Fluent::BufferedOutput
|
4
3
|
Fluent::Plugin.register_output('http_shadow', self)
|
5
4
|
|
6
5
|
def initialize
|
7
6
|
super
|
8
7
|
require 'uri'
|
9
|
-
require 'net/http'
|
10
8
|
require 'erb'
|
9
|
+
require 'typhoeus'
|
10
|
+
require "addressable/uri"
|
11
11
|
end
|
12
12
|
|
13
13
|
config_param :host, :string, :default => nil
|
14
14
|
config_param :host_key, :string, :default => nil
|
15
15
|
config_param :host_hash, :hash, :default => nil
|
16
16
|
config_param :path_format, :string
|
17
|
-
config_param :method_key, :string
|
17
|
+
config_param :method_key, :string, :default => nil
|
18
18
|
config_param :header_hash, :hash, :default => nil
|
19
19
|
config_param :cookie_hash, :hash, :default => nil
|
20
20
|
config_param :params_key, :string, :default => nil
|
21
|
+
config_param :max_concurrency, :integer, :default => 10
|
22
|
+
config_param :timeout, :integer, :default => 5
|
23
|
+
config_param :username, :string, :default => nil
|
24
|
+
config_param :password, :string, :default => nil
|
21
25
|
|
22
26
|
def configure(conf)
|
23
27
|
super
|
24
|
-
if host
|
25
|
-
@http = Net::HTTP.new(host)
|
26
|
-
else
|
27
|
-
@host_hash = Hash[@host_hash.map { |k,v| [k, Net::HTTP.new(v)] }]
|
28
|
-
end
|
29
28
|
@regexp = /\$\{([^}]+)\}/
|
30
|
-
@path_format = @path_format.gsub(@regexp, "<%=record['" + '\1' + "'] %>")
|
31
|
-
@path_format = ERB.new(@path_format)
|
29
|
+
@path_format = ERB.new(@path_format.gsub(@regexp, "<%=record['" + '\1' + "'] %>"))
|
32
30
|
|
33
31
|
@headers = get_formatter(@header_hash)
|
34
32
|
@cookies = get_formatter(@cookie_hash)
|
@@ -42,38 +40,49 @@ module Fluent
|
|
42
40
|
super
|
43
41
|
end
|
44
42
|
|
45
|
-
def
|
46
|
-
|
47
|
-
es.each {|time,record|
|
48
|
-
http = @http || @host_hash[record[@host_key]]
|
49
|
-
next if http.nil?
|
50
|
-
send_request(http, record)
|
51
|
-
}
|
43
|
+
def format(tag, time, record)
|
44
|
+
[tag, time, record].to_msgpack
|
52
45
|
end
|
53
46
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
params = record[@params_key]
|
59
|
-
unless params.nil?
|
60
|
-
path = add_query_string(path, record, params) if method !~ /POST/i
|
47
|
+
def write(chunk)
|
48
|
+
records = []
|
49
|
+
chunk.msgpack_each do |tag, time, record|
|
50
|
+
records << record
|
61
51
|
end
|
62
|
-
|
63
|
-
|
64
|
-
|
52
|
+
send_request_parallel(records)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def send_request_parallel(records)
|
58
|
+
hydra = Typhoeus::Hydra.new(max_concurrency: @max_concurrency)
|
59
|
+
records.each do |record|
|
60
|
+
host = @host || @host_hash[record[@host_key]]
|
61
|
+
next if host.nil?
|
62
|
+
hydra.queue(get_request(host, record))
|
65
63
|
end
|
66
|
-
|
67
|
-
req['Cookie'] = get_cookie_string(record) if @cookie_hash
|
68
|
-
response = http.request(req)
|
64
|
+
hydra.run
|
69
65
|
end
|
70
66
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
67
|
+
def get_request(host, record)
|
68
|
+
method = (record[@method_key] || 'get').downcase.to_sym
|
69
|
+
path = @path_format.result(binding)
|
70
|
+
|
71
|
+
url = "http://" + host + path
|
72
|
+
uri = Addressable::URI.parse(url)
|
73
|
+
params = uri.query_values
|
74
|
+
params.merge(record[@params_key]) unless record[@params_key].nil?
|
75
|
+
|
76
|
+
option = {
|
77
|
+
timeout: @timeout * 1000,
|
78
|
+
followlocation: true,
|
79
|
+
method: method,
|
80
|
+
params: params,
|
81
|
+
headers: get_header(record)
|
82
|
+
}
|
83
|
+
option[:userpwd] = "#{@username}:#{@password}" if @username
|
84
|
+
|
85
|
+
Typhoeus::Request.new("http://" + host + uri.path, option)
|
77
86
|
end
|
78
87
|
|
79
88
|
def get_formatter(hash)
|
@@ -86,17 +95,27 @@ module Fluent
|
|
86
95
|
formatter
|
87
96
|
end
|
88
97
|
|
89
|
-
def
|
98
|
+
def get_params(query, record_params)
|
99
|
+
params = query.nil? ? {} : Hash[URI::decode_www_form(query)]
|
100
|
+
if record_params
|
101
|
+
params = params.merge(record_params)
|
102
|
+
end
|
103
|
+
params
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_header(record)
|
107
|
+
header = {}
|
90
108
|
@headers.each do |k, v|
|
91
|
-
|
109
|
+
header[k] = v.result(binding)
|
92
110
|
end
|
93
|
-
|
111
|
+
header['Cookie'] = get_cookie_string(record) if @cookie_hash
|
112
|
+
header
|
94
113
|
end
|
95
114
|
|
96
115
|
def get_cookie_string(record)
|
97
116
|
@cookies.map{|k, v|
|
98
117
|
"#{k}=#{v.result(binding)}"
|
99
|
-
}.join(';')
|
118
|
+
}.join('; ')
|
100
119
|
end
|
101
120
|
end
|
102
121
|
end
|
@@ -4,29 +4,12 @@ class HttpShadowOutputTest < Test::Unit::TestCase
|
|
4
4
|
Fluent::Test.setup
|
5
5
|
end
|
6
6
|
|
7
|
-
|
8
|
-
host staging.exsample.com
|
9
|
-
path_format ${path}
|
10
|
-
method_key method
|
11
|
-
]
|
12
|
-
|
13
|
-
def create_driver(conf = CONFIG, tag='test')
|
14
|
-
Fluent::Test::OutputTestDriver.new(Fluent::HttpShadowOutput, tag).configure(conf)
|
7
|
+
def create_driver(conf)
|
15
8
|
end
|
16
9
|
|
17
10
|
def test_configure
|
18
|
-
d = create_driver
|
19
|
-
assert_equal 'method', d.instance.method_key
|
20
|
-
assert_equal nil, d.instance.header_hash
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_configure_error
|
24
|
-
config = %[
|
25
|
-
method_key method
|
26
|
-
]
|
27
|
-
assert_raise(Fluent::ConfigError) do
|
28
|
-
d = create_driver(config)
|
29
|
-
end
|
30
11
|
end
|
31
12
|
|
32
13
|
end
|
14
|
+
|
15
|
+
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-http_shadow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Toyama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: typhoeus
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: addressable
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|