logstash-input-http 3.4.5-java → 3.6.0-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,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ 4FPPlZqhsT/dPOtTFHF4qPXJbLuz6Jk=
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,37 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
36
+ PgAX97A6xJeB4AFhXw==
37
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ 2ovkeMh05cseiXfaeEaXgvoABDrwog==
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,47 @@
1
+ [ req ]
2
+ distinguished_name= req_distinguished_name
3
+ attributes= req_attributes
4
+
5
+ [ req_distinguished_name ]
6
+ countryName= Country Name (2 letter code)
7
+ countryName_min= 2
8
+ countryName_max= 2
9
+ stateOrProvinceName= State or Province Name (full name)
10
+ localityName= Locality Name (eg, city)
11
+ 0.organizationName= Organization Name (eg, company)
12
+ organizationalUnitName= Organizational Unit Name (eg, section)
13
+ commonName= Common Name (eg, fully qualified host name)
14
+ commonName_max= 64
15
+ emailAddress= Email Address
16
+ emailAddress_max= 64
17
+
18
+ [ req_attributes ]
19
+ challengePassword= A challenge password
20
+ challengePassword_min= 4
21
+ challengePassword_max= 20
22
+
23
+ [ ca ]
24
+ subjectKeyIdentifier = hash
25
+ authorityKeyIdentifier = keyid:always,issuer
26
+ basicConstraints = critical, CA:true
27
+ keyUsage = critical, digitalSignature, cRLSign, keyCertSign
28
+
29
+ [ client_cert ]
30
+ basicConstraints = CA:FALSE
31
+ nsCertType = client, email
32
+ nsComment = "OpenSSL Generated Client Certificate"
33
+ subjectKeyIdentifier = hash
34
+ authorityKeyIdentifier = keyid,issuer
35
+ keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
36
+ extendedKeyUsage = clientAuth, emailProtection
37
+ subjectAltName = "DNS:localhost, IP:127.0.0.1"
38
+
39
+ [ server_cert ]
40
+ basicConstraints = CA:FALSE
41
+ nsCertType = server
42
+ nsComment = "OpenSSL Generated Server Certificate"
43
+ subjectKeyIdentifier = hash
44
+ authorityKeyIdentifier = keyid,issuer:always
45
+ keyUsage = critical, digitalSignature, keyEncipherment
46
+ extendedKeyUsage = serverAuth
47
+ subjectAltName = "DNS:localhost, IP:127.0.0.1"
@@ -20,6 +20,11 @@ describe LogStash::Inputs::Http do
20
20
  let(:client_options) { { } }
21
21
  let(:logstash_queue) { Queue.new }
22
22
  let(:port) { rand(5000) + 1025 }
23
+ let(:url) { "http://127.0.0.1:#{port}" }
24
+
25
+ let(:config) { { "port" => port } }
26
+
27
+ subject { described_class.new(config) }
23
28
 
24
29
  it_behaves_like "an interruptible input plugin" do
25
30
  let(:config) { { "port" => port } }
@@ -32,7 +37,6 @@ describe LogStash::Inputs::Http do
32
37
  end
33
38
 
34
39
  describe "request handling" do
35
- subject { LogStash::Inputs::Http.new("port" => port) }
36
40
 
37
41
  before :each do
38
42
  setup_server_client
@@ -49,7 +53,7 @@ describe LogStash::Inputs::Http do
49
53
  "socket_timeout" => 0.1
50
54
  } }
51
55
 
52
- subject { described_class.new("port" => port, "threads" => threads, "max_pending_requests" => max_pending_requests) }
56
+ let(:config) { { "port" => port, "threads" => threads, "max_pending_requests" => max_pending_requests } }
53
57
 
54
58
  context "when sending more requests than queue slots" do
55
59
  it "should block when the queue is full" do
@@ -74,7 +78,7 @@ describe LogStash::Inputs::Http do
74
78
  end
75
79
 
76
80
  context "with default codec" do
77
- subject { LogStash::Inputs::Http.new("port" => port) }
81
+
78
82
  context "when receiving a text/plain request" do
79
83
  it "should process the request normally" do
80
84
  client.post("http://127.0.0.1:#{port}/meh.json",
@@ -84,6 +88,7 @@ describe LogStash::Inputs::Http do
84
88
  expect(event.get("message")).to eq("hello")
85
89
  end
86
90
  end
91
+
87
92
  context "when receiving a deflate compressed text/plain request" do
88
93
  it "should process the request normally" do
89
94
  client.post("http://127.0.0.1:#{port}/meh.json",
@@ -93,16 +98,18 @@ describe LogStash::Inputs::Http do
93
98
  expect(event.get("message")).to eq("hello")
94
99
  end
95
100
  end
101
+
96
102
  context "when receiving a deflate text/plain request that cannot be decompressed" do
97
103
  let(:response) do
98
- response = client.post("http://127.0.0.1:#{port}/meh.json",
99
- :headers => { "content-type" => "text/plain", "content-encoding" => "deflate" },
100
- :body => "hello").call
104
+ client.post("http://127.0.0.1:#{port}/meh.json",
105
+ :headers => { "content-type" => "text/plain", "content-encoding" => "deflate" },
106
+ :body => "hello").call
101
107
  end
102
108
  it "should respond with 400" do
103
109
  expect(response.code).to eq(400)
104
110
  end
105
111
  end
112
+
106
113
  context "when receiving a gzip compressed text/plain request" do
107
114
  it "should process the request normally" do
108
115
  wio = StringIO.new("w")
@@ -118,6 +125,7 @@ describe LogStash::Inputs::Http do
118
125
  expect(event.get("message")).to eq("hello")
119
126
  end
120
127
  end
128
+
121
129
  context "when receiving a gzip text/plain request that cannot be decompressed" do
122
130
  let(:response) do
123
131
  client.post("http://127.0.0.1:#{port}",
@@ -128,6 +136,7 @@ describe LogStash::Inputs::Http do
128
136
  expect(response.code).to eq(400)
129
137
  end
130
138
  end
139
+
131
140
  context "when receiving an application/json request" do
132
141
  it "should parse the json body" do
133
142
  client.post("http://127.0.0.1:#{port}/meh.json",
@@ -140,16 +149,108 @@ describe LogStash::Inputs::Http do
140
149
  end
141
150
 
142
151
  context "with json codec" do
143
- subject { LogStash::Inputs::Http.new("port" => port, "codec" => "json") }
152
+ let(:config) { super().merge("codec" => "json") }
153
+ let(:url) { "http://127.0.0.1:#{port}/meh.json" }
154
+ let(:response) do
155
+ client.post(url, :body => { "message" => "Hello" }.to_json).call
156
+ end
157
+
144
158
  it "should parse the json body" do
145
- response = client.post("http://127.0.0.1:#{port}/meh.json", :body => { "message" => "Hello" }.to_json).call
159
+ expect(response.code).to eq(200)
146
160
  event = logstash_queue.pop
147
161
  expect(event.get("message")).to eq("Hello")
148
162
  end
163
+
164
+ context 'with ssl' do
165
+
166
+ let(:url) { super().sub('http://', 'https://') }
167
+
168
+ certs_dir = File.expand_path('../fixtures/certs/generated', File.dirname(__FILE__))
169
+
170
+ let(:config) do
171
+ super().merge 'ssl' => true,
172
+ 'ssl_certificate_authorities' => [ File.join(certs_dir, 'root.crt') ],
173
+ 'ssl_certificate' => File.join(certs_dir, 'server_from_root.crt'),
174
+ 'ssl_key' => File.join(certs_dir, 'server_from_root.key.pkcs8'),
175
+ 'ssl_verify_mode' => 'peer'
176
+ end
177
+
178
+ let(:client_options) do
179
+ super().merge ssl: {
180
+ verify: false,
181
+ ca_file: File.join(certs_dir, 'root.crt'),
182
+ client_cert: File.join(certs_dir, 'client_from_root.crt'),
183
+ client_key: File.join(certs_dir, 'client_from_root.key.pkcs8'),
184
+ }
185
+ end
186
+
187
+ it "should parse the json body" do
188
+ # [DEBUG][io.netty.handler.ssl.SslHandler] [id: 0xcaf869ff, L:/127.0.0.1:5610 - R:/127.0.0.1:32890] HANDSHAKEN: protocol:TLSv1.2 cipher suite:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
189
+ # [DEBUG][org.apache.http.conn.ssl.SSLConnectionSocketFactory] Secure session established
190
+ # [DEBUG][org.apache.http.conn.ssl.SSLConnectionSocketFactory] negotiated protocol: TLSv1.2
191
+ # [DEBUG][org.apache.http.conn.ssl.SSLConnectionSocketFactory] negotiated cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
192
+ expect(response.code).to eq(200)
193
+ event = logstash_queue.pop
194
+ expect(event.get("message")).to eq("Hello")
195
+ end
196
+
197
+ TLS13_ENABLED_BY_DEFAULT = begin
198
+ context = javax.net.ssl.SSLContext.getInstance('TLS')
199
+ context.init nil, nil, nil
200
+ context.getDefaultSSLParameters.getProtocols.include? 'TLSv1.3'
201
+ rescue => e
202
+ warn "failed to detect TLSv1.3 support: #{e.inspect}"
203
+ nil
204
+ end
205
+
206
+ context 'with TLSv1.3 client' do
207
+
208
+ let(:client_options) do
209
+ super().tap do |opts|
210
+ opts.fetch(:ssl).merge! protocols: ['TLSv1.3']
211
+ end
212
+ end
213
+
214
+ it "should parse the json body" do
215
+ expect(response.code).to eq(200)
216
+ event = logstash_queue.pop
217
+ expect(event.get("message")).to eq("Hello")
218
+ end
219
+
220
+ context 'enforced TLSv1.3 in plugin' do
221
+
222
+ let(:config) { super().merge 'ssl_supported_protocols' => ['TLSv1.3'],
223
+ 'ssl_cipher_suites' => [ 'TLS_AES_128_GCM_SHA256' ] }
224
+
225
+ it "should parse the json body" do
226
+ expect(response.code).to eq(200)
227
+ event = logstash_queue.pop
228
+ expect(event.get("message")).to eq("Hello")
229
+ end
230
+
231
+ end
232
+
233
+ context 'enforced TLSv1.3 (deprecated options)' do
234
+
235
+ let(:config) { super().merge 'tls_min_version' => 1.3,
236
+ 'cipher_suites' => [ 'TLS_AES_128_GCM_SHA256' ] }
237
+
238
+ it "should parse the json body" do
239
+ expect(response.code).to eq(200)
240
+ event = logstash_queue.pop
241
+ expect(event.get("message")).to eq("Hello")
242
+ end
243
+
244
+ end
245
+
246
+ end if TLS13_ENABLED_BY_DEFAULT
247
+
248
+ end
249
+
149
250
  end
150
251
 
151
252
  context "with json_lines codec without final delimiter" do
152
- subject { LogStash::Inputs::Http.new("port" => port, "codec" => "json_lines") }
253
+ let(:config) { super().merge("codec" => "json_lines") }
153
254
  let(:line1) { '{"foo": 1}' }
154
255
  let(:line2) { '{"foo": 2}' }
155
256
  it "should parse all json_lines in body including last one" do
@@ -169,7 +270,7 @@ describe LogStash::Inputs::Http do
169
270
  body = { "message" => "Hello" }.to_json
170
271
  client.post("http://127.0.0.1:#{port}/meh.json",
171
272
  :headers => { "content-type" => "application/json" },
172
- :body => body).call
273
+ :body => body).call
173
274
  event = logstash_queue.pop
174
275
  expect(event.get("message")).to eq(body)
175
276
  end
@@ -388,15 +489,18 @@ describe LogStash::Inputs::Http do
388
489
  end
389
490
 
390
491
  # wait until server is ready
391
- def setup_server_client
492
+ def setup_server_client(url = self.url)
392
493
  subject.register
393
- t = Thread.new { subject.run(logstash_queue) }
494
+ t = Thread.start { subject.run(logstash_queue) }
394
495
  ok = false
395
496
  until ok
396
497
  begin
397
- client.post("http://127.0.0.1:#{port}", :body => '{}').call
398
- rescue => e
399
- # retry
498
+ client.post(url, :body => '{}').call
499
+ rescue Manticore::SocketException => e
500
+ puts "retry client.post due #{e}" if $VERBOSE
501
+ rescue Manticore::ManticoreException => e
502
+ warn e.inspect
503
+ raise e.cause ? e.cause : e
400
504
  else
401
505
  ok = true
402
506
  end
@@ -447,6 +551,12 @@ describe LogStash::Inputs::Http do
447
551
  expect { subject.register }.to raise_exception(LogStash::ConfigurationError)
448
552
  end
449
553
  end
554
+ context "with invalid cipher suites" do
555
+ it "should raise a configuration error" do
556
+ invalid_config = config.merge("ssl_cipher_suites" => "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38")
557
+ expect { LogStash::Inputs::Http.new(invalid_config) }.to raise_error(LogStash::ConfigurationError)
558
+ end
559
+ end
450
560
  context "with :ssl_certificate" do
451
561
  let(:ssc) { SelfSignedCertificate.new }
452
562
  let(:ssl_certificate) { ssc.certificate }
@@ -505,18 +615,6 @@ describe LogStash::Inputs::Http do
505
615
  end
506
616
  end
507
617
 
508
- context "with invalid cipher_suites" do
509
- let(:config) { super().merge("cipher_suites" => "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38") }
510
-
511
- it "should raise a configuration error" do
512
- expect( subject.logger ).to receive(:error) do |msg, opts|
513
- expect( msg ).to match /.*?configuration invalid/
514
- expect( opts[:message] ).to match /TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA38.*? not available/
515
- end
516
- expect { subject.register }.to raise_error(LogStash::ConfigurationError)
517
- end
518
- end
519
-
520
618
  context "with invalid ssl certificate" do
521
619
  before do
522
620
  cert = File.readlines path = config["ssl_certificate"]
@@ -548,8 +646,7 @@ describe LogStash::Inputs::Http do
548
646
 
549
647
  context "with invalid ssl certificate_authorities" do
550
648
  let(:config) do
551
- super().merge("ssl_verify_mode" => "peer",
552
- "ssl_certificate_authorities" => [ ssc.certificate.path, ssc.private_key.path ])
649
+ super().merge("ssl_verify_mode" => "peer", "ssl_certificate_authorities" => [ ssc.certificate.path, ssc.private_key.path ])
553
650
  end
554
651
 
555
652
  it "should raise a cert error" do
@@ -565,6 +662,123 @@ describe LogStash::Inputs::Http do
565
662
  end
566
663
  end
567
664
 
665
+ context "with both verify_mode options set" do
666
+ let(:config) do
667
+ super().merge('ssl_verify_mode' => 'peer', 'verify_mode' => 'none')
668
+ end
669
+
670
+ it "should raise a configuration error" do
671
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /Use only .?ssl_verify_mode.?/i
672
+ end
673
+ end
674
+
675
+ context "with ssl_cipher_suites and cipher_suites set" do
676
+ let(:config) do
677
+ super().merge('ssl_cipher_suites' => ['TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384'],
678
+ 'cipher_suites' => ['TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384'])
679
+ end
680
+
681
+ it "should raise a configuration error" do
682
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /Use only .?ssl_cipher_suites.?/i
683
+ end
684
+ end
685
+
686
+ context "with ssl_supported_protocols and tls_min_version set" do
687
+ let(:config) do
688
+ super().merge('ssl_supported_protocols' => ['TLSv1.2'], 'tls_min_version' => 1.0)
689
+ end
690
+
691
+ it "should raise a configuration error" do
692
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /Use only .?ssl_supported_protocols.?/i
693
+ end
694
+ end
695
+
696
+ context "with ssl_supported_protocols and tls_max_version set" do
697
+ let(:config) do
698
+ super().merge('ssl_supported_protocols' => ['TLSv1.2'], 'tls_max_version' => 1.2)
699
+ end
700
+
701
+ it "should raise a configuration error" do
702
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /Use only .?ssl_supported_protocols.?/i
703
+ end
704
+ end
705
+
706
+ end
707
+ end
708
+ end
709
+
710
+ # If we have a setting called `pipeline.ecs_compatibility`, we need to
711
+ # ensure that our additional_codecs are instantiated with the proper
712
+ # execution context in order to ensure that the pipeline setting is
713
+ # respected.
714
+ if LogStash::SETTINGS.registered?('pipeline.ecs_compatibility')
715
+
716
+ def setting_value_supported?(name, value)
717
+ setting = ::LogStash::SETTINGS.clone.get_setting(name)
718
+ setting.set(value)
719
+ setting.validate_value
720
+ true
721
+ rescue
722
+ false
723
+ end
724
+
725
+ describe LogStash::Inputs::Http do
726
+ context 'additional_codecs' do
727
+ let(:port) { rand(1025...5000) }
728
+
729
+ %w(disabled v1 v8).each do |spec|
730
+ if setting_value_supported?('pipeline.ecs_compatibility', spec)
731
+ context "with `pipeline.ecs_compatibility: #{spec}`" do
732
+ # Override DevUtils's `new_pipeline` default to inject pipeline settings that
733
+ # are different than our global settings, so that we can validate the condition
734
+ # where pipeline settings override global settings.
735
+ def new_pipeline(config_parts, pipeline_id = :main, settings = pipeline_settings)
736
+ super(config_parts, pipeline_id, settings)
737
+ end
738
+
739
+ let(:pipeline_settings) do
740
+ ::LogStash::SETTINGS.clone.tap do |s|
741
+ s.set('pipeline.ecs_compatibility', spec)
742
+ end
743
+ end
744
+
745
+ it 'propagates the ecs_compatibility pipeline setting to the additional_codecs' do
746
+ # Ensure plugins pick up pipeline-level setting over the global default.
747
+ aggregate_failures('precondition') do
748
+ expect(::LogStash::SETTINGS).to_not be_set('pipeline.ecs_compatibility')
749
+ expect(pipeline_settings).to be_set('pipeline.ecs_compatibility')
750
+ end
751
+
752
+ input("input { http { port => #{port} additional_codecs => { 'application/json' => 'json' 'text/plain' => 'plain' } } }") do |pipeline, queue|
753
+ http_input = pipeline.inputs.first
754
+ aggregate_failures('initialization precondition') do
755
+ expect(http_input).to be_a_kind_of(described_class)
756
+ expect(http_input.execution_context&.pipeline&.settings&.to_hash).to eq(pipeline_settings.to_hash)
757
+ end
758
+
759
+ http_input.codecs.each do |key, value|
760
+ aggregate_failures("Codec for `#{key}`") do
761
+ expect(value.ecs_compatibility).to eq(spec.to_sym)
762
+ end
763
+ end
764
+ end
765
+ end
766
+ end
767
+ end
768
+ end
769
+
770
+ it 'propagates the execution context from the input to the codecs' do
771
+ input("input { http { port => #{port} } }") do |pipeline, queue|
772
+ http_input = pipeline.inputs.first
773
+ expect(http_input).to be_a_kind_of(described_class) # precondition
774
+
775
+ http_input.codecs.each do |key, value|
776
+ aggregate_failures("Codec for `#{key}`") do
777
+ expect(value.execution_context).to be http_input.execution_context
778
+ end
779
+ end
780
+ end
781
+ end
568
782
  end
569
783
  end
570
784
  end