jls-lumberjack 0.0.22 → 0.0.23
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/lib/lumberjack/client.rb +11 -43
- data/spec/integration_spec.rb +61 -0
- data/spec/lumberjack/client_spec.rb +98 -0
- data/spec/spec_helper.rb +4 -0
- metadata +53 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5ecf8e491d03fcc59fb32625cd5ad69018071f89
|
|
4
|
+
data.tar.gz: 3fc5d05089e0b192d736fb046854635757bf10e6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4d6cc57fc88054f98a72bf6ccb51bdd2d91b01d6e1ba4232ac7bda25d3cf21acdb07e3940b6c0938ac6f2807f8701404819b30cbe3cfaf9edcd6d7cf919fffe6
|
|
7
|
+
data.tar.gz: 79946f5b1c4237e14e13a44a9d257635722469f57832a8ced321e45606236279c2b380d57c18ed8d9a18c13fa5306fb044c150a26ff46c74da5dc10d11d1b33b
|
data/lib/lumberjack/client.rb
CHANGED
|
@@ -80,7 +80,17 @@ module Lumberjack
|
|
|
80
80
|
private
|
|
81
81
|
def connection_start(opts)
|
|
82
82
|
tcp_socket = TCPSocket.new(opts[:address], opts[:port])
|
|
83
|
-
|
|
83
|
+
|
|
84
|
+
certificate = OpenSSL::X509::Certificate.new(File.read(opts[:ssl_certificate]))
|
|
85
|
+
|
|
86
|
+
certificate_store = OpenSSL::X509::Store.new
|
|
87
|
+
certificate_store.add_cert(certificate)
|
|
88
|
+
|
|
89
|
+
ssl_context = OpenSSL::SSL::SSLContext.new
|
|
90
|
+
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
91
|
+
ssl_context.cert_store = certificate_store
|
|
92
|
+
|
|
93
|
+
@socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context)
|
|
84
94
|
@socket.connect
|
|
85
95
|
@socket.syswrite(["1", "W", @window_size].pack("AAN"))
|
|
86
96
|
end
|
|
@@ -133,48 +143,6 @@ module Lumberjack
|
|
|
133
143
|
def read_last_ack
|
|
134
144
|
@socket.read(4).unpack("N").first
|
|
135
145
|
end
|
|
136
|
-
|
|
137
|
-
private
|
|
138
|
-
def to_frame(hash, sequence)
|
|
139
|
-
frame = ["1", "D", sequence]
|
|
140
|
-
pack = "AAN"
|
|
141
|
-
keys = deep_keys(hash)
|
|
142
|
-
frame << keys.length
|
|
143
|
-
pack << "N"
|
|
144
|
-
keys.each do |k|
|
|
145
|
-
val = deep_get(hash,k)
|
|
146
|
-
key_length = k.bytesize
|
|
147
|
-
val_length = val.bytesize
|
|
148
|
-
frame << key_length
|
|
149
|
-
pack << "N"
|
|
150
|
-
frame << k
|
|
151
|
-
pack << "A#{key_length}"
|
|
152
|
-
frame << val_length
|
|
153
|
-
pack << "N"
|
|
154
|
-
frame << val
|
|
155
|
-
pack << "A#{val_length}"
|
|
156
|
-
end
|
|
157
|
-
frame.pack(pack)
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
private
|
|
161
|
-
def deep_get(hash, key="")
|
|
162
|
-
return hash if key.nil?
|
|
163
|
-
deep_get(
|
|
164
|
-
hash[key.split('.').first],
|
|
165
|
-
key[key.split('.').first.length+1..key.length]
|
|
166
|
-
)
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
private
|
|
170
|
-
def deep_keys(hash, prefix="")
|
|
171
|
-
keys = []
|
|
172
|
-
hash.each do |k,v|
|
|
173
|
-
keys << "#{prefix}#{k}" if v.class == String
|
|
174
|
-
keys << deep_keys(hash[k], "#{k}.") if v.class == Hash
|
|
175
|
-
end
|
|
176
|
-
keys.flatten
|
|
177
|
-
end
|
|
178
146
|
end
|
|
179
147
|
|
|
180
148
|
module Encoder
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "lumberjack/client"
|
|
3
|
+
require "lumberjack/server"
|
|
4
|
+
require "stud/temporary"
|
|
5
|
+
require "flores/pki"
|
|
6
|
+
require "fileutils"
|
|
7
|
+
require "thread"
|
|
8
|
+
require "spec_helper"
|
|
9
|
+
|
|
10
|
+
describe "A client" do
|
|
11
|
+
let(:certificate) { Flores::PKI.generate }
|
|
12
|
+
let(:certificate_file_crt) { "certificate.crt" }
|
|
13
|
+
let(:certificate_file_key) { "certificate.key" }
|
|
14
|
+
let(:port) { Flores::Random.integer(1024..65335) }
|
|
15
|
+
let(:host) { "127.0.0.1" }
|
|
16
|
+
|
|
17
|
+
before do
|
|
18
|
+
expect(File).to receive(:read).at_least(1).with(certificate_file_crt) { certificate.first.to_s }
|
|
19
|
+
expect(File).to receive(:read).at_least(1).with(certificate_file_key) { certificate.last.to_s }
|
|
20
|
+
|
|
21
|
+
server = Lumberjack::Server.new(:port => port,
|
|
22
|
+
:address => host,
|
|
23
|
+
:ssl_certificate => certificate_file_crt,
|
|
24
|
+
:ssl_key => certificate_file_key)
|
|
25
|
+
|
|
26
|
+
Thread.new do
|
|
27
|
+
server.run { |data| }
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "with a valid certificate" do
|
|
32
|
+
it "successfully connect to the server" do
|
|
33
|
+
expect {
|
|
34
|
+
Lumberjack::Client.new(:port => port,
|
|
35
|
+
:host => host,
|
|
36
|
+
:addresses => host,
|
|
37
|
+
:ssl_certificate => certificate_file_crt)
|
|
38
|
+
|
|
39
|
+
}.not_to raise_error
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "with an invalid certificate" do
|
|
44
|
+
let(:invalid_certificate) { Flores::PKI.generate }
|
|
45
|
+
let(:invalid_certificate_file) { "invalid.crt" }
|
|
46
|
+
|
|
47
|
+
before do
|
|
48
|
+
expect(File).to receive(:read).with(invalid_certificate_file) { invalid_certificate.first.to_s }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should refuse to connect" do
|
|
52
|
+
expect {
|
|
53
|
+
Lumberjack::Client.new(:port => port,
|
|
54
|
+
:host => host,
|
|
55
|
+
:addresses => host,
|
|
56
|
+
:ssl_certificate => invalid_certificate_file)
|
|
57
|
+
|
|
58
|
+
}.to raise_error(OpenSSL::SSL::SSLError, /certificate verify failed/)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
require 'lumberjack/client'
|
|
4
|
+
require 'lumberjack/server'
|
|
5
|
+
require "socket"
|
|
6
|
+
require "thread"
|
|
7
|
+
require "openssl"
|
|
8
|
+
require "zlib"
|
|
9
|
+
|
|
10
|
+
describe "Lumberjack::Client" do
|
|
11
|
+
|
|
12
|
+
describe "Lumberjack::Socket" do
|
|
13
|
+
|
|
14
|
+
let(:port) { 5000 }
|
|
15
|
+
|
|
16
|
+
subject(:socket) { Lumberjack::Socket.new(:port => port, :ssl_certificate => "" ) }
|
|
17
|
+
|
|
18
|
+
before do
|
|
19
|
+
allow_any_instance_of(Lumberjack::Socket).to receive(:connection_start).and_return(true)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "sequence" do
|
|
23
|
+
|
|
24
|
+
let(:hash) { {:a => 1, :b => 2}}
|
|
25
|
+
let(:max_unsigned_int) { (2**32)-1 }
|
|
26
|
+
|
|
27
|
+
before(:each) do
|
|
28
|
+
allow(socket).to receive(:ack).and_return(true)
|
|
29
|
+
allow(socket).to receive(:write).and_return(true)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "force sequence to be an unsigned 32 bits int" do
|
|
33
|
+
socket.instance_variable_set(:@sequence, max_unsigned_int)
|
|
34
|
+
socket.write_hash(hash)
|
|
35
|
+
expect(socket.sequence).to eq(1)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "ack" do
|
|
40
|
+
|
|
41
|
+
let(:hash) { {:a => 1, :b => 2}}
|
|
42
|
+
|
|
43
|
+
before(:each) do
|
|
44
|
+
allow(socket).to receive(:write).and_return(true)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "increments the sequence per windows size" do
|
|
48
|
+
allow(socket).to receive(:read_version_and_type).and_return([1, 'A'])
|
|
49
|
+
expect(socket).to receive(:ack).twice.and_call_original
|
|
50
|
+
|
|
51
|
+
[5000, 10000].each do |last_ack|
|
|
52
|
+
windows_size = 5001
|
|
53
|
+
|
|
54
|
+
allow(socket).to receive(:read_last_ack).and_return(last_ack)
|
|
55
|
+
|
|
56
|
+
windows_size.times do
|
|
57
|
+
socket.write_hash(hash)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe Lumberjack::Encoder do
|
|
66
|
+
it 'should creates frames without truncating accentued characters' do
|
|
67
|
+
content = {
|
|
68
|
+
"message" => "Le Canadien de Montréal est la meilleure équipe au monde!",
|
|
69
|
+
"other" => "éléphant"
|
|
70
|
+
}
|
|
71
|
+
parser = Lumberjack::Parser.new
|
|
72
|
+
parser.feed(Lumberjack::Encoder.to_frame(content, 0)) do |code, sequence, data|
|
|
73
|
+
expect(data["message"].force_encoding('UTF-8')).to eq(content["message"])
|
|
74
|
+
expect(data["other"].force_encoding('UTF-8')).to eq(content["other"])
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it 'should creates frames without dropping multibytes characters' do
|
|
79
|
+
content = {
|
|
80
|
+
"message" => "国際ホッケー連盟" # International Hockey Federation
|
|
81
|
+
}
|
|
82
|
+
parser = Lumberjack::Parser.new
|
|
83
|
+
parser.feed(Lumberjack::Encoder.to_frame(content, 0)) do |code, sequence, data|
|
|
84
|
+
expect(data["message"].force_encoding('UTF-8')).to eq(content["message"])
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'should creates compressed frames' do
|
|
89
|
+
content = {
|
|
90
|
+
"message" => "国際ホッケー連盟" # International Hockey Federation
|
|
91
|
+
}
|
|
92
|
+
parser = Lumberjack::Parser.new
|
|
93
|
+
parser.feed(Lumberjack::Encoder.to_compressed_frame(content, 0)) do |code, sequence, data|
|
|
94
|
+
expect(data["message"].force_encoding('UTF-8')).to eq(content["message"])
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
|
@@ -1,15 +1,57 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jls-lumberjack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.23
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jordan Sissel
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-
|
|
12
|
-
dependencies:
|
|
11
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: flores
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 0.0.6
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 0.0.6
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rspec
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: stud
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
13
55
|
description: lumberjack log transport library
|
|
14
56
|
email:
|
|
15
57
|
- jls@semicomplete.com
|
|
@@ -19,6 +61,9 @@ extra_rdoc_files: []
|
|
|
19
61
|
files:
|
|
20
62
|
- lib/lumberjack/client.rb
|
|
21
63
|
- lib/lumberjack/server.rb
|
|
64
|
+
- spec/integration_spec.rb
|
|
65
|
+
- spec/lumberjack/client_spec.rb
|
|
66
|
+
- spec/spec_helper.rb
|
|
22
67
|
homepage: https://github.com/jordansissel/lumberjack
|
|
23
68
|
licenses: []
|
|
24
69
|
metadata: {}
|
|
@@ -38,8 +83,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
38
83
|
version: '0'
|
|
39
84
|
requirements: []
|
|
40
85
|
rubyforge_project:
|
|
41
|
-
rubygems_version: 2.4.
|
|
86
|
+
rubygems_version: 2.4.5
|
|
42
87
|
signing_key:
|
|
43
88
|
specification_version: 4
|
|
44
89
|
summary: lumberjack log transport library
|
|
45
|
-
test_files:
|
|
90
|
+
test_files:
|
|
91
|
+
- spec/integration_spec.rb
|
|
92
|
+
- spec/lumberjack/client_spec.rb
|
|
93
|
+
- spec/spec_helper.rb
|