sp-logstash-input-http 3.3.7-java

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.
@@ -0,0 +1,504 @@
1
+ require "logstash/devutils/rspec/spec_helper"
2
+ require "logstash/devutils/rspec/shared_examples"
3
+ require "logstash/inputs/http"
4
+ require "json"
5
+ require "manticore"
6
+ require "stud/temporary"
7
+ require "zlib"
8
+ require "stringio"
9
+
10
+ java_import "io.netty.handler.ssl.util.SelfSignedCertificate"
11
+
12
+ describe LogStash::Inputs::Http do
13
+
14
+ before do
15
+ srand(RSpec.configuration.seed)
16
+ end
17
+
18
+ let(:client) { Manticore::Client.new(client_options) }
19
+ let(:client_options) { { } }
20
+ let(:logstash_queue) { Queue.new }
21
+ let(:port) { rand(5000) + 1025 }
22
+
23
+ it_behaves_like "an interruptible input plugin" do
24
+ let(:config) { { "port" => port } }
25
+ end
26
+
27
+ after :each do
28
+ client.clear_pending
29
+ client.close
30
+ subject.stop
31
+ end
32
+
33
+ describe "request handling" do
34
+ subject { LogStash::Inputs::Http.new("port" => port) }
35
+
36
+ before :each do
37
+ subject.register
38
+ t = Thread.new { subject.run(logstash_queue) }
39
+ ok = false
40
+ until ok
41
+ begin
42
+ client.post("http://127.0.0.1:#{port}", :body => '{}').call
43
+ rescue => e
44
+ # retry
45
+ else
46
+ ok = true
47
+ end
48
+ sleep 0.01
49
+ end
50
+ logstash_queue.pop if logstash_queue.size == 1 # pop test event
51
+ end
52
+
53
+ describe "handling overflowing requests with a 429" do
54
+ let(:logstash_queue_size) { rand(10) + 1 }
55
+ let(:max_pending_requests) { rand(5) + 1 }
56
+ let(:threads) { rand(4) + 1 }
57
+ let(:logstash_queue) { SizedQueue.new(logstash_queue_size) }
58
+ let(:client_options) { {
59
+ "request_timeout" => 0.1,
60
+ "connect_timeout" => 3,
61
+ "socket_timeout" => 0.1
62
+ } }
63
+
64
+ subject { described_class.new("port" => port, "threads" => threads, "max_pending_requests" => max_pending_requests) }
65
+
66
+ context "when sending more requests than queue slots" do
67
+ it "should block when the queue is full" do
68
+ # these will queue and return 200
69
+ logstash_queue_size.times.each do |i|
70
+ response = client.post("http://127.0.0.1:#{port}", :body => '{}').call
71
+ expect(response.code).to eq(200)
72
+ end
73
+
74
+ # these will block
75
+ (threads + max_pending_requests).times.each do |i|
76
+ expect {
77
+ client.post("http://127.0.0.1:#{port}", :body => '{}').call
78
+ }.to raise_error(Manticore::SocketTimeout)
79
+ end
80
+
81
+ # by now we should be rejecting with 429
82
+ response = client.post("http://127.0.0.1:#{port}", :body => '{}').call
83
+ expect(response.code).to eq(429)
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "remote host" do
89
+ subject { LogStash::Inputs::Http.new(config.merge("port" => port)) }
90
+ context "by default" do
91
+ let(:config) { {} }
92
+ it "is written to the \"host\" field" do
93
+ client.post("http://localhost:#{port}/meh.json",
94
+ :headers => { "content-type" => "text/plain" },
95
+ :body => "hello").call
96
+ event = logstash_queue.pop
97
+ expect(event.get("host")).to eq("127.0.0.1")
98
+ end
99
+ end
100
+
101
+ context "when using remote_host_target_field" do
102
+ let(:config) { { "remote_host_target_field" => "remote_host" } }
103
+ it "is written to the value of \"remote_host_target_field\" property" do
104
+ client.post("http://localhost:#{port}/meh.json",
105
+ :headers => { "content-type" => "text/plain" },
106
+ :body => "hello").call
107
+ event = logstash_queue.pop
108
+ expect(event.get("remote_host")).to eq("127.0.0.1")
109
+ end
110
+ end
111
+ end
112
+
113
+ describe "request headers" do
114
+ subject { LogStash::Inputs::Http.new(config.merge("port" => port)) }
115
+ context "by default" do
116
+ let(:config) { {} }
117
+ it "are written to the \"headers\" field" do
118
+ client.post("http://localhost:#{port}/meh.json",
119
+ :headers => { "content-type" => "text/plain" },
120
+ :body => "hello").call
121
+ event = logstash_queue.pop
122
+ expect(event.get("headers")).to be_a(Hash)
123
+ expect(event.get("headers")).to include("request_method" => "POST")
124
+ end
125
+ end
126
+ context "when using request_headers_target_field" do
127
+ let(:config) { { "request_headers_target_field" => "request_headers" } }
128
+ it "are written to the field set in \"request_headers_target_field\"" do
129
+ client.post("http://localhost:#{port}/meh.json",
130
+ :headers => { "content-type" => "text/plain" },
131
+ :body => "hello").call
132
+ event = logstash_queue.pop
133
+ expect(event.get("request_headers")).to be_a(Hash)
134
+ expect(event.get("request_headers")).to include("request_method" => "POST")
135
+ end
136
+ end
137
+ end
138
+
139
+ it "should include remote host in \"host\" property" do
140
+ client.post("http://127.0.0.1:#{port}/meh.json",
141
+ :headers => { "content-type" => "text/plain" },
142
+ :body => "hello").call
143
+ event = logstash_queue.pop
144
+ expect(event.get("host")).to eq("127.0.0.1")
145
+ end
146
+
147
+ context "with default codec" do
148
+ subject { LogStash::Inputs::Http.new("port" => port) }
149
+ context "when receiving a text/plain request" do
150
+ it "should process the request normally" do
151
+ client.post("http://127.0.0.1:#{port}/meh.json",
152
+ :headers => { "content-type" => "text/plain" },
153
+ :body => "hello").call
154
+ event = logstash_queue.pop
155
+ expect(event.get("message")).to eq("hello")
156
+ end
157
+ end
158
+ context "when receiving a deflate compressed text/plain request" do
159
+ it "should process the request normally" do
160
+ client.post("http://127.0.0.1:#{port}/meh.json",
161
+ :headers => { "content-type" => "text/plain", "content-encoding" => "deflate" },
162
+ :body => Zlib::Deflate.deflate("hello")).call
163
+ event = logstash_queue.pop
164
+ expect(event.get("message")).to eq("hello")
165
+ end
166
+ end
167
+ context "when receiving a deflate text/plain request that cannot be decompressed" do
168
+ let(:response) do
169
+ response = client.post("http://127.0.0.1:#{port}/meh.json",
170
+ :headers => { "content-type" => "text/plain", "content-encoding" => "deflate" },
171
+ :body => "hello").call
172
+ end
173
+ it "should respond with 400" do
174
+ expect(response.code).to eq(400)
175
+ end
176
+ end
177
+ context "when receiving a gzip compressed text/plain request" do
178
+ it "should process the request normally" do
179
+ wio = StringIO.new("w")
180
+ z = Zlib::GzipWriter.new(wio)
181
+ z.write("hello")
182
+ z.close
183
+ entity = org.apache.http.entity.ByteArrayEntity.new(wio.string.to_java_bytes)
184
+ response = client.post("http://127.0.0.1:#{port}",
185
+ :headers => { "Content-Encoding" => "gzip" },
186
+ :entity => entity).call
187
+ expect(response.code).to eq(200)
188
+ event = logstash_queue.pop
189
+ expect(event.get("message")).to eq("hello")
190
+ end
191
+ end
192
+ context "when receiving a gzip text/plain request that cannot be decompressed" do
193
+ let(:response) do
194
+ client.post("http://127.0.0.1:#{port}",
195
+ :headers => { "Content-Encoding" => "gzip" },
196
+ :body => Zlib::Deflate.deflate("hello")).call
197
+ end
198
+ it "should respond with 400" do
199
+ expect(response.code).to eq(400)
200
+ end
201
+ end
202
+ context "when receiving an application/json request" do
203
+ it "should parse the json body" do
204
+ client.post("http://127.0.0.1:#{port}/meh.json",
205
+ :headers => { "content-type" => "application/json" },
206
+ :body => { "message_body" => "Hello" }.to_json).call
207
+ event = logstash_queue.pop
208
+ expect(event.get("message_body")).to eq("Hello")
209
+ end
210
+ end
211
+ end
212
+
213
+ context "with json codec" do
214
+ subject { LogStash::Inputs::Http.new("port" => port, "codec" => "json") }
215
+ it "should parse the json body" do
216
+ response = client.post("http://127.0.0.1:#{port}/meh.json", :body => { "message" => "Hello" }.to_json).call
217
+ event = logstash_queue.pop
218
+ expect(event.get("message")).to eq("Hello")
219
+ end
220
+ end
221
+
222
+ context "with json_lines codec without final delimiter" do
223
+ subject { LogStash::Inputs::Http.new("port" => port, "codec" => "json_lines") }
224
+ let(:line1) { '{"foo": 1}' }
225
+ let(:line2) { '{"foo": 2}' }
226
+ it "should parse all json_lines in body including last one" do
227
+ client.post("http://localhost:#{port}/meh.json", :body => "#{line1}\n#{line2}").call
228
+ expect(logstash_queue.size).to eq(2)
229
+ event = logstash_queue.pop
230
+ expect(event.get("foo")).to eq(1)
231
+ event = logstash_queue.pop
232
+ expect(event.get("foo")).to eq(2)
233
+ end
234
+ end
235
+
236
+ context "when using a custom codec mapping" do
237
+ subject { LogStash::Inputs::Http.new("port" => port,
238
+ "additional_codecs" => { "application/json" => "plain" }) }
239
+ it "should decode the message accordingly" do
240
+ body = { "message" => "Hello" }.to_json
241
+ client.post("http://127.0.0.1:#{port}/meh.json",
242
+ :headers => { "content-type" => "application/json" },
243
+ :body => body).call
244
+ event = logstash_queue.pop
245
+ expect(event.get("message")).to eq(body)
246
+ end
247
+ end
248
+
249
+ context "when receiving a content-type with a charset" do
250
+ subject { LogStash::Inputs::Http.new("port" => port,
251
+ "additional_codecs" => { "application/json" => "plain" }) }
252
+ it "should decode the message accordingly" do
253
+ body = { "message" => "Hello" }.to_json
254
+ client.post("http://127.0.0.1:#{port}/meh.json",
255
+ :headers => { "content-type" => "application/json; charset=utf-8" },
256
+ :body => body).call
257
+ event = logstash_queue.pop
258
+ expect(event.get("message")).to eq(body)
259
+ end
260
+ end
261
+
262
+ context "when using custom headers" do
263
+ let(:custom_headers) { { 'access-control-allow-origin' => '*' } }
264
+ subject { LogStash::Inputs::Http.new("port" => port, "response_headers" => custom_headers) }
265
+
266
+ describe "the response" do
267
+ it "should include the custom headers" do
268
+ response = client.post("http://127.0.0.1:#{port}/meh", :body => "hello").call
269
+ expect(response.headers.to_hash).to include(custom_headers)
270
+ end
271
+ end
272
+ end
273
+ describe "basic auth" do
274
+ user = "test"; password = "pwd"
275
+ subject { LogStash::Inputs::Http.new("port" => port, "user" => user, "password" => password) }
276
+ let(:auth_token) { Base64.strict_encode64("#{user}:#{password}") }
277
+ context "when client doesn't present auth token" do
278
+ let!(:response) { client.post("http://127.0.0.1:#{port}/meh", :body => "hi").call }
279
+ it "should respond with 401" do
280
+ expect(response.code).to eq(401)
281
+ end
282
+ it 'should include a WWW-Authenticate: Basic header' do
283
+ expect(response['WWW-Authenticate']).to_not be_nil
284
+
285
+ expect(response['WWW-Authenticate']).to start_with('Basic realm=')
286
+ end
287
+ it "should not generate an event" do
288
+ expect(logstash_queue).to be_empty
289
+ end
290
+ end
291
+ context "when client presents incorrect auth token" do
292
+ let!(:response) do
293
+ client.post("http://127.0.0.1:#{port}/meh",
294
+ :headers => {
295
+ "content-type" => "text/plain",
296
+ "authorization" => "Basic meh"
297
+ },
298
+ :body => "hi").call
299
+ end
300
+ it "should respond with 401" do
301
+ expect(response.code).to eq(401)
302
+ end
303
+ it 'should not include a WWW-Authenticate header' do
304
+ expect(response['WWW-Authenticate']).to be_nil
305
+ end
306
+ it "should not generate an event" do
307
+ expect(logstash_queue).to be_empty
308
+ end
309
+ end
310
+ context "when client presents correct auth token" do
311
+ let!(:response) do
312
+ client.post("http://127.0.0.1:#{port}/meh",
313
+ :headers => {
314
+ "content-type" => "text/plain",
315
+ "authorization" => "Basic #{auth_token}"
316
+ }, :body => "hi").call
317
+ end
318
+ it "should respond with 200" do
319
+ expect(response.code).to eq(200)
320
+ end
321
+ it "should generate an event" do
322
+ expect(logstash_queue).to_not be_empty
323
+ end
324
+ end
325
+ end
326
+
327
+ describe "HTTP Protocol Handling" do
328
+ context "when an HTTP1.1 request is made" do
329
+ let(:protocol_version) do
330
+ Java::OrgApacheHttp::HttpVersion::HTTP_1_1
331
+ end
332
+ it "responds with a HTTP1.1 response" do
333
+ response = client.post("http://127.0.0.1:#{port}", :body => "hello")
334
+ response.request.set_protocol_version(protocol_version)
335
+ response.call
336
+ response_protocol_version = response.instance_variable_get(:@response).get_protocol_version
337
+ expect(response_protocol_version).to eq(protocol_version)
338
+ end
339
+ end
340
+ context "when an HTTP1.0 request is made" do
341
+ let(:protocol_version) do
342
+ Java::OrgApacheHttp::HttpVersion::HTTP_1_0
343
+ end
344
+ it "responds with a HTTP1.0 response" do
345
+ response = client.post("http://127.0.0.1:#{port}", :body => "hello")
346
+ response.request.set_protocol_version(protocol_version)
347
+ response.call
348
+ response_protocol_version = response.instance_variable_get(:@response).get_protocol_version
349
+ expect(response_protocol_version).to eq(protocol_version)
350
+ end
351
+ end
352
+ end
353
+ describe "return code" do
354
+ it "responds with a 200" do
355
+ response = client.post("http://127.0.0.1:#{port}", :body => "hello")
356
+ response.call
357
+ expect(response.code).to eq(200)
358
+ end
359
+ context "when response_code is configured" do
360
+ let(:code) { 202 }
361
+ subject { LogStash::Inputs::Http.new("port" => port, "response_code" => code) }
362
+ it "responds with the configured code" do
363
+ response = client.post("http://127.0.0.1:#{port}", :body => "hello")
364
+ response.call
365
+ expect(response.code).to eq(202)
366
+ end
367
+ end
368
+ end
369
+ end
370
+
371
+ context "with :ssl => false" do
372
+ subject { LogStash::Inputs::Http.new("port" => port, "ssl" => false) }
373
+ it "should not raise exception" do
374
+ expect { subject.register }.to_not raise_exception
375
+ end
376
+ end
377
+ context "with :ssl => true" do
378
+ context "without :ssl_certificate" do
379
+ subject { LogStash::Inputs::Http.new("port" => port, "ssl" => true) }
380
+ it "should raise exception" do
381
+ expect { subject.register }.to raise_exception(LogStash::ConfigurationError)
382
+ end
383
+ end
384
+ context "with :ssl_certificate" do
385
+ let(:ssc) { SelfSignedCertificate.new }
386
+ let(:ssl_certificate) { ssc.certificate }
387
+ let(:ssl_key) { ssc.private_key }
388
+
389
+ let(:config) do
390
+ { "port" => port, "ssl" => true, "ssl_certificate" => ssl_certificate.path, "ssl_key" => ssl_key.path }
391
+ end
392
+
393
+ after(:each) { ssc.delete }
394
+
395
+ subject { LogStash::Inputs::Http.new(config) }
396
+
397
+ it "should not raise exception" do
398
+ expect { subject.register }.to_not raise_exception
399
+ end
400
+
401
+ context "with ssl_verify_mode = none" do
402
+ subject { LogStash::Inputs::Http.new(config.merge("ssl_verify_mode" => "none")) }
403
+
404
+ it "should not raise exception" do
405
+ expect { subject.register }.to_not raise_exception
406
+ end
407
+ end
408
+ ["peer", "force_peer"].each do |verify_mode|
409
+ context "with ssl_verify_mode = #{verify_mode}" do
410
+ subject { LogStash::Inputs::Http.new("port" => port, "ssl" => true,
411
+ "ssl_certificate" => ssl_certificate.path,
412
+ "ssl_certificate_authorities" => ssl_certificate.path,
413
+ "ssl_key" => ssl_key.path,
414
+ "ssl_verify_mode" => verify_mode
415
+ ) }
416
+ it "should not raise exception" do
417
+ expect { subject.register }.to_not raise_exception
418
+ end
419
+ end
420
+ end
421
+ context "with verify_mode = none" do
422
+ subject { LogStash::Inputs::Http.new(config.merge("verify_mode" => "none")) }
423
+
424
+ it "should not raise exception" do
425
+ expect { subject.register }.to_not raise_exception
426
+ end
427
+ end
428
+ ["peer", "force_peer"].each do |verify_mode|
429
+ context "with verify_mode = #{verify_mode}" do
430
+ subject { LogStash::Inputs::Http.new("port" => port, "ssl" => true,
431
+ "ssl_certificate" => ssl_certificate.path,
432
+ "ssl_certificate_authorities" => ssl_certificate.path,
433
+ "ssl_key" => ssl_key.path,
434
+ "verify_mode" => verify_mode
435
+ ) }
436
+ it "should not raise exception" do
437
+ expect { subject.register }.to_not raise_exception
438
+ end
439
+ end
440
+ end
441
+
442
+ context "with invalid cipher_suites" do
443
+ let(:config) { super.merge("cipher_suites" => "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38") }
444
+
445
+ it "should raise a configuration error" do
446
+ expect( subject.logger ).to receive(:error) do |msg, opts|
447
+ expect( msg ).to match /.*?configuration invalid/
448
+ expect( opts[:message] ).to match /TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38.*? not available/
449
+ end
450
+ expect { subject.register }.to raise_error(LogStash::ConfigurationError)
451
+ end
452
+ end
453
+
454
+ context "with invalid ssl certificate" do
455
+ before do
456
+ cert = File.readlines path = config["ssl_certificate"]
457
+ i = cert.index { |line| line.index('END CERTIFICATE') }
458
+ cert[i - 1] = ''
459
+ File.write path, cert.join("\n")
460
+ end
461
+
462
+ it "should raise a configuration error" do
463
+ expect( subject.logger ).to receive(:error) do |msg, opts|
464
+ expect( msg ).to match /SSL configuration invalid/
465
+ expect( opts[:message] ).to match /File does not contain valid certificate/i
466
+ end
467
+ expect { subject.register }.to raise_error(LogStash::ConfigurationError)
468
+ end
469
+ end
470
+
471
+ context "with invalid ssl key config" do
472
+ let(:config) { super.merge("ssl_key_passphrase" => "1234567890") }
473
+
474
+ it "should raise a configuration error" do
475
+ expect( subject.logger ).to receive(:error) do |msg, opts|
476
+ expect( msg ).to match /SSL configuration invalid/
477
+ expect( opts[:message] ).to match /File does not contain valid private key/i
478
+ end
479
+ expect { subject.register }.to raise_error(LogStash::ConfigurationError)
480
+ end
481
+ end
482
+
483
+ context "with invalid ssl certificate_authorities" do
484
+ let(:config) do
485
+ super.merge("ssl_verify_mode" => "peer",
486
+ "ssl_certificate_authorities" => [ ssc.certificate.path, ssc.private_key.path ])
487
+ end
488
+
489
+ it "should raise a cert error" do
490
+ expect( subject.logger ).to receive(:error) do |msg, opts|
491
+ expect( msg ).to match(/SSL configuration failed/), lambda { "unexpected: logger.error #{msg.inspect}, #{opts.inspect}" }
492
+ expect( opts[:message] ).to match /signed fields invalid/
493
+ end
494
+ begin
495
+ subject.register
496
+ rescue Java::JavaSecurityCert::CertificateParsingException
497
+ :pass
498
+ end
499
+ end
500
+ end
501
+
502
+ end
503
+ end
504
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sp-logstash-input-http
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.3.7
5
+ platform: java
6
+ authors:
7
+ - Elastic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-01-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: logstash-core-plugin-api
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '1.60'
20
+ - - <=
21
+ - !ruby/object:Gem::Version
22
+ version: '2.99'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '1.60'
30
+ - - <=
31
+ - !ruby/object:Gem::Version
32
+ version: '2.99'
33
+ - !ruby/object:Gem::Dependency
34
+ name: logstash-codec-plain
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: jar-dependencies
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '0.3'
54
+ - - '>='
55
+ - !ruby/object:Gem::Version
56
+ version: 0.3.4
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '0.3'
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: 0.3.4
67
+ - !ruby/object:Gem::Dependency
68
+ name: logstash-devutils
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: logstash-codec-json
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: logstash-codec-json_lines
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: manticore
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ description: This gem is a Logstash plugin required to be installed on top of the
124
+ Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
125
+ gem is not a stand-alone program
126
+ email: info@elastic.co
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - lib/logstash/inputs/http/message_handler.rb
132
+ - lib/logstash/inputs/http/tls.rb
133
+ - lib/logstash/inputs/http.rb
134
+ - lib/logstash/util/http_compressed_requests.rb
135
+ - lib/logstash-input-http_jars.rb
136
+ - lib/tasks/build.rake
137
+ - spec/inputs/http_spec.rb
138
+ - logstash-input-http.gemspec
139
+ - CHANGELOG.md
140
+ - DEVELOPER.md
141
+ - README.md
142
+ - Gemfile
143
+ - LICENSE
144
+ - NOTICE.TXT
145
+ - vendor/jar-dependencies/io/netty/netty-all/4.1.49.Final/netty-all-4.1.49.Final.jar
146
+ - vendor/jar-dependencies/org/apache/logging/log4j/log4j-api/2.11.1/log4j-api-2.11.1.jar
147
+ - vendor/jar-dependencies/org/logstash/plugins/input/http/logstash-input-http/3.3.7/logstash-input-http-3.3.7.jar
148
+ - VERSION
149
+ - docs/index.asciidoc
150
+ homepage: http://www.elastic.co/guide/en/logstash/current/index.html
151
+ licenses:
152
+ - Apache License (2.0)
153
+ metadata:
154
+ logstash_plugin: 'true'
155
+ logstash_group: input
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ - vendor/jar-dependencies
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - '>='
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubyforge_project:
173
+ rubygems_version: 2.0.14.1
174
+ signing_key:
175
+ specification_version: 4
176
+ summary: Receives events over HTTP or HTTPS
177
+ test_files:
178
+ - spec/inputs/http_spec.rb