kronk 1.7.8 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|