logstash-input-twitter 4.0.2 → 4.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96edca3547292597e67e8c70b43ea594ad506d9498e297481dc4f7abd27b34c1
4
- data.tar.gz: 1509226ee168582ef578e20b72760689346b9364065fa8fad2ee0a51508c2a4e
3
+ metadata.gz: 90a556dabd75cd5e9260c327a7bdffa6bfe5e7fe4f80457901505953d7dc31f2
4
+ data.tar.gz: c83225608136218ea6b950f158fcd1983b3455c533f37a4f01d768b1e6dc03e2
5
5
  SHA512:
6
- metadata.gz: ca5f8f2aedfb261093d586464a9f3ee4eabd6e6b12702dbbfaa9094ca276534a591f69e52fb62b1827691c83f26cda961424cfc7b61922c4dab2cc444a5913ce
7
- data.tar.gz: 236df0131d90eb73ace9973f96dd78d6cbdb6fa8aee7ac4641338536f8d6eb7bc242e82a4d945f4527ea76c7bca20ef04bc0ec3dd022a3aa06e969ee14826a7a
6
+ metadata.gz: cced602c79e40db401fb8a2547fc2a4756a9680b62ce31852f953bcc7a17942076378e04e403505403152f8d751b9a61f90d643ff406aa3cbc90e23438291fbe
7
+ data.tar.gz: 7e2cef7a66efcd33566dab11d6e293b07a6a3458d22c66372b28f63dcec676dcba2fff6e63c5aec7f41836109afda8d4233f1a4c7e76625c4bbbd8fff71c8900
@@ -1,3 +1,6 @@
1
+ ## 4.0.3
2
+ - Fix: broken proxy configuration [#69](https://github.com/logstash-plugins/logstash-input-twitter/pull/69)
3
+
1
4
  ## 4.0.2
2
5
 
3
6
  - Fix: user rest api call + proxy configuration [#68](https://github.com/logstash-plugins/logstash-input-twitter/pull/68)
@@ -128,17 +128,7 @@ class LogStash::Inputs::Twitter < LogStash::Inputs::Base
128
128
  @event_generation_error_count = 0
129
129
 
130
130
  begin
131
- if @use_samples
132
- @stream_client.sample do |tweet|
133
- return if stop?
134
- tweet_processor(queue, tweet)
135
- end
136
- else
137
- @stream_client.filter(twitter_options) do |tweet|
138
- return if stop?
139
- tweet_processor(queue, tweet)
140
- end
141
- end
131
+ do_run(queue)
142
132
  rescue Twitter::Error::TooManyRequests => e
143
133
  sleep_for = e.rate_limit.reset_in || @rate_limit_reset_in # 5 minutes default value from config
144
134
  @logger.warn("Twitter too many requests error, sleeping for #{sleep_for}s")
@@ -151,6 +141,21 @@ class LogStash::Inputs::Twitter < LogStash::Inputs::Base
151
141
  end
152
142
  end # def run
153
143
 
144
+ def do_run(queue)
145
+ if @use_samples
146
+ @stream_client.sample do |tweet|
147
+ return if stop?
148
+ tweet_processor(queue, tweet)
149
+ end
150
+ else
151
+ @stream_client.filter(twitter_options) do |tweet|
152
+ return if stop?
153
+ tweet_processor(queue, tweet)
154
+ end
155
+ end
156
+ end
157
+ private :do_run
158
+
154
159
  def stop
155
160
  @stream_client = nil
156
161
  end
@@ -8,16 +8,23 @@ module LogStash
8
8
  def self.patch
9
9
  verify_version
10
10
  patch_json
11
+ patch_http_request
11
12
  end
12
13
 
13
14
  private
14
15
 
15
16
  def self.verify_version
16
17
  raise("Incompatible Twitter gem version and the LogStash::Json.load") unless ::Twitter::Version.to_s == "6.2.0"
18
+ # NOTE: we're also known to work with twitter gem version 7.0 which uses http 4.x
19
+ raise("Incompatible HTTP gem version: #{HTTP::VERSION}") if HTTP::VERSION >= '5.0' || HTTP::VERSION < '3.0'
20
+ # after a major upgrade, unless CI is running integration specs, please run integration specs manually
17
21
  end
18
22
 
19
23
  def self.patch_json
20
24
  ::Twitter::Streaming::Response.module_eval do
25
+ unless method_defined? :on_body
26
+ raise "::Twitter::Streaming::Response#on_body not defined!" # patch bellow needs a review
27
+ end
21
28
  def on_body(data)
22
29
  @tokenizer.extract(data).each do |line|
23
30
  next if line.empty?
@@ -31,6 +38,27 @@ module LogStash
31
38
  end
32
39
  end
33
40
 
41
+ def self.patch_http_request
42
+ # NOTE: we might decide to drop the patch at some point, for now proxies such as squid
43
+ # are opinionated about having full URIs in the http head-line (having only /path fails
44
+ # with 400 Bad Request in Squid 4.10).
45
+ ::HTTP::Request.class_eval do
46
+ unless method_defined? :headline
47
+ raise "::HTTP::Request#headline not defined!" # patch bellow needs a review
48
+ end
49
+ def headline
50
+ request_uri =
51
+ if using_proxy? #&& !uri.https?
52
+ uri.omit(:fragment)
53
+ else
54
+ uri.request_uri
55
+ end
56
+
57
+ "#{verb.to_s.upcase} #{request_uri} HTTP/#{version}"
58
+ end
59
+ end
60
+ end
61
+
34
62
  end
35
63
  end
36
64
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-twitter'
3
- s.version = '4.0.2'
3
+ s.version = '4.0.3'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Reads events from the Twitter Streaming API"
6
6
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -15,6 +15,8 @@ describe LogStash::Inputs::Twitter do
15
15
 
16
16
  let(:plugin) { LogStash::Inputs::Twitter.new(config) }
17
17
 
18
+ let(:queue) { Queue.new }
19
+
18
20
  describe "registration" do
19
21
 
20
22
  it "not raise error" do
@@ -70,7 +72,6 @@ describe LogStash::Inputs::Twitter do
70
72
  describe "fetching from sample" do
71
73
 
72
74
  let(:input) { LogStash::Inputs::Twitter.new(config) }
73
- let(:queue) { Queue.new }
74
75
 
75
76
  let(:config) do
76
77
  {
@@ -142,8 +143,6 @@ describe LogStash::Inputs::Twitter do
142
143
 
143
144
  let(:input) { LogStash::Inputs::Twitter.new(config) }
144
145
 
145
- let(:queue) { Queue.new }
146
-
147
146
  let(:stream_client) { double("stream-client") }
148
147
 
149
148
  let(:options) do
@@ -212,5 +211,29 @@ describe LogStash::Inputs::Twitter do
212
211
  end
213
212
 
214
213
  end
214
+
215
+ describe "proxy" do
216
+
217
+ before(:each) do
218
+ plugin.register
219
+ end
220
+
221
+ let(:config) do
222
+ super.merge( 'use_proxy' => true, 'proxy_address' => '127.0.0.1', 'proxy_port' => 12345 )
223
+ end
224
+
225
+ let(:proxy_socket) { double('proxy-socket') }
226
+
227
+ it "sends full URI requests" do
228
+ allow_any_instance_of(Twitter::Streaming::Connection).
229
+ to receive(:new_tcp_socket).with('127.0.0.1', 12345).and_return(proxy_socket)
230
+ header_line = 'POST https://stream.twitter.com/1.1/statuses/filter.json?track=foo%2Cbar HTTP/1.1'
231
+ expect(proxy_socket).to receive(:write).with(/^#{Regexp.escape(header_line)}/).
232
+ and_return(3000) # let the stack assume all content sent was consumed
233
+ # NOTE: this is just bogus - we're really just testing the HTTP header line ...
234
+ expect(proxy_socket).to receive(:readpartial).and_return nil
235
+ plugin.send(:do_run, queue)
236
+ end
237
+ end
215
238
  end
216
239
  end
@@ -5,6 +5,16 @@ require_relative "../spec_helper"
5
5
 
6
6
  describe LogStash::Inputs::Twitter do
7
7
 
8
+ let(:events) do
9
+ input(config) do |_, queue|
10
+ event_count.times.collect { queue.pop }
11
+ end
12
+ end
13
+
14
+ let(:event_count) { 3 }
15
+
16
+ let(:event) { events.first }
17
+
8
18
  describe "#receive [integration]", :integration => true do
9
19
 
10
20
  context "keyword search" do
@@ -23,12 +33,6 @@ describe LogStash::Inputs::Twitter do
23
33
  CONFIG
24
34
  end
25
35
 
26
- let(:events) do
27
- input(config) do |pipeline, queue|
28
- 3.times.collect { queue.pop }
29
- end
30
- end
31
-
32
36
  it "receive a list of events from the twitter stream" do
33
37
  expect(events.count).to eq(3)
34
38
  end
@@ -49,28 +53,14 @@ describe LogStash::Inputs::Twitter do
49
53
  CONFIG
50
54
  end
51
55
 
52
- let(:events) do
53
- input(config) do |pipeline, queue|
54
- 3.times.collect { queue.pop }
55
- end
56
- end
57
-
58
- let(:event) { events.first }
59
-
60
56
  it "receive a list of events from the twitter stream" do
61
57
  expect(events.count).to eq(3)
62
- end
63
-
64
- it "contains the hashtags" do
65
- expect(event["hashtags"]).to be_truthy
66
- end
67
58
 
68
- it "contains the symbols" do
69
- expect(event["symbols"]).to be_truthy
70
- end
59
+ event.tap { |event| puts "sample event: #{event.to_hash}" } if $VERBOSE
71
60
 
72
- it "contains the user_mentions" do
73
- expect(event["user_mentions"]).to be_truthy
61
+ expect(event.get("hashtags")).to be_truthy
62
+ expect(event.get("symbols")).to be_truthy
63
+ expect(event.get("user_mentions")).to be_truthy
74
64
  end
75
65
 
76
66
  end
@@ -88,20 +78,15 @@ describe LogStash::Inputs::Twitter do
88
78
  full_tweet => true
89
79
  use_proxy => true
90
80
  proxy_address => '127.0.0.1'
91
- proxy_port => 8123
81
+ proxy_port => 3128
92
82
  }
93
83
  }
94
84
  CONFIG
95
85
  end
96
86
 
97
- let(:events) do
98
- input(config) do |pipeline, queue|
99
- 3.times.collect { queue.pop }
100
- end
101
- end
102
-
103
87
  it "receive a list of events from the twitter stream" do
104
88
  expect(events.count).to eq(3)
89
+ event.tap { |event| puts "sample event (using proxy): #{event.to_hash}" } if $VERBOSE
105
90
  end
106
91
  end
107
92
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-twitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-05 00:00:00.000000000 Z
11
+ date: 2020-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement