kronk 1.7.8 → 1.8.0
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.
- data/History.rdoc +32 -0
- data/Manifest.txt +5 -5
- data/README.rdoc +5 -3
- data/Rakefile +3 -4
- data/TODO.rdoc +22 -6
- data/lib/kronk.rb +13 -7
- data/lib/kronk/buffered_io.rb +26 -0
- data/lib/kronk/cmd.rb +58 -44
- data/lib/kronk/constants.rb +5 -6
- data/lib/kronk/diff.rb +12 -13
- data/lib/kronk/diff/output.rb +1 -1
- data/lib/kronk/http.rb +105 -0
- data/lib/kronk/player.rb +74 -82
- data/lib/kronk/player/benchmark.rb +34 -35
- data/lib/kronk/player/stream.rb +6 -6
- data/lib/kronk/player/suite.rb +17 -16
- data/lib/kronk/player/tsv.rb +51 -0
- data/lib/kronk/queue_runner.rb +126 -102
- data/lib/kronk/request.rb +144 -82
- data/lib/kronk/response.rb +520 -202
- data/lib/kronk/test/helper_methods.rb +1 -1
- data/test/mocks/200_gzip.txt +0 -0
- data/test/mocks/200_inflate.txt +0 -0
- data/test/test_assertions.rb +1 -1
- data/test/test_cmd.rb +18 -11
- data/test/test_diff.rb +39 -0
- data/test/test_helper.rb +18 -14
- data/test/test_helper_methods.rb +5 -4
- data/test/test_kronk.rb +8 -11
- data/test/test_player.rb +67 -123
- data/test/test_request.rb +8 -14
- data/test/test_response.rb +228 -60
- metadata +20 -31
- data/lib/kronk/async.rb +0 -118
- data/lib/kronk/async/em_ext.rb +0 -34
- data/lib/kronk/async/request.rb +0 -73
- data/lib/kronk/async/response.rb +0 -70
- data/lib/kronk/player/output.rb +0 -49
data/History.rdoc
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
=== 1.8.0 / 2011-12
|
2
|
+
|
3
|
+
* Major Enhancements:
|
4
|
+
|
5
|
+
* Support for TSV player output (read gnuplot).
|
6
|
+
|
7
|
+
* Removed evented model support; too costly to maintain.
|
8
|
+
|
9
|
+
* Enhancements:
|
10
|
+
|
11
|
+
* Parsed Response headers now also return parsed cookies.
|
12
|
+
|
13
|
+
* Many Player performance improvements.
|
14
|
+
|
15
|
+
* Player outputs are now Player subclasses.
|
16
|
+
|
17
|
+
* Support for setting player qps.
|
18
|
+
|
19
|
+
* Support for response streaming.
|
20
|
+
|
21
|
+
* Support for gzip and inflate decoding.
|
22
|
+
|
23
|
+
* Diff accuracy improvements.
|
24
|
+
|
25
|
+
* Support forwarding HTTP auth information to redirected hosts.
|
26
|
+
|
27
|
+
* Bugfixes:
|
28
|
+
|
29
|
+
* Pass request init options to redirects.
|
30
|
+
|
31
|
+
* QueueRunner multithreading fix for Rubys with no GIL.
|
32
|
+
|
1
33
|
=== 1.7.8 / 2011-11-10
|
2
34
|
|
3
35
|
* Enhancements:
|
data/Manifest.txt
CHANGED
@@ -5,10 +5,6 @@ README.rdoc
|
|
5
5
|
Rakefile
|
6
6
|
bin/kronk
|
7
7
|
lib/kronk.rb
|
8
|
-
lib/kronk/async.rb
|
9
|
-
lib/kronk/async/em_ext.rb
|
10
|
-
lib/kronk/async/request.rb
|
11
|
-
lib/kronk/async/response.rb
|
12
8
|
lib/kronk/cmd.rb
|
13
9
|
lib/kronk/constants.rb
|
14
10
|
lib/kronk/core_ext.rb
|
@@ -17,6 +13,8 @@ lib/kronk/diff.rb
|
|
17
13
|
lib/kronk/diff/ascii_format.rb
|
18
14
|
lib/kronk/diff/color_format.rb
|
19
15
|
lib/kronk/diff/output.rb
|
16
|
+
lib/kronk/http.rb
|
17
|
+
lib/kronk/buffered_io.rb
|
20
18
|
lib/kronk/path.rb
|
21
19
|
lib/kronk/path/matcher.rb
|
22
20
|
lib/kronk/path/match.rb
|
@@ -24,10 +22,10 @@ lib/kronk/path/transaction.rb
|
|
24
22
|
lib/kronk/player.rb
|
25
23
|
lib/kronk/player/benchmark.rb
|
26
24
|
lib/kronk/player/input_reader.rb
|
27
|
-
lib/kronk/player/output.rb
|
28
25
|
lib/kronk/player/request_parser.rb
|
29
26
|
lib/kronk/player/suite.rb
|
30
27
|
lib/kronk/player/stream.rb
|
28
|
+
lib/kronk/player/tsv.rb
|
31
29
|
lib/kronk/plist_parser.rb
|
32
30
|
lib/kronk/queue_runner.rb
|
33
31
|
lib/kronk/request.rb
|
@@ -38,6 +36,8 @@ lib/kronk/test/helper_methods.rb
|
|
38
36
|
lib/kronk/xml_parser.rb
|
39
37
|
lib/kronk/yaml_parser.rb
|
40
38
|
script/kronk_completion
|
39
|
+
test/mocks/200_gzip.txt
|
40
|
+
test/mocks/200_inflate.txt
|
41
41
|
test/mocks/200_response.json
|
42
42
|
test/mocks/200_response.plist
|
43
43
|
test/mocks/200_response.txt
|
data/README.rdoc
CHANGED
@@ -116,13 +116,15 @@ Disabling cookies altogether may be done as so:
|
|
116
116
|
Setting URI-specific config options - useful if you always need to send
|
117
117
|
headers or use one-off configs. Each URI option key is dropped in a regexp
|
118
118
|
to match against the given URIs so this also works for local files.
|
119
|
-
See Kronk::Request.
|
119
|
+
See Kronk::Request.new, Kronk::Response.new and Kronk::Response#data
|
120
120
|
for all options supported:
|
121
121
|
|
122
122
|
uri_options:
|
123
123
|
example.com:
|
124
|
-
parser:
|
125
|
-
|
124
|
+
parser: XMLParser
|
125
|
+
allow_encoding: gzip;q=1.0
|
126
|
+
force_gzip: true
|
127
|
+
http_method: POST
|
126
128
|
|
127
129
|
follow_redirects: true
|
128
130
|
|
data/Rakefile
CHANGED
@@ -25,10 +25,9 @@ Hoe.spec 'kronk' do
|
|
25
25
|
self.extra_deps << ['json', '~>1.5']
|
26
26
|
self.extra_deps << ['cookiejar', '~>0.3.0']
|
27
27
|
|
28
|
-
self.extra_dev_deps << ['plist',
|
29
|
-
self.extra_dev_deps << ['nokogiri',
|
30
|
-
self.extra_dev_deps << ['mocha',
|
31
|
-
self.extra_dev_deps << ['em-http-request', '~>1.0.0']
|
28
|
+
self.extra_dev_deps << ['plist', '~>3.1.0']
|
29
|
+
self.extra_dev_deps << ['nokogiri', '~>1.4']
|
30
|
+
self.extra_dev_deps << ['mocha', '~>0.9.12']
|
32
31
|
end
|
33
32
|
|
34
33
|
|
data/TODO.rdoc
CHANGED
@@ -1,19 +1,35 @@
|
|
1
1
|
= TODO
|
2
2
|
|
3
|
-
|
3
|
+
== Maybe Later
|
4
4
|
|
5
|
-
*
|
6
|
-
|
7
|
-
* Support for X-Url-\d and x-alt-location-\d redirects.
|
5
|
+
* Animate Suite player cursor when waiting for input.
|
8
6
|
|
9
|
-
*
|
7
|
+
* Consider getting off of net/http.
|
10
8
|
|
11
|
-
*
|
9
|
+
* Consider allowing Output-specific cmd options.
|
12
10
|
|
13
11
|
* Investigate Kronk console.
|
14
12
|
|
13
|
+
== Not Viable
|
14
|
+
|
15
|
+
* Use persistent connection pools.
|
16
|
+
|
15
17
|
== Done
|
16
18
|
|
19
|
+
* GNU-Plot support.
|
20
|
+
|
21
|
+
* Parsed cookie diffing.
|
22
|
+
|
23
|
+
* Refactor player Output to inherit Player.
|
24
|
+
|
25
|
+
* Revisit how QueueRunner handles SIGINT.
|
26
|
+
|
27
|
+
* QPS option for player.
|
28
|
+
|
29
|
+
* Support for gzip.
|
30
|
+
|
31
|
+
* Support for response streaming.
|
32
|
+
|
17
33
|
* Investigate the use of EM for QueueRunner.
|
18
34
|
|
19
35
|
* Refactor Kronk::Player into a Player and a QueueRunner.
|
data/lib/kronk.rb
CHANGED
@@ -8,21 +8,22 @@ require 'stringio'
|
|
8
8
|
require 'base64'
|
9
9
|
|
10
10
|
require 'net/https'
|
11
|
+
require 'zlib'
|
11
12
|
require 'optparse'
|
12
13
|
require 'yaml'
|
13
14
|
|
14
15
|
class Kronk
|
15
16
|
|
16
17
|
# This gem's version.
|
17
|
-
VERSION = '1.
|
18
|
+
VERSION = '1.8.0'
|
18
19
|
|
19
20
|
require 'kronk/constants'
|
20
21
|
require 'kronk/queue_runner'
|
21
22
|
require 'kronk/player'
|
22
|
-
require 'kronk/player/output'
|
23
23
|
require 'kronk/player/suite'
|
24
24
|
require 'kronk/player/stream'
|
25
25
|
require 'kronk/player/benchmark'
|
26
|
+
require 'kronk/player/tsv'
|
26
27
|
require 'kronk/player/request_parser'
|
27
28
|
require 'kronk/player/input_reader'
|
28
29
|
require 'kronk/cmd'
|
@@ -35,8 +36,10 @@ class Kronk
|
|
35
36
|
require 'kronk/diff/color_format'
|
36
37
|
require 'kronk/diff/output'
|
37
38
|
require 'kronk/diff'
|
38
|
-
require 'kronk/
|
39
|
+
require 'kronk/http'
|
40
|
+
require 'kronk/buffered_io'
|
39
41
|
require 'kronk/request'
|
42
|
+
require 'kronk/response'
|
40
43
|
require 'kronk/plist_parser'
|
41
44
|
require 'kronk/xml_parser'
|
42
45
|
require 'kronk/yaml_parser'
|
@@ -306,6 +309,9 @@ class Kronk
|
|
306
309
|
str2 = res2.stringify
|
307
310
|
end
|
308
311
|
|
312
|
+
t1.abort_on_exception = true
|
313
|
+
t2.abort_on_exception = true
|
314
|
+
|
309
315
|
t1.join
|
310
316
|
t2.join
|
311
317
|
|
@@ -324,18 +330,18 @@ class Kronk
|
|
324
330
|
def request uri
|
325
331
|
options = Kronk.config[:no_uri_options] ? @options : options_for_uri(uri)
|
326
332
|
|
327
|
-
if IO === uri || StringIO === uri
|
333
|
+
if IO === uri || StringIO === uri || BufferedIO === uri
|
328
334
|
Cmd.verbose "Reading IO #{uri}"
|
329
|
-
resp = Response.new uri
|
335
|
+
resp = Response.new uri, options
|
330
336
|
|
331
337
|
elsif File.file? uri.to_s
|
332
338
|
Cmd.verbose "Reading file: #{uri}\n"
|
333
|
-
resp = Response.read_file uri
|
339
|
+
resp = Response.read_file uri, options
|
334
340
|
|
335
341
|
else
|
336
342
|
req = Request.new uri, options
|
337
343
|
Cmd.verbose "Retrieving URL: #{req.uri}\n"
|
338
|
-
resp = req.retrieve
|
344
|
+
resp = req.retrieve options
|
339
345
|
Kronk.history << uri
|
340
346
|
end
|
341
347
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Kronk
|
2
|
+
|
3
|
+
##
|
4
|
+
# Wrapper for Net::BufferedIO
|
5
|
+
|
6
|
+
class BufferedIO < Net::BufferedIO
|
7
|
+
|
8
|
+
attr_accessor :raw_output
|
9
|
+
attr_accessor :response
|
10
|
+
|
11
|
+
def initialize io
|
12
|
+
super
|
13
|
+
@raw_output = nil
|
14
|
+
@response = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def rbuf_consume len
|
21
|
+
str = super
|
22
|
+
@raw_output << str if @raw_output
|
23
|
+
str
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/kronk/cmd.rb
CHANGED
@@ -6,7 +6,7 @@ class Kronk
|
|
6
6
|
class Cmd
|
7
7
|
|
8
8
|
RESCUABLE = [
|
9
|
-
Kronk::
|
9
|
+
Kronk::Error, Timeout::Error,
|
10
10
|
SocketError, SystemCallError, URI::InvalidURIError
|
11
11
|
]
|
12
12
|
|
@@ -152,7 +152,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
152
152
|
end
|
153
153
|
|
154
154
|
|
155
|
-
opt.on('--config
|
155
|
+
opt.on('--config FILE', String,
|
156
156
|
'Load the given Kronk config file') do |value|
|
157
157
|
Kronk.load_config value
|
158
158
|
end
|
@@ -170,7 +170,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
170
170
|
|
171
171
|
|
172
172
|
opt.on('--format STR', String,
|
173
|
-
'Use a custom diff formatter') do |value|
|
173
|
+
'Use a custom diff formatter class') do |value|
|
174
174
|
Kronk.config[:diff_format] = value
|
175
175
|
end
|
176
176
|
|
@@ -180,6 +180,11 @@ Parse and run diffs against data from live and cached http responses.
|
|
180
180
|
end
|
181
181
|
|
182
182
|
|
183
|
+
opt.on('--gzip', 'Force decode body with gZip') do
|
184
|
+
options[:force_gzip] = true
|
185
|
+
end
|
186
|
+
|
187
|
+
|
183
188
|
opt.on('-i', '--include [HEADER1,HEADER2]', Array,
|
184
189
|
'Include all or given headers in response') do |value|
|
185
190
|
options[:show_headers] ||= []
|
@@ -215,6 +220,11 @@ Parse and run diffs against data from live and cached http responses.
|
|
215
220
|
end
|
216
221
|
|
217
222
|
|
223
|
+
opt.on('--inflate', 'Force decode body with Zlib Inflate') do
|
224
|
+
options[:force_inflate] = true
|
225
|
+
end
|
226
|
+
|
227
|
+
|
218
228
|
opt.on('--irb', 'Start an IRB console with the response') do
|
219
229
|
options[:irb] = true
|
220
230
|
end
|
@@ -246,24 +256,24 @@ Parse and run diffs against data from live and cached http responses.
|
|
246
256
|
end
|
247
257
|
|
248
258
|
|
249
|
-
opt.on('-R', '--raw', '
|
259
|
+
opt.on('-R', '--raw', 'Don\'t parse the response') do
|
250
260
|
options[:raw] = true
|
251
261
|
end
|
252
262
|
|
253
263
|
|
254
264
|
opt.on('-r', '--require LIB1,LIB2', Array,
|
255
|
-
'
|
265
|
+
'Load a file or gem before execution') do |value|
|
256
266
|
options[:requires] ||= []
|
257
267
|
options[:requires].concat value
|
258
268
|
end
|
259
269
|
|
260
270
|
|
261
|
-
opt.on('--ruby', '
|
271
|
+
opt.on('--ruby', 'Output Ruby instead of JSON') do
|
262
272
|
Kronk.config[:render_lang] = 'ruby'
|
263
273
|
end
|
264
274
|
|
265
275
|
|
266
|
-
opt.on('--struct', '
|
276
|
+
opt.on('--struct', 'Return data types instead of values') do
|
267
277
|
options[:struct] = true
|
268
278
|
end
|
269
279
|
|
@@ -279,7 +289,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
279
289
|
STR
|
280
290
|
|
281
291
|
opt.on('-c', '--concurrency NUM', Integer,
|
282
|
-
'Number of
|
292
|
+
'Number of simultaneous connections; default: 1') do |num|
|
283
293
|
options[:player][:concurrency] = num
|
284
294
|
end
|
285
295
|
|
@@ -292,29 +302,41 @@ Parse and run diffs against data from live and cached http responses.
|
|
292
302
|
|
293
303
|
opt.on('-o', '--replay-out [FORMAT]',
|
294
304
|
'Output format used by --replay; default: stream') do |output|
|
295
|
-
options[:player][:
|
305
|
+
options[:player][:type] = output || :stream
|
296
306
|
end
|
297
307
|
|
298
308
|
|
299
309
|
opt.on('-p', '--replay [FILE]',
|
300
|
-
|
310
|
+
'Replay the given file or STDIN against URIs') do |file|
|
301
311
|
options[:player][:io] = File.open(file, "r") if file
|
302
312
|
options[:player][:io] ||= $stdin if !$stdin.tty?
|
303
|
-
options[:player][:output] ||= :suite
|
304
313
|
end
|
305
314
|
|
306
315
|
|
307
|
-
opt.on('--
|
316
|
+
opt.on('--qps NUM', Integer,
|
317
|
+
'Number of queries per second to make; overrides -c') do |num|
|
318
|
+
options[:player][:qps] = num
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
opt.on('--benchmark [FILE]',
|
323
|
+
'Print benchmark data; same as -p [FILE] -o benchmark') do |file|
|
308
324
|
options[:player][:io] = File.open(file, "r") if file
|
309
|
-
options[:player][:
|
310
|
-
options[:player][:output] = :benchmark
|
325
|
+
options[:player][:type] = :benchmark
|
311
326
|
end
|
312
327
|
|
313
328
|
|
314
|
-
opt.on('--stream [FILE]',
|
329
|
+
opt.on('--stream [FILE]',
|
330
|
+
'Print response stream; same as -p [FILE] -o stream') do |file|
|
315
331
|
options[:player][:io] = File.open(file, "r") if file
|
316
|
-
options[:player][:
|
317
|
-
|
332
|
+
options[:player][:type] = :stream
|
333
|
+
end
|
334
|
+
|
335
|
+
|
336
|
+
opt.on('--tsv [FILE]',
|
337
|
+
'Print TSV metrics; same as -p [FILE] -o tsv') do |file|
|
338
|
+
options[:player][:io] = File.open(file, "r") if file
|
339
|
+
options[:player][:type] = :tsv
|
318
340
|
end
|
319
341
|
|
320
342
|
|
@@ -328,6 +350,12 @@ Parse and run diffs against data from live and cached http responses.
|
|
328
350
|
end
|
329
351
|
|
330
352
|
|
353
|
+
opt.on('--compressed',
|
354
|
+
'Request compressed response (using deflate or gzip)') do
|
355
|
+
options[:accept_encoding] = %w{gzip;q=1.0 deflate;q=0.6}
|
356
|
+
end
|
357
|
+
|
358
|
+
|
331
359
|
opt.on('-d', '--data STR', String,
|
332
360
|
'Post data with the request') do |value|
|
333
361
|
options[:data] = value
|
@@ -356,6 +384,13 @@ Parse and run diffs against data from live and cached http responses.
|
|
356
384
|
end
|
357
385
|
|
358
386
|
|
387
|
+
opt.on('--location-trusted [NUM]', Integer,
|
388
|
+
'Follow location and send auth to other hosts') do |value|
|
389
|
+
options[:trust_location] = true
|
390
|
+
options[:follow_redirects] = value || true
|
391
|
+
end
|
392
|
+
|
393
|
+
|
359
394
|
opt.on('--no-cookies', 'Don\'t use cookies for this session') do
|
360
395
|
options[:no_cookies] = true
|
361
396
|
end
|
@@ -373,7 +408,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
373
408
|
end
|
374
409
|
|
375
410
|
|
376
|
-
opt.on('-t', '--timeout
|
411
|
+
opt.on('-t', '--timeout NUM', Float,
|
377
412
|
'Timeout for http connection in seconds') do |value|
|
378
413
|
Kronk.config[:timeout] = value
|
379
414
|
end
|
@@ -398,7 +433,7 @@ Parse and run diffs against data from live and cached http responses.
|
|
398
433
|
|
399
434
|
|
400
435
|
opt.on('-X', '--request STR', String,
|
401
|
-
'The request method to use') do |value|
|
436
|
+
'The HTTP request method to use') do |value|
|
402
437
|
options[:http_method] = value
|
403
438
|
end
|
404
439
|
|
@@ -414,16 +449,15 @@ Parse and run diffs against data from live and cached http responses.
|
|
414
449
|
opts.parse! argv
|
415
450
|
|
416
451
|
unless options[:player].empty?
|
417
|
-
options[:player]
|
418
|
-
|
452
|
+
options[:player][:io] ||= $stdin if !$stdin.tty?
|
453
|
+
player_type = options[:player][:type] || :suite
|
454
|
+
options[:player] = Player.new_type player_type, options[:player]
|
419
455
|
else
|
420
456
|
options.delete :player
|
421
457
|
end
|
422
458
|
|
423
459
|
if !$stdin.tty? && !(options[:player] && options[:player].input.io)
|
424
|
-
|
425
|
-
io = StringIO.new $stdin.read
|
426
|
-
options[:uris] << io
|
460
|
+
options[:uris] << BufferedIO.new($stdin)
|
427
461
|
end
|
428
462
|
|
429
463
|
options[:uris].concat argv
|
@@ -616,26 +650,6 @@ Parse and run diffs against data from live and cached http responses.
|
|
616
650
|
end
|
617
651
|
|
618
652
|
|
619
|
-
##
|
620
|
-
# Set Player async state.
|
621
|
-
|
622
|
-
def self.set_player_backend async=false
|
623
|
-
return Kronk::Player.async = false unless
|
624
|
-
async == true || async.to_s == 'auto'
|
625
|
-
|
626
|
-
begin
|
627
|
-
require 'kronk/async'
|
628
|
-
Kronk::Player.async = true
|
629
|
-
|
630
|
-
rescue LoadError
|
631
|
-
Kronk::Player.async = false
|
632
|
-
|
633
|
-
raise Kronk::Exception, "Async mode requires the em-http-request gem" if
|
634
|
-
async == true
|
635
|
-
end
|
636
|
-
end
|
637
|
-
|
638
|
-
|
639
653
|
##
|
640
654
|
# Assign at_exit and trap :INT behavior.
|
641
655
|
|