tcp-client 0.11.0 → 0.11.1
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/README.md +5 -4
- data/lib/tcp-client/version.rb +1 -1
- metadata +10 -88
- data/.gitignore +0 -6
- data/.yardopts +0 -5
- data/gems.rb +0 -4
- data/rakefile.rb +0 -16
- data/sample/google.rb +0 -21
- data/sample/google_ssl.rb +0 -28
- data/spec/helper.rb +0 -12
- data/spec/tcp-client/address_spec.rb +0 -132
- data/spec/tcp-client/configuration_spec.rb +0 -288
- data/spec/tcp-client/default_configuration_spec.rb +0 -23
- data/spec/tcp-client/version_spec.rb +0 -13
- data/spec/tcp_client_spec.rb +0 -794
- data/tcp-client.gemspec +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c5d814647f45ebfc5a5d43b6b0ae208092c36493bdc839c7e4e722c3ff4b1f0
|
4
|
+
data.tar.gz: 6187b371bb275f0cc88c63091dce51e91f45b79c5257580f881616433c581345
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c48c0b4b0b9f14545895ae489f27d2a75a2c400598a342b553f8e7bbace7f2b4d9d9874f70e85ff40fe3ff4c59e2ea1973e8f324aceacb2705c7982fb1ebb772
|
7
|
+
data.tar.gz: 9c8259dcb4b9b351224627f08a84041d2d8bdf543233d0cefc2b14ed265d67a4b7a2b128bfe75fa4fd8a6b44bab527bb81a815a1edeefafcd85a4733d0064087
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# TCPClient
|
2
2
|
|
3
|
-
|
3
|
+
Use your TCP connections with working timeout.
|
4
4
|
|
5
5
|
- Gem: [rubygems.org](https://rubygems.org/gems/tcp-client)
|
6
6
|
- Source: [github.com](https://github.com/mblumtritt/tcp-client)
|
@@ -8,7 +8,8 @@ A TCP client implementation with working timeout support.
|
|
8
8
|
|
9
9
|
## Description
|
10
10
|
|
11
|
-
This
|
11
|
+
This gem implements a customizable TCP client class that gives you control over time limits. You can set time limits for individual read or write calls or set a deadline for entire call sequences.
|
12
|
+
It has a very small footprint, no dependencies and is easily useable.
|
12
13
|
|
13
14
|
## Sample
|
14
15
|
|
@@ -37,7 +38,7 @@ response =
|
|
37
38
|
puts(response)
|
38
39
|
```
|
39
40
|
|
40
|
-
For more samples see [the
|
41
|
+
For more samples see [the examples dir](https://github.com/mblumtritt/tcp-client/tree/main/examples)
|
41
42
|
|
42
43
|
## Installation
|
43
44
|
|
@@ -61,7 +62,7 @@ To install the gem globally use:
|
|
61
62
|
gem install tcp-client
|
62
63
|
```
|
63
64
|
|
64
|
-
After that you need only a single line of code in your project to have on board:
|
65
|
+
After that you need only a single line of code in your project to have it on board:
|
65
66
|
|
66
67
|
```ruby
|
67
68
|
require 'tcp-client'
|
data/lib/tcp-client/version.rb
CHANGED
metadata
CHANGED
@@ -1,79 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcp-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Blumtritt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-07-
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
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: rake
|
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: rspec
|
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'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: yard
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
11
|
+
date: 2022-07-30 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
69
13
|
description: |
|
70
|
-
This
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
predefined/configurable time limits for each method
|
75
|
-
(`connect`, `read`, `write`). Deadlines for a sequence of read/write
|
76
|
-
actions can also be monitored.
|
14
|
+
This gem implements a customizable TCP client class that gives you control
|
15
|
+
over time limits. You can set time limits for individual read or write calls
|
16
|
+
or set a deadline for entire call sequences.
|
17
|
+
It has a very small footprint, no dependencies and is easily useable.
|
77
18
|
email:
|
78
19
|
executables: []
|
79
20
|
extensions: []
|
@@ -81,11 +22,8 @@ extra_rdoc_files:
|
|
81
22
|
- README.md
|
82
23
|
- LICENSE
|
83
24
|
files:
|
84
|
-
- ".gitignore"
|
85
|
-
- ".yardopts"
|
86
25
|
- LICENSE
|
87
26
|
- README.md
|
88
|
-
- gems.rb
|
89
27
|
- lib/tcp-client.rb
|
90
28
|
- lib/tcp-client/address.rb
|
91
29
|
- lib/tcp-client/configuration.rb
|
@@ -97,23 +35,13 @@ files:
|
|
97
35
|
- lib/tcp-client/tcp_socket.rb
|
98
36
|
- lib/tcp-client/version.rb
|
99
37
|
- lib/tcp_client.rb
|
100
|
-
- rakefile.rb
|
101
|
-
- sample/google.rb
|
102
|
-
- sample/google_ssl.rb
|
103
|
-
- spec/helper.rb
|
104
|
-
- spec/tcp-client/address_spec.rb
|
105
|
-
- spec/tcp-client/configuration_spec.rb
|
106
|
-
- spec/tcp-client/default_configuration_spec.rb
|
107
|
-
- spec/tcp-client/version_spec.rb
|
108
|
-
- spec/tcp_client_spec.rb
|
109
|
-
- tcp-client.gemspec
|
110
38
|
homepage: https://github.com/mblumtritt/tcp-client
|
111
39
|
licenses:
|
112
40
|
- BSD-3-Clause
|
113
41
|
metadata:
|
114
42
|
source_code_uri: https://github.com/mblumtritt/tcp-client
|
115
43
|
bug_tracker_uri: https://github.com/mblumtritt/tcp-client/issues
|
116
|
-
documentation_uri: https://rubydoc.info/
|
44
|
+
documentation_uri: https://rubydoc.info/gems/tcp-client
|
117
45
|
post_install_message:
|
118
46
|
rdoc_options: []
|
119
47
|
require_paths:
|
@@ -132,11 +60,5 @@ requirements: []
|
|
132
60
|
rubygems_version: 3.3.7
|
133
61
|
signing_key:
|
134
62
|
specification_version: 4
|
135
|
-
summary:
|
136
|
-
test_files:
|
137
|
-
- spec/helper.rb
|
138
|
-
- spec/tcp-client/address_spec.rb
|
139
|
-
- spec/tcp-client/configuration_spec.rb
|
140
|
-
- spec/tcp-client/default_configuration_spec.rb
|
141
|
-
- spec/tcp-client/version_spec.rb
|
142
|
-
- spec/tcp_client_spec.rb
|
63
|
+
summary: Use your TCP connections with working timeout.
|
64
|
+
test_files: []
|
data/.gitignore
DELETED
data/.yardopts
DELETED
data/gems.rb
DELETED
data/rakefile.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rake/clean'
|
4
|
-
require 'bundler/gem_tasks'
|
5
|
-
require 'rspec/core/rake_task'
|
6
|
-
require 'yard'
|
7
|
-
|
8
|
-
$stdout.sync = $stderr.sync = true
|
9
|
-
|
10
|
-
CLEAN << '.yardoc'
|
11
|
-
CLOBBER << 'prj' << 'doc'
|
12
|
-
|
13
|
-
task(:default) { exec('rake --tasks') }
|
14
|
-
task(test: :spec)
|
15
|
-
RSpec::Core::RakeTask.new { |task| task.ruby_opts = %w[-w] }
|
16
|
-
YARD::Rake::YardocTask.new { |task| task.stats_options = %w[--list-undoc] }
|
data/sample/google.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../lib/tcp-client'
|
4
|
-
|
5
|
-
# global configuration.
|
6
|
-
# - 0.5 seconds to connect the server
|
7
|
-
# - 0.25 seconds to write a single data junk
|
8
|
-
# - 0.25 seconds to read some bytes
|
9
|
-
TCPClient.configure do |cfg|
|
10
|
-
cfg.connect_timeout = 0.5
|
11
|
-
cfg.write_timeout = 0.25
|
12
|
-
cfg.read_timeout = 0.25
|
13
|
-
end
|
14
|
-
|
15
|
-
# request to Google:
|
16
|
-
# - send a simple HTTP get request
|
17
|
-
# - read 12 byte: "HTTP/1.1 " + 3 byte HTTP status code
|
18
|
-
TCPClient.open('www.google.com:80') do |client|
|
19
|
-
p client.write("GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n")
|
20
|
-
p client.read(12)
|
21
|
-
end
|
data/sample/google_ssl.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../lib/tcp-client'
|
4
|
-
|
5
|
-
# create a configuration:
|
6
|
-
# - don't use internal buffering
|
7
|
-
# - use TLS 1.2 or TLS 1.3
|
8
|
-
cfg =
|
9
|
-
TCPClient::Configuration.create(
|
10
|
-
buffered: false,
|
11
|
-
ssl_params: {
|
12
|
-
min_version: :TLS1_2,
|
13
|
-
max_version: :TLS1_3
|
14
|
-
}
|
15
|
-
)
|
16
|
-
|
17
|
-
# request to Google.com:
|
18
|
-
# - limit all network interactions to 1.5 seconds
|
19
|
-
# - use the Configuration cfg
|
20
|
-
# - send a simple HTTP get request
|
21
|
-
# - read the returned message and headers
|
22
|
-
response =
|
23
|
-
TCPClient.with_deadline(1.5, 'www.google.com:443', cfg) do |client|
|
24
|
-
client.write("GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n") #=> 40
|
25
|
-
client.readline("\r\n\r\n") #=> header, see response
|
26
|
-
end
|
27
|
-
|
28
|
-
puts(response)
|
data/spec/helper.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'rspec/core'
|
4
|
-
require_relative '../lib/tcp-client'
|
5
|
-
|
6
|
-
$stdout.sync = $stderr.sync = true
|
7
|
-
|
8
|
-
RSpec.configure do |config|
|
9
|
-
config.disable_monkey_patching!
|
10
|
-
config.warnings = true
|
11
|
-
config.order = :random
|
12
|
-
end
|
@@ -1,132 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../helper'
|
4
|
-
|
5
|
-
RSpec.describe TCPClient::Address do
|
6
|
-
describe '.new' do
|
7
|
-
context 'when called with an Integer parameter' do
|
8
|
-
subject(:address) { TCPClient::Address.new(42) }
|
9
|
-
|
10
|
-
it 'points to the given port on localhost' do
|
11
|
-
expect(address.hostname).to eq 'localhost'
|
12
|
-
expect(address.port).to be 42
|
13
|
-
expect(address.to_s).to eq 'localhost:42'
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'uses IPv6' do
|
17
|
-
expect(address.addrinfo.ip?).to be true
|
18
|
-
expect(address.addrinfo.ipv6?).to be true
|
19
|
-
expect(address.addrinfo.ipv4?).to be false
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'when called with an Addrinfo' do
|
24
|
-
subject(:address) { TCPClient::Address.new(addrinfo) }
|
25
|
-
let(:addrinfo) { Addrinfo.tcp('::1', 42) }
|
26
|
-
|
27
|
-
it 'uses the given Addrinfo' do
|
28
|
-
expect(address.addrinfo).to eq addrinfo
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'points to the given host and port' do
|
32
|
-
expect(address.hostname).to eq 'localhost'
|
33
|
-
expect(address.port).to be 42
|
34
|
-
expect(address.to_s).to eq 'localhost:42'
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'uses IPv6' do
|
38
|
-
expect(address.addrinfo.ip?).to be true
|
39
|
-
expect(address.addrinfo.ipv6?).to be true
|
40
|
-
expect(address.addrinfo.ipv4?).to be false
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'when called with a String' do
|
45
|
-
context 'when a host name and port is provided' do
|
46
|
-
subject(:address) { TCPClient::Address.new('localhost:42') }
|
47
|
-
|
48
|
-
it 'points to the given host and port' do
|
49
|
-
expect(address.hostname).to eq 'localhost'
|
50
|
-
expect(address.port).to be 42
|
51
|
-
expect(address.to_s).to eq 'localhost:42'
|
52
|
-
expect(address.addrinfo.ip?).to be true
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when only a port is provided' do
|
58
|
-
subject(:address) { TCPClient::Address.new(':42') }
|
59
|
-
|
60
|
-
it 'points to the given port on localhost' do
|
61
|
-
expect(address.hostname).to eq 'localhost'
|
62
|
-
expect(address.port).to be 42
|
63
|
-
expect(address.to_s).to eq 'localhost:42'
|
64
|
-
expect(address.addrinfo.ip?).to be true
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'when an IPv6 address is provided' do
|
69
|
-
subject(:address) { TCPClient::Address.new('[::1]:42') }
|
70
|
-
|
71
|
-
it 'points to the given port on localhost' do
|
72
|
-
expect(address.hostname).to eq '::1'
|
73
|
-
expect(address.port).to be 42
|
74
|
-
expect(address.to_s).to eq '[::1]:42'
|
75
|
-
expect(address.addrinfo.ip?).to be true
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe '#to_h' do
|
82
|
-
subject(:address) { TCPClient::Address.new('localhost:42') }
|
83
|
-
|
84
|
-
it 'returns itself as an Hash' do
|
85
|
-
expect(address.to_h).to eq(host: 'localhost', port: 42)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe 'comparison' do
|
90
|
-
context 'comparing two equal instances' do
|
91
|
-
let(:address_a) { TCPClient::Address.new('localhost:42') }
|
92
|
-
let(:address_b) { TCPClient::Address.new('localhost:42') }
|
93
|
-
|
94
|
-
it 'compares to equal' do
|
95
|
-
expect(address_a).to eq address_b
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'using the == operator' do
|
99
|
-
it 'compares to equal' do
|
100
|
-
expect(address_a == address_b).to be true
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
context 'using the === operator' do
|
105
|
-
it 'compares to equal' do
|
106
|
-
expect(address_a === address_b).to be true
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'comparing two non-equal instances' do
|
112
|
-
let(:address_a) { TCPClient::Address.new('localhost:42') }
|
113
|
-
let(:address_b) { TCPClient::Address.new('localhost:21') }
|
114
|
-
|
115
|
-
it 'compares not to equal' do
|
116
|
-
expect(address_a).not_to eq address_b
|
117
|
-
end
|
118
|
-
|
119
|
-
context 'using the == operator' do
|
120
|
-
it 'compares not to equal' do
|
121
|
-
expect(address_a == address_b).to be false
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
context 'using the === operator' do
|
126
|
-
it 'compares not to equal' do
|
127
|
-
expect(address_a === address_b).to be false
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|