plr-speedtest 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|