kronk 1.4.0 → 1.5.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/.gemtest +0 -0
- data/History.rdoc +22 -0
- data/Manifest.txt +15 -6
- data/README.rdoc +5 -6
- data/Rakefile +5 -5
- data/lib/kronk.rb +164 -194
- data/lib/kronk/cmd.rb +188 -74
- data/lib/kronk/constants.rb +90 -0
- data/lib/kronk/data_renderer.rb +146 -0
- data/lib/kronk/diff.rb +4 -92
- data/lib/kronk/path/transaction.rb +2 -0
- data/lib/kronk/player.rb +233 -0
- data/lib/kronk/player/benchmark.rb +261 -0
- data/lib/kronk/player/input_reader.rb +54 -0
- data/lib/kronk/player/output.rb +49 -0
- data/lib/kronk/player/request_parser.rb +24 -0
- data/lib/kronk/player/stream.rb +50 -0
- data/lib/kronk/player/suite.rb +123 -0
- data/lib/kronk/plist_parser.rb +4 -0
- data/lib/kronk/request.rb +265 -241
- data/lib/kronk/response.rb +330 -149
- data/lib/kronk/test/assertions.rb +2 -2
- data/lib/kronk/xml_parser.rb +7 -1
- data/test/mocks/cookies.yml +32 -0
- data/test/mocks/get_request.txt +6 -0
- data/test/test_assertions.rb +6 -6
- data/test/test_cmd.rb +708 -0
- data/test/test_diff.rb +210 -75
- data/test/test_helper.rb +140 -0
- data/test/test_helper_methods.rb +4 -4
- data/test/test_input_reader.rb +103 -0
- data/test/test_kronk.rb +142 -141
- data/test/test_player.rb +589 -0
- data/test/test_request.rb +147 -212
- data/test/test_request_parser.rb +31 -0
- data/test/test_response.rb +206 -15
- metadata +41 -74
- data/bin/yzma +0 -13
- data/lib/kronk/data_set.rb +0 -144
- data/lib/yzma.rb +0 -174
- data/lib/yzma/randomizer.rb +0 -54
- data/lib/yzma/report.rb +0 -47
- data/test/test_data_set.rb +0 -213
data/.gemtest
ADDED
File without changes
|
data/History.rdoc
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
=== 1.5.0 / 2011-08-11
|
2
|
+
|
3
|
+
* Major Enhancements:
|
4
|
+
|
5
|
+
* JSON is the primary output format (instead of Ruby).
|
6
|
+
|
7
|
+
* Support for replay functionality from log files.
|
8
|
+
|
9
|
+
* Support for Suite, Stream, and Benchmark outputs.
|
10
|
+
|
11
|
+
* A great deal of Kronk, Cmd, Request and Response class refactoring.
|
12
|
+
|
13
|
+
* Plist and Nokogiri dependencies optional, based on usage.
|
14
|
+
|
15
|
+
* Enhancements:
|
16
|
+
|
17
|
+
* Configurable output indentation.
|
18
|
+
|
19
|
+
* Bugfixes:
|
20
|
+
|
21
|
+
* Custom config files would never load.
|
22
|
+
|
1
23
|
=== 1.4.0 / 2011-07-04
|
2
24
|
|
3
25
|
* Enhancements:
|
data/Manifest.txt
CHANGED
@@ -4,15 +4,22 @@ Manifest.txt
|
|
4
4
|
README.rdoc
|
5
5
|
Rakefile
|
6
6
|
bin/kronk
|
7
|
-
bin/yzma
|
8
7
|
lib/kronk.rb
|
8
|
+
lib/kronk/constants.rb
|
9
9
|
lib/kronk/cmd.rb
|
10
|
-
lib/kronk/
|
10
|
+
lib/kronk/data_renderer.rb
|
11
11
|
lib/kronk/diff.rb
|
12
12
|
lib/kronk/diff/ascii_format.rb
|
13
13
|
lib/kronk/diff/color_format.rb
|
14
14
|
lib/kronk/path.rb
|
15
15
|
lib/kronk/path/transaction.rb
|
16
|
+
lib/kronk/player.rb
|
17
|
+
lib/kronk/player/benchmark.rb
|
18
|
+
lib/kronk/player/input_reader.rb
|
19
|
+
lib/kronk/player/output.rb
|
20
|
+
lib/kronk/player/request_parser.rb
|
21
|
+
lib/kronk/player/suite.rb
|
22
|
+
lib/kronk/player/stream.rb
|
16
23
|
lib/kronk/plist_parser.rb
|
17
24
|
lib/kronk/request.rb
|
18
25
|
lib/kronk/response.rb
|
@@ -21,9 +28,6 @@ lib/kronk/test/assertions.rb
|
|
21
28
|
lib/kronk/test/core_ext.rb
|
22
29
|
lib/kronk/test/helper_methods.rb
|
23
30
|
lib/kronk/xml_parser.rb
|
24
|
-
lib/yzma.rb
|
25
|
-
lib/yzma/randomizer.rb
|
26
|
-
lib/yzma/report.rb
|
27
31
|
script/kronk_completion
|
28
32
|
test/mocks/200_response.json
|
29
33
|
test/mocks/200_response.plist
|
@@ -31,15 +35,20 @@ test/mocks/200_response.txt
|
|
31
35
|
test/mocks/200_response.xml
|
32
36
|
test/mocks/301_response.txt
|
33
37
|
test/mocks/302_response.txt
|
38
|
+
test/mocks/cookies.yml
|
39
|
+
test/mocks/get_request.txt
|
34
40
|
test/test_assertions.rb
|
35
41
|
test/test_core_ext.rb
|
42
|
+
test/test_cmd.rb
|
36
43
|
test/test_helper_methods.rb
|
37
|
-
test/test_data_set.rb
|
38
44
|
test/test_diff.rb
|
39
45
|
test/test_helper.rb
|
46
|
+
test/test_input_reader.rb
|
40
47
|
test/test_kronk.rb
|
41
48
|
test/test_path.rb
|
49
|
+
test/test_player.rb
|
42
50
|
test/test_request.rb
|
51
|
+
test/test_request_parser.rb
|
43
52
|
test/test_response.rb
|
44
53
|
test/test_transaction.rb
|
45
54
|
test/test_xml_parser.rb
|
data/README.rdoc
CHANGED
@@ -29,7 +29,7 @@ Kronk was made possible by the sponsoring of AT&T Interactive.
|
|
29
29
|
|
30
30
|
* Helper methods for test suites.
|
31
31
|
|
32
|
-
*
|
32
|
+
* Query and logfile playback with custom output.
|
33
33
|
|
34
34
|
* Yes, it works on Windows.
|
35
35
|
|
@@ -141,6 +141,10 @@ Assign a default host to use when none is specified:
|
|
141
141
|
|
142
142
|
:default_host: http://localhost:3000
|
143
143
|
|
144
|
+
Set the number of spaces for indentation:
|
145
|
+
|
146
|
+
:indentation: 2
|
147
|
+
|
144
148
|
=== Bash Completion:
|
145
149
|
|
146
150
|
Bash completion is available by sourcing the file returned by:
|
@@ -190,7 +194,6 @@ attribute, you can do so by appending "/.." to the path.
|
|
190
194
|
{
|
191
195
|
"data" => {
|
192
196
|
"path2" => [
|
193
|
-
nil,
|
194
197
|
{
|
195
198
|
"first_child" => "first value",
|
196
199
|
"child" => "child value",
|
@@ -262,10 +265,6 @@ single quotes around some of your paths.
|
|
262
265
|
|
263
266
|
== REQUIREMENTS:
|
264
267
|
|
265
|
-
* nokogiri gem
|
266
|
-
|
267
|
-
* plist gem
|
268
|
-
|
269
268
|
* json gem
|
270
269
|
|
271
270
|
* cookiejar gem
|
data/Rakefile
CHANGED
@@ -22,12 +22,12 @@ Hoe.spec 'kronk' do
|
|
22
22
|
self.history_file = "History.rdoc"
|
23
23
|
self.extra_rdoc_files = FileList['*.rdoc']
|
24
24
|
|
25
|
-
self.extra_deps << ['
|
26
|
-
self.extra_deps << ['
|
27
|
-
self.extra_deps << ['nokogiri', '~>1.4']
|
28
|
-
self.extra_deps << ['cookiejar', '~>0.3.0']
|
25
|
+
self.extra_deps << ['json', '~>1.5']
|
26
|
+
self.extra_deps << ['cookiejar', '~>0.3.0']
|
29
27
|
|
30
|
-
self.extra_dev_deps << ['
|
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']
|
31
31
|
end
|
32
32
|
|
33
33
|
|
data/lib/kronk.rb
CHANGED
@@ -3,6 +3,10 @@ require 'rubygems'
|
|
3
3
|
require 'json'
|
4
4
|
require 'cookiejar'
|
5
5
|
|
6
|
+
require 'thread'
|
7
|
+
require 'stringio'
|
8
|
+
require 'base64'
|
9
|
+
|
6
10
|
require 'net/https'
|
7
11
|
require 'optparse'
|
8
12
|
require 'yaml'
|
@@ -10,13 +14,20 @@ require 'yaml'
|
|
10
14
|
class Kronk
|
11
15
|
|
12
16
|
# This gem's version.
|
13
|
-
VERSION = '1.
|
14
|
-
|
15
|
-
|
17
|
+
VERSION = '1.5.0'
|
18
|
+
|
19
|
+
require 'kronk/constants'
|
20
|
+
require 'kronk/player'
|
21
|
+
require 'kronk/player/output'
|
22
|
+
require 'kronk/player/suite'
|
23
|
+
require 'kronk/player/stream'
|
24
|
+
require 'kronk/player/benchmark'
|
25
|
+
require 'kronk/player/request_parser'
|
26
|
+
require 'kronk/player/input_reader'
|
16
27
|
require 'kronk/cmd'
|
17
28
|
require 'kronk/path'
|
18
29
|
require 'kronk/path/transaction'
|
19
|
-
require 'kronk/
|
30
|
+
require 'kronk/data_renderer'
|
20
31
|
require 'kronk/diff/ascii_format'
|
21
32
|
require 'kronk/diff/color_format'
|
22
33
|
require 'kronk/diff'
|
@@ -26,74 +37,6 @@ class Kronk
|
|
26
37
|
require 'kronk/xml_parser'
|
27
38
|
|
28
39
|
|
29
|
-
# Config directory.
|
30
|
-
CONFIG_DIR = File.expand_path "~/.kronk"
|
31
|
-
|
32
|
-
# Default config file to load. Defaults to ~/.kronk.
|
33
|
-
DEFAULT_CONFIG_FILE = File.join CONFIG_DIR, "rc"
|
34
|
-
|
35
|
-
# Default cache file.
|
36
|
-
DEFAULT_CACHE_FILE = File.join CONFIG_DIR, "cache"
|
37
|
-
|
38
|
-
# Default cookies file.
|
39
|
-
DEFAULT_COOKIES_FILE = File.join CONFIG_DIR, "cookies"
|
40
|
-
|
41
|
-
# Default file with history of unique URIs. (Used for autocomplete)
|
42
|
-
DEFAULT_HISTORY_FILE = File.join CONFIG_DIR, "history"
|
43
|
-
|
44
|
-
|
45
|
-
# Default Content-Type header to parser mapping.
|
46
|
-
DEFAULT_CONTENT_TYPES = {
|
47
|
-
'js' => 'JSON',
|
48
|
-
'json' => 'JSON',
|
49
|
-
'plist' => 'PlistParser',
|
50
|
-
'xml' => 'XMLParser'
|
51
|
-
}
|
52
|
-
|
53
|
-
|
54
|
-
# Aliases for various user-agents. Thanks Mechanize! :)
|
55
|
-
USER_AGENTS = {
|
56
|
-
'kronk' =>
|
57
|
-
"Kronk/#{VERSION} (http://github.com/yaksnrainbows/kronk)",
|
58
|
-
'iphone' =>
|
59
|
-
"Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3",
|
60
|
-
'linux_firefox' =>
|
61
|
-
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1",
|
62
|
-
'linux_mozilla' =>
|
63
|
-
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624",
|
64
|
-
'mac_mozilla' =>
|
65
|
-
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4a) Gecko/20030401",
|
66
|
-
'linux_konqueror' =>
|
67
|
-
"Mozilla/5.0 (compatible; Konqueror/3; Linux)",
|
68
|
-
'mac_firefox' =>
|
69
|
-
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",
|
70
|
-
'mac_safari' =>
|
71
|
-
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
|
72
|
-
'win_ie6' =>
|
73
|
-
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
|
74
|
-
'win_ie7' =>
|
75
|
-
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
|
76
|
-
'win_mozilla' =>
|
77
|
-
"Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6"
|
78
|
-
}
|
79
|
-
|
80
|
-
|
81
|
-
# Default config to use.
|
82
|
-
DEFAULT_CONFIG = {
|
83
|
-
:content_types => DEFAULT_CONTENT_TYPES.dup,
|
84
|
-
:cache_file => DEFAULT_CACHE_FILE,
|
85
|
-
:cookies_file => DEFAULT_COOKIES_FILE,
|
86
|
-
:default_host => "http://localhost:3000",
|
87
|
-
:diff_format => :ascii_diff,
|
88
|
-
:history_file => DEFAULT_HISTORY_FILE,
|
89
|
-
:requires => [],
|
90
|
-
:show_lines => false,
|
91
|
-
:uri_options => {},
|
92
|
-
:use_cookies => true,
|
93
|
-
:user_agents => USER_AGENTS.dup
|
94
|
-
}
|
95
|
-
|
96
|
-
|
97
40
|
##
|
98
41
|
# Read the Kronk config hash.
|
99
42
|
|
@@ -106,107 +49,15 @@ class Kronk
|
|
106
49
|
# Load a config file and apply to Kronk.config.
|
107
50
|
|
108
51
|
def self.load_config filepath=DEFAULT_CONFIG_FILE
|
109
|
-
conf
|
110
|
-
content_types = conf.delete :content_types
|
111
|
-
uri_options = conf.delete :uri_options
|
112
|
-
user_agents = conf.delete :user_agents
|
113
|
-
|
114
|
-
if conf[:requires]
|
115
|
-
requires = [*conf.delete(:requires)]
|
116
|
-
self.config[:requires] ||= []
|
117
|
-
self.config[:requires].concat requires
|
118
|
-
end
|
119
|
-
|
120
|
-
self.config[:uri_options].merge! uri_options if uri_options
|
121
|
-
self.config[:content_types].merge! content_types if content_types
|
122
|
-
self.config[:user_agents].merge! user_agents if user_agents
|
123
|
-
|
124
|
-
self.config.merge! conf
|
125
|
-
end
|
126
|
-
|
127
|
-
|
128
|
-
##
|
129
|
-
# Load the config-based requires.
|
130
|
-
|
131
|
-
def self.load_requires more_requires=nil
|
132
|
-
return unless config[:requires] || more_requires
|
133
|
-
(config[:requires] | more_requires.to_a).each{|lib| require lib }
|
134
|
-
end
|
135
|
-
|
136
|
-
|
137
|
-
##
|
138
|
-
# Creates the default config file at the given path.
|
139
|
-
|
140
|
-
def self.make_config_file
|
141
|
-
Dir.mkdir CONFIG_DIR unless File.directory? CONFIG_DIR
|
142
|
-
|
143
|
-
File.open DEFAULT_CONFIG_FILE, "w+" do |file|
|
144
|
-
file << DEFAULT_CONFIG.to_yaml
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
##
|
150
|
-
# Returns merged config-defined options for a given uri.
|
151
|
-
# Values in cmd_opts take precedence.
|
152
|
-
# Returns cmd_opts Hash if none found.
|
153
|
-
|
154
|
-
def self.merge_options_for_uri uri, cmd_opts={}
|
155
|
-
return cmd_opts if Kronk.config[:no_uri_options]
|
156
|
-
|
157
|
-
out_opts = Hash.new.merge cmd_opts
|
158
|
-
|
159
|
-
Kronk.config[:uri_options].each do |matcher, opts|
|
160
|
-
next unless (uri == matcher || uri =~ %r{#{matcher}}) && Hash === opts
|
161
|
-
|
162
|
-
opts.each do |key, val|
|
163
|
-
if !out_opts[key]
|
164
|
-
out_opts[key] = val
|
165
|
-
next
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
case key
|
52
|
+
conf = YAML.load_file filepath
|
170
53
|
|
171
|
-
|
172
|
-
when :data, :query
|
173
|
-
val = Request.parse_nested_query val if String === val
|
174
|
-
|
175
|
-
out_opts[key] = Request.parse_nested_query out_opts[key] if
|
176
|
-
String === out_opts[key]
|
177
|
-
|
178
|
-
out_opts[key] = val.merge out_opts[key], &DataSet::DEEP_MERGE
|
179
|
-
|
180
|
-
# Hashes
|
181
|
-
when :headers, :auth
|
182
|
-
out_opts[key] = val.merge out_opts[key]
|
54
|
+
self.config[:requires].concat [*conf.delete(:requires)] if conf[:requires]
|
183
55
|
|
184
|
-
|
185
|
-
|
186
|
-
if Hash === val && Hash === out_opts[key]
|
187
|
-
out_opts[key] = val.merge out_opts[key]
|
188
|
-
|
189
|
-
elsif Hash === val && String === out_opts[key]
|
190
|
-
val[:address] = out_opts[key]
|
191
|
-
out_opts[key] = val
|
192
|
-
|
193
|
-
elsif String === val && Hash === out_opts[key]
|
194
|
-
out_opts[key][:address] ||= val
|
195
|
-
end
|
196
|
-
|
197
|
-
# Response headers - Boolean, String, or Array
|
198
|
-
when :with_headers
|
199
|
-
next if out_opts[key] == true || out_opts[key] && val == true
|
200
|
-
out_opts[key] = [*out_opts[key]] | [*val]
|
201
|
-
|
202
|
-
# String or Array
|
203
|
-
when :only_data, :only_data_with, :ignore_data, :ignore_data_with
|
204
|
-
out_opts[key] = [*out_opts[key]] | [*val]
|
205
|
-
end
|
206
|
-
end
|
56
|
+
[:content_types, :uri_options, :user_agents].each do |key|
|
57
|
+
self.config[key].merge! conf.delete(key) if conf[key]
|
207
58
|
end
|
208
59
|
|
209
|
-
|
60
|
+
self.config.merge! conf
|
210
61
|
end
|
211
62
|
|
212
63
|
|
@@ -306,9 +157,29 @@ class Kronk
|
|
306
157
|
|
307
158
|
|
308
159
|
##
|
309
|
-
#
|
310
|
-
#
|
311
|
-
|
160
|
+
# See Kronk#compare. Short for:
|
161
|
+
# Kronk.new(opts).compare(uri1, uri2)
|
162
|
+
|
163
|
+
def self.compare uri1, uri2, opts={}
|
164
|
+
new(opts).compare uri1, uri2
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
##
|
169
|
+
# See Kronk#retrieve. Short for:
|
170
|
+
# Kronk.new(opts).retrieve(uri)
|
171
|
+
|
172
|
+
def self.retrieve uri, opts={}
|
173
|
+
new(opts).retrieve uri
|
174
|
+
end
|
175
|
+
|
176
|
+
|
177
|
+
attr_accessor :diff, :options, :response, :responses
|
178
|
+
|
179
|
+
|
180
|
+
##
|
181
|
+
# Create a Kronk instance to keep references to all request, response,
|
182
|
+
# and diff data.
|
312
183
|
#
|
313
184
|
# Supports the following options:
|
314
185
|
# :data:: Hash/String - the data to pass to the http request
|
@@ -321,51 +192,150 @@ class Kronk
|
|
321
192
|
# :proxy:: Hash/String - http proxy to use; defaults to nil
|
322
193
|
# :only_data:: String/Array - extracts the data from given data paths
|
323
194
|
# :ignore_data:: String/Array - defines which data points to exclude
|
324
|
-
# :keep_indicies:: Boolean -
|
325
|
-
# and return them as hashes.
|
195
|
+
# :keep_indicies:: Boolean - indicies of modified arrays display as hashes.
|
326
196
|
# :with_headers:: Boolean/String/Array - defines which headers to include
|
327
197
|
# :parser:: Object/String - the parser to use for the body; default nil
|
328
198
|
# :raw:: Boolean - run diff on raw strings
|
199
|
+
|
200
|
+
def initialize opts={}
|
201
|
+
@options = opts
|
202
|
+
@diff = nil
|
203
|
+
@responses = []
|
204
|
+
@response = nil
|
205
|
+
end
|
206
|
+
|
207
|
+
|
208
|
+
##
|
209
|
+
# Make requests, parse the responses and compare the data.
|
210
|
+
# Query arguments may be set to the special value :cache to use the
|
211
|
+
# last live http response retrieved.
|
329
212
|
#
|
330
213
|
# Returns a diff object.
|
331
214
|
|
332
|
-
def
|
215
|
+
def compare uri1, uri2
|
333
216
|
str1 = str2 = ""
|
217
|
+
res1 = res2 = nil
|
218
|
+
|
219
|
+
t1 = Thread.new do
|
220
|
+
res1 = retrieve uri1
|
221
|
+
str1 = res1.stringify @options
|
222
|
+
end
|
334
223
|
|
335
|
-
|
336
|
-
|
224
|
+
t2 = Thread.new do
|
225
|
+
res2 = retrieve uri2
|
226
|
+
str2 = res2.stringify @options
|
227
|
+
end
|
337
228
|
|
338
229
|
t1.join
|
339
230
|
t2.join
|
340
231
|
|
341
|
-
|
232
|
+
@responses = [res1, res2]
|
233
|
+
@response = res2
|
234
|
+
|
235
|
+
@diff = Diff.new str1, str2
|
342
236
|
end
|
343
237
|
|
344
238
|
|
345
239
|
##
|
346
|
-
#
|
347
|
-
# See Kronk.compare for supported options.
|
240
|
+
# Returns a Response instance from a url, file, or IO as a String.
|
348
241
|
|
349
|
-
def
|
350
|
-
options =
|
242
|
+
def retrieve uri
|
243
|
+
options = Kronk.config[:no_uri_options] ? options_for_uri(uri) : @options
|
351
244
|
|
352
|
-
|
245
|
+
if IO === uri || StringIO === uri
|
246
|
+
Cmd.verbose "Reading IO #{uri}"
|
247
|
+
resp = Response.new uri
|
353
248
|
|
354
|
-
|
355
|
-
Cmd.
|
356
|
-
|
357
|
-
elsif options[:raw]
|
358
|
-
resp.selective_string options
|
249
|
+
elsif File.file? uri.to_s
|
250
|
+
Cmd.verbose "Reading file: #{uri}\n"
|
251
|
+
resp = Response.read_file uri
|
359
252
|
|
360
253
|
else
|
361
|
-
|
362
|
-
|
363
|
-
|
254
|
+
req = Request.new uri, options
|
255
|
+
Cmd.verbose "Retrieving URL: #{req.uri}\n"
|
256
|
+
resp = req.retrieve
|
257
|
+
Kronk.history << uri
|
258
|
+
end
|
364
259
|
|
365
|
-
|
366
|
-
|
367
|
-
|
260
|
+
max_rdir = options[:follow_redirects]
|
261
|
+
while resp.redirect? && (max_rdir == true || max_rdir.to_s.to_i > 0)
|
262
|
+
Cmd.verbose "Following redirect..."
|
263
|
+
resp = resp.follow_redirect
|
264
|
+
max_rdir = max_rdir - 1 if Fixnum === max_rdir
|
265
|
+
end
|
266
|
+
|
267
|
+
@responses = [resp]
|
268
|
+
@response = resp
|
269
|
+
@diff = nil
|
270
|
+
|
271
|
+
resp
|
272
|
+
|
273
|
+
rescue SocketError, Errno::ENOENT, Errno::ECONNREFUSED
|
274
|
+
raise NotFoundError, "#{uri} could not be found"
|
275
|
+
|
276
|
+
rescue Timeout::Error
|
277
|
+
raise TimeoutError, "#{uri} took too long to respond"
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
##
|
282
|
+
# Returns merged config-defined options for a given uri.
|
283
|
+
# Values in cmd_opts take precedence.
|
284
|
+
# Returns cmd_opts Hash if none found.
|
285
|
+
|
286
|
+
def options_for_uri uri
|
287
|
+
out_opts = @options.dup
|
288
|
+
|
289
|
+
Kronk.config[:uri_options].each do |matcher, opts|
|
290
|
+
next unless (uri == matcher || uri =~ %r{#{matcher}}) && Hash === opts
|
291
|
+
|
292
|
+
opts.each do |key, val|
|
293
|
+
if out_opts[key].nil?
|
294
|
+
out_opts[key] = val
|
295
|
+
next
|
296
|
+
end
|
297
|
+
|
298
|
+
|
299
|
+
case key
|
300
|
+
|
301
|
+
# Hash or uri query String
|
302
|
+
when :data, :query
|
303
|
+
val = Request.parse_nested_query val if String === val
|
304
|
+
|
305
|
+
out_opts[key] = Request.parse_nested_query out_opts[key] if
|
306
|
+
String === out_opts[key]
|
307
|
+
|
308
|
+
out_opts[key] = val.merge out_opts[key], &DEEP_MERGE
|
309
|
+
|
310
|
+
# Hashes
|
311
|
+
when :headers, :auth
|
312
|
+
out_opts[key] = val.merge out_opts[key]
|
313
|
+
|
314
|
+
# Proxy hash or String
|
315
|
+
when :proxy
|
316
|
+
if Hash === val && Hash === out_opts[key]
|
317
|
+
out_opts[key] = val.merge out_opts[key]
|
318
|
+
|
319
|
+
elsif Hash === val && String === out_opts[key]
|
320
|
+
val[:address] = out_opts[key]
|
321
|
+
out_opts[key] = val
|
322
|
+
|
323
|
+
elsif String === val && Hash === out_opts[key]
|
324
|
+
out_opts[key][:address] ||= val
|
325
|
+
end
|
326
|
+
|
327
|
+
# Response headers - Boolean, String, or Array
|
328
|
+
when :with_headers
|
329
|
+
next if out_opts[key] == true || out_opts[key] && val == true
|
330
|
+
out_opts[key] = [*out_opts[key]] | [*val]
|
331
|
+
|
332
|
+
# String or Array
|
333
|
+
when :only_data, :ignore_data
|
334
|
+
out_opts[key] = [*out_opts[key]] | [*val]
|
335
|
+
end
|
368
336
|
end
|
369
337
|
end
|
338
|
+
|
339
|
+
out_opts
|
370
340
|
end
|
371
341
|
end
|