plr-speedtest 0.3.0 → 0.3.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/lib/speedtest/transfer_worker.rb +44 -0
- data/lib/speedtest/version.rb +1 -1
- data/lib/speedtest.rb +32 -7
- metadata +2 -3
- data/lib/speedtest/download_worker.rb +0 -26
- data/lib/speedtest/upload_worker.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55d8ad59a06d925a76c6a9a5097034ff454bf0f9c60ec1d1fd3c4cc2abd70fd5
|
4
|
+
data.tar.gz: 96160eb37e01c31d0c0b2eabc79e521ec0795b9ca07da20acd41aef2c35ff4c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 751405ec1d2fff2afdf5b742569527b95758998b4d0c64e42324cf79541ab6a56e12bd83ad963b15598cd9fcf5f928e3b9c39561875cb6e5a159e97a274ddf7e
|
7
|
+
data.tar.gz: 5da842bfbcde57f40acd8bd2d72b0d780f667cc94900a0ca2c7517d9f1e6549049b09859550a76bc17d6ba0bb4fc34074efb81756ea69aaa74b9219a7930d5d4
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'celluloid/current'
|
2
|
+
|
3
|
+
module Speedtest
|
4
|
+
class TransferWorker
|
5
|
+
include Celluloid
|
6
|
+
|
7
|
+
def initialize(url, logger)
|
8
|
+
@url = url
|
9
|
+
@logger = logger
|
10
|
+
end
|
11
|
+
|
12
|
+
def log(msg)
|
13
|
+
return unless @logger
|
14
|
+
@logger.debug msg
|
15
|
+
end
|
16
|
+
|
17
|
+
def download
|
18
|
+
log " downloading: #{@url}"
|
19
|
+
status = ThreadStatus.new(false, 0)
|
20
|
+
|
21
|
+
page = HTTParty.get(@url, timeout: 10)
|
22
|
+
unless page.code / 100 == 2
|
23
|
+
error "GET #{@url} failed with code #{page.code}"
|
24
|
+
status.error = true
|
25
|
+
end
|
26
|
+
status.size = page.body.length
|
27
|
+
status
|
28
|
+
end
|
29
|
+
|
30
|
+
def upload(content)
|
31
|
+
log " uploading: #{@url}"
|
32
|
+
status = ThreadStatus.new(false, 0)
|
33
|
+
|
34
|
+
page = HTTParty.post(@url, :body => { "content" => content }, timeout: 10)
|
35
|
+
log "upload response body = [#{page.body}]"
|
36
|
+
unless page.code / 100 == 2
|
37
|
+
error "GET #{@url} failed with code #{page.code}"
|
38
|
+
status.error = true
|
39
|
+
end
|
40
|
+
status.size = page.body.split('=')[1].to_i
|
41
|
+
status
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/speedtest/version.rb
CHANGED
data/lib/speedtest.rb
CHANGED
@@ -2,8 +2,7 @@ require 'httparty'
|
|
2
2
|
|
3
3
|
require_relative 'speedtest/result'
|
4
4
|
require_relative 'speedtest/geo_point'
|
5
|
-
require_relative 'speedtest/
|
6
|
-
require_relative 'speedtest/upload_worker'
|
5
|
+
require_relative 'speedtest/transfer_worker'
|
7
6
|
require_relative 'speedtest/ring'
|
8
7
|
|
9
8
|
module Speedtest
|
@@ -68,13 +67,17 @@ module Speedtest
|
|
68
67
|
@logger.error msg if @logger
|
69
68
|
end
|
70
69
|
|
70
|
+
def download_url(server_root)
|
71
|
+
"#{server_root}/speedtest/random#{@download_size}x#{@download_size}.jpg"
|
72
|
+
end
|
73
|
+
|
71
74
|
def download
|
72
75
|
log "\nstarting download tests:"
|
73
76
|
|
74
77
|
start_time = Time.now
|
75
78
|
futures_ring = Ring.new(@num_threads + @num_transfers_padding)
|
76
|
-
download_url =
|
77
|
-
pool =
|
79
|
+
download_url = download_url(@server_root)
|
80
|
+
pool = TransferWorker.pool(size: @num_threads, args: [download_url, @logger])
|
78
81
|
1.upto(@num_threads + @num_transfers_padding).each do |i|
|
79
82
|
futures_ring.append(pool.future.download)
|
80
83
|
end
|
@@ -100,6 +103,10 @@ module Speedtest
|
|
100
103
|
(1.upto(size)).map { alphabet[rand(alphabet.length)] }.join
|
101
104
|
end
|
102
105
|
|
106
|
+
def upload_url(server_root)
|
107
|
+
"#{server_root}/speedtest/upload.php"
|
108
|
+
end
|
109
|
+
|
103
110
|
def upload
|
104
111
|
log "\nstarting upload tests:"
|
105
112
|
|
@@ -108,8 +115,8 @@ module Speedtest
|
|
108
115
|
start_time = Time.now
|
109
116
|
|
110
117
|
futures_ring = Ring.new(@num_threads + @num_transfers_padding)
|
111
|
-
upload_url =
|
112
|
-
pool =
|
118
|
+
upload_url = upload_url(@server_root)
|
119
|
+
pool = TransferWorker.pool(size: @num_threads, args: [upload_url, @logger])
|
113
120
|
1.upto(@num_threads + @num_transfers_padding).each do |i|
|
114
121
|
futures_ring.append(pool.future.upload(data))
|
115
122
|
end
|
@@ -152,12 +159,30 @@ module Speedtest
|
|
152
159
|
:latency => ping(x[:url]),
|
153
160
|
:url => x[:url]
|
154
161
|
}}.sort_by { |x| x[:latency] }
|
155
|
-
|
162
|
+
|
163
|
+
|
164
|
+
selected = latency_sorted_servers.detect { |s| validate_server_transfer(s[:url]) }
|
156
165
|
log "Automatically selected server: #{selected[:url]} - #{selected[:latency]} ms"
|
157
166
|
|
158
167
|
selected
|
159
168
|
end
|
160
169
|
|
170
|
+
def validate_server_transfer(server_root)
|
171
|
+
downloader = TransferWorker.new(download_url(server_root), @logger)
|
172
|
+
status = downloader.download
|
173
|
+
raise RuntimeError if status.error
|
174
|
+
|
175
|
+
uploader = TransferWorker.new(upload_url(server_root), @logger)
|
176
|
+
data = randomString(('A'..'Z').to_a, @upload_size)
|
177
|
+
status = uploader.upload(data)
|
178
|
+
raise RuntimeError if status.error || status.size < @upload_size
|
179
|
+
|
180
|
+
true
|
181
|
+
rescue => e
|
182
|
+
log "Rejecting #{server_root}"
|
183
|
+
false
|
184
|
+
end
|
185
|
+
|
161
186
|
def ping(server)
|
162
187
|
times = []
|
163
188
|
1.upto(@ping_runs) {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plr-speedtest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Myron
|
@@ -112,11 +112,10 @@ files:
|
|
112
112
|
- README.md
|
113
113
|
- Rakefile
|
114
114
|
- lib/speedtest.rb
|
115
|
-
- lib/speedtest/download_worker.rb
|
116
115
|
- lib/speedtest/geo_point.rb
|
117
116
|
- lib/speedtest/result.rb
|
118
117
|
- lib/speedtest/ring.rb
|
119
|
-
- lib/speedtest/
|
118
|
+
- lib/speedtest/transfer_worker.rb
|
120
119
|
- lib/speedtest/version.rb
|
121
120
|
- speedtest.gemspec
|
122
121
|
homepage: https://github.com/petemyron/speedtest
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'celluloid/current'
|
2
|
-
|
3
|
-
module Speedtest
|
4
|
-
|
5
|
-
class DownloadWorker
|
6
|
-
include Celluloid
|
7
|
-
|
8
|
-
def initialize(url, logger)
|
9
|
-
@logger = logger
|
10
|
-
@url = url
|
11
|
-
end
|
12
|
-
|
13
|
-
def download
|
14
|
-
@logger.debug " downloading: #{@url}"
|
15
|
-
status = ThreadStatus.new(false, 0)
|
16
|
-
|
17
|
-
page = HTTParty.get(@url, timeout: 10)
|
18
|
-
unless page.code / 100 == 2
|
19
|
-
error "GET #{url} failed with code #{page.code}"
|
20
|
-
status.error = true
|
21
|
-
end
|
22
|
-
status.size = page.body.length
|
23
|
-
status
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'celluloid/current'
|
2
|
-
|
3
|
-
module Speedtest
|
4
|
-
class UploadWorker
|
5
|
-
include Celluloid
|
6
|
-
|
7
|
-
def initialize(url, logger)
|
8
|
-
@url = url
|
9
|
-
@logger = logger
|
10
|
-
end
|
11
|
-
|
12
|
-
def upload(content)
|
13
|
-
status = ThreadStatus.new(false, 0)
|
14
|
-
|
15
|
-
page = HTTParty.post(@url, :body => { "content" => content }, timeout: 10)
|
16
|
-
@logger.debug "upload response body = [#{page.body}]"
|
17
|
-
unless page.code / 100 == 2
|
18
|
-
error "GET #{url} failed with code #{page.code}"
|
19
|
-
status.error = true
|
20
|
-
end
|
21
|
-
status.size = page.body.split('=')[1].to_i
|
22
|
-
status
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|