ronin-support 0.5.0.rc1 → 0.5.0.rc2
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/ChangeLog.md +6 -1
- data/lib/ronin/fuzzing/extensions/string.rb +21 -208
- data/lib/ronin/fuzzing/fuzzer.rb +118 -0
- data/lib/ronin/fuzzing/fuzzing.rb +7 -2
- data/lib/ronin/fuzzing/mutator.rb +161 -0
- data/lib/ronin/fuzzing/repeater.rb +81 -0
- data/lib/ronin/fuzzing/template.rb +133 -0
- data/lib/ronin/network/mixins/http.rb +51 -580
- data/lib/ronin/support/version.rb +1 -1
- data/lib/ronin/wordlist.rb +9 -4
- data/spec/fuzzing/extensions/string_spec.rb +87 -0
- data/spec/fuzzing/fuzzer_spec.rb +109 -0
- data/spec/fuzzing/fuzzing_spec.rb +24 -0
- data/spec/fuzzing/mutator_spec.rb +112 -0
- data/spec/fuzzing/repeater_spec.rb +57 -0
- data/spec/fuzzing/template_spec.rb +54 -0
- data/spec/spec_helper.rb +3 -3
- metadata +12 -3
- data/spec/fuzzing/string_spec.rb +0 -158
@@ -0,0 +1,81 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
module Ronin
|
21
|
+
module Fuzzing
|
22
|
+
#
|
23
|
+
# Fuzzing class that generates repeated data.
|
24
|
+
#
|
25
|
+
# @api semipublic
|
26
|
+
#
|
27
|
+
# @since 0.5.0
|
28
|
+
#
|
29
|
+
class Repeater
|
30
|
+
|
31
|
+
# The lengths to repeat the data by
|
32
|
+
attr_reader :lengths
|
33
|
+
|
34
|
+
#
|
35
|
+
# Initializes a new Repeater.
|
36
|
+
#
|
37
|
+
# @param [Enumerable, Integer] lengths
|
38
|
+
# The lengths to repeat the data by.
|
39
|
+
#
|
40
|
+
# @raise [TypeError]
|
41
|
+
# `lengths` must either be Enumerable or an Integer.
|
42
|
+
#
|
43
|
+
def initialize(lengths)
|
44
|
+
@lengths = case lengths
|
45
|
+
when Integer
|
46
|
+
[lengths]
|
47
|
+
when Enumerable
|
48
|
+
lengths
|
49
|
+
else
|
50
|
+
raise(TypeError,"argument must be Enumerable or an Integer")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Enumerates through each length of repeated data.
|
56
|
+
#
|
57
|
+
# @param [#*] repeatable
|
58
|
+
# The repeatable data.
|
59
|
+
#
|
60
|
+
# @yield [repeated]
|
61
|
+
# The given block will be passed every repeated String.
|
62
|
+
#
|
63
|
+
# @yieldparam [String] repeated
|
64
|
+
# A repeated version of the String.
|
65
|
+
#
|
66
|
+
# @return [Enumerator]
|
67
|
+
# If no block is given, an Enumerator will be returned.
|
68
|
+
#
|
69
|
+
def each(repeatable)
|
70
|
+
return enum_for(__method__,repeatable) unless block_given?
|
71
|
+
|
72
|
+
@lengths.each do |length|
|
73
|
+
yield(repeatable * length)
|
74
|
+
end
|
75
|
+
|
76
|
+
return nil
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2012 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'chars'
|
21
|
+
require 'combinatorics/generator'
|
22
|
+
require 'combinatorics/list_comprehension'
|
23
|
+
|
24
|
+
module Ronin
|
25
|
+
module Fuzzing
|
26
|
+
#
|
27
|
+
# Fuzzing class that generates Strings based on a template.
|
28
|
+
#
|
29
|
+
# @api semipublic
|
30
|
+
#
|
31
|
+
# @since 0.5.0
|
32
|
+
#
|
33
|
+
class Template
|
34
|
+
|
35
|
+
include Enumerable
|
36
|
+
|
37
|
+
#
|
38
|
+
# Initializes a new Fuzzing template.
|
39
|
+
#
|
40
|
+
# @param [Array(<String,Symbol,Enumerable>, <Integer,Array,Range>)] fields
|
41
|
+
# The fields which defines the string or character sets which will
|
42
|
+
# make up parts of the String.
|
43
|
+
#
|
44
|
+
# @raise [ArgumentError]
|
45
|
+
# A given character set name was unknown.
|
46
|
+
#
|
47
|
+
# @raise [TypeError]
|
48
|
+
# A given string set was not a String, Symbol or Enumerable.
|
49
|
+
# A given string set length was not an Integer or Enumerable.
|
50
|
+
#
|
51
|
+
def initialize(fields)
|
52
|
+
@enumerators = []
|
53
|
+
|
54
|
+
fields.each do |(set,length)|
|
55
|
+
enum = case set
|
56
|
+
when String
|
57
|
+
[set].each
|
58
|
+
when Enumerable
|
59
|
+
set.each
|
60
|
+
when Symbol
|
61
|
+
name = set.to_s.upcase
|
62
|
+
|
63
|
+
unless Chars.const_defined?(name)
|
64
|
+
raise(ArgumentError,"unknown charset #{set.inspect}")
|
65
|
+
end
|
66
|
+
|
67
|
+
Chars.const_get(name).each_char
|
68
|
+
else
|
69
|
+
raise(TypeError,"set must be a String, Symbol or Enumerable")
|
70
|
+
end
|
71
|
+
|
72
|
+
case length
|
73
|
+
when Integer
|
74
|
+
length.times { @enumerators << enum.dup }
|
75
|
+
when Array, Range
|
76
|
+
@enumerators << Combinatorics::Generator.new do |g|
|
77
|
+
length.each do |sublength|
|
78
|
+
superset = Array.new(sublength) { enum.dup }
|
79
|
+
|
80
|
+
superset.comprehension { |strings| g.yield strings.join }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
when nil
|
84
|
+
@enumerators << enum
|
85
|
+
else
|
86
|
+
raise(TypeError,"length must be an Integer, Range or Array")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# @see #initialize
|
93
|
+
#
|
94
|
+
def self.[](*fields)
|
95
|
+
new(fields)
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# Generate permutations of Strings from a format template.
|
100
|
+
#
|
101
|
+
# @yield [string]
|
102
|
+
# The given block will be passed each unique String.
|
103
|
+
#
|
104
|
+
# @yieldparam [String] string
|
105
|
+
# A newly generated String.
|
106
|
+
#
|
107
|
+
# @return [Enumerator]
|
108
|
+
# If no block is given, an Enumerator will be returned.
|
109
|
+
#
|
110
|
+
def each
|
111
|
+
return enum_for(__method__) unless block_given?
|
112
|
+
|
113
|
+
@enumerators.comprehension do |fields|
|
114
|
+
string = ''
|
115
|
+
|
116
|
+
fields.each do |field|
|
117
|
+
string << case field
|
118
|
+
when Integer
|
119
|
+
field.chr
|
120
|
+
else
|
121
|
+
field.to_s
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
yield string
|
126
|
+
end
|
127
|
+
|
128
|
+
return nil
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -78,7 +78,7 @@ module Ronin
|
|
78
78
|
end
|
79
79
|
|
80
80
|
#
|
81
|
-
#
|
81
|
+
# Starts a HTTP connection with the server.
|
82
82
|
#
|
83
83
|
# @param [Hash] options
|
84
84
|
# Additional options
|
@@ -86,51 +86,46 @@ module Ronin
|
|
86
86
|
# @option options [String, URI::HTTP] :url
|
87
87
|
# The full URL to request.
|
88
88
|
#
|
89
|
-
# @option options [String] :user
|
90
|
-
# The user to authenticate with when connecting to the HTTP
|
91
|
-
# server.
|
92
|
-
#
|
93
|
-
# @option options [String] :password
|
94
|
-
# The password to authenticate with when connecting to the HTTP
|
95
|
-
# server.
|
96
|
-
#
|
97
89
|
# @option options [String] :host
|
98
90
|
# The host the HTTP server is running on.
|
99
91
|
#
|
100
92
|
# @option options [Integer] :port (Net::HTTP.default_port)
|
101
93
|
# The port the HTTP server is listening on.
|
102
94
|
#
|
103
|
-
# @option options [String] :
|
104
|
-
#
|
95
|
+
# @option options [String, Hash] :proxy (HTTP.proxy)
|
96
|
+
# A Hash of proxy settings to use when connecting to the HTTP server.
|
97
|
+
#
|
98
|
+
# @option options [String] :user
|
99
|
+
# The user to authenticate with when connecting to the HTTP server.
|
100
|
+
#
|
101
|
+
# @option options [String] :password
|
102
|
+
# The password to authenticate with when connecting to the HTTP
|
103
|
+
# server.
|
105
104
|
#
|
106
|
-
# @
|
107
|
-
#
|
108
|
-
# object.
|
105
|
+
# @option options [Boolean, Hash] :ssl
|
106
|
+
# Enables SSL for the HTTP connection.
|
109
107
|
#
|
110
|
-
# @
|
108
|
+
# @option :ssl [Symbol] :verify
|
109
|
+
# Specifies the SSL certificate verification mode.
|
110
|
+
#
|
111
|
+
# @yield [http]
|
112
|
+
# If a block is given, it will be passed the newly created HTTP
|
113
|
+
# session object.
|
114
|
+
#
|
115
|
+
# @yieldparam [Net::HTTP] http
|
111
116
|
# The newly created HTTP session.
|
112
117
|
#
|
113
118
|
# @return [Net::HTTP]
|
114
119
|
# The HTTP session object.
|
115
120
|
#
|
116
|
-
# @see Network::HTTP#
|
121
|
+
# @see Network::HTTP#http_connect
|
117
122
|
#
|
118
123
|
# @api public
|
119
124
|
#
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
super(options)
|
124
|
-
print_info "Starting HTTP Session with #{host_port}"
|
125
|
-
|
126
|
-
if block.arity == 2
|
127
|
-
block.call(http,expanded_options)
|
128
|
-
else
|
129
|
-
block.call(http)
|
130
|
-
end
|
131
|
-
|
132
|
-
print_info "Closing HTTP Session with #{host_port}"
|
133
|
-
end
|
125
|
+
# @since 0.5.0
|
126
|
+
#
|
127
|
+
def http_connect(options={},&block)
|
128
|
+
super(http_merge_options(options),&block)
|
134
129
|
end
|
135
130
|
|
136
131
|
#
|
@@ -163,523 +158,32 @@ module Ronin
|
|
163
158
|
# @api public
|
164
159
|
#
|
165
160
|
def http_request(options={},&block)
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
#
|
175
|
-
# @param [Hash] options
|
176
|
-
# Additional options.
|
177
|
-
#
|
178
|
-
# @option options [Symbol, String] :method (:head)
|
179
|
-
# The method to use for the request.
|
180
|
-
#
|
181
|
-
# @return [Integer]
|
182
|
-
# The HTTP Response Status.
|
183
|
-
#
|
184
|
-
# @see Network::HTTP#http_status
|
185
|
-
#
|
186
|
-
# @since 1.1.0
|
187
|
-
#
|
188
|
-
# @api public
|
189
|
-
#
|
190
|
-
def http_status(options={})
|
191
|
-
options = http_merge_options(options)
|
192
|
-
|
193
|
-
if (result = super(options))
|
194
|
-
print_debug "HTTP #{result} #{http_options_to_s(options)}"
|
195
|
-
end
|
196
|
-
|
197
|
-
return result
|
198
|
-
end
|
199
|
-
|
200
|
-
#
|
201
|
-
# Checks if the response has an HTTP OK status code.
|
202
|
-
#
|
203
|
-
# @param [Hash] options
|
204
|
-
# Additional options.
|
205
|
-
#
|
206
|
-
# @option options [Symbol, String] :method (:head)
|
207
|
-
# The method to use for the request.
|
208
|
-
#
|
209
|
-
# @return [Boolean]
|
210
|
-
# Specifies whether the response had an HTTP OK status code or not.
|
211
|
-
#
|
212
|
-
# @see Network::HTTP#http_ok?
|
213
|
-
#
|
214
|
-
# @since 1.1.0
|
215
|
-
#
|
216
|
-
# @api public
|
217
|
-
#
|
218
|
-
def http_ok?(options={})
|
219
|
-
options = http_merge_options(options)
|
161
|
+
response = super(options) do |request,expanded_options|
|
162
|
+
if block
|
163
|
+
if block.arity == 2
|
164
|
+
block.call(request,expanded_options)
|
165
|
+
else
|
166
|
+
block.call(request)
|
167
|
+
end
|
168
|
+
end
|
220
169
|
|
221
|
-
|
222
|
-
|
223
|
-
end
|
170
|
+
host = options.fetch(:host,self.host)
|
171
|
+
port = options.fetch(:port,self.port)
|
224
172
|
|
225
|
-
|
226
|
-
end
|
173
|
+
print_info "HTTP #{request.method} #{host}:#{port} #{request.path}"
|
227
174
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
# @param [Hash] options
|
232
|
-
# Additional options.
|
233
|
-
#
|
234
|
-
# @option options [Symbol, String] :method (:head)
|
235
|
-
# The method to use for the request.
|
236
|
-
#
|
237
|
-
# @return [String]
|
238
|
-
# The HTTP `Server` header.
|
239
|
-
#
|
240
|
-
# @see Network::HTTP#http_server
|
241
|
-
#
|
242
|
-
# @since 1.1.0
|
243
|
-
#
|
244
|
-
# @api public
|
245
|
-
#
|
246
|
-
def http_server(options={})
|
247
|
-
options = http_merge_options(options)
|
248
|
-
|
249
|
-
if (result = super(options))
|
250
|
-
print_debug "HTTP Server: #{result}"
|
175
|
+
request.each_capitalized do |name,value|
|
176
|
+
print_debug " #{name}: #{value}"
|
177
|
+
end
|
251
178
|
end
|
252
179
|
|
253
|
-
|
254
|
-
end
|
255
|
-
|
256
|
-
#
|
257
|
-
# Sends an HTTP Head request and returns the HTTP X-Powered-By header.
|
258
|
-
#
|
259
|
-
# @param [Hash] options
|
260
|
-
# Additional options.
|
261
|
-
#
|
262
|
-
# @option options [Symbol, String] :method (:get)
|
263
|
-
# The method to use for the request.
|
264
|
-
#
|
265
|
-
# @return [String]
|
266
|
-
# The HTTP `X-Powered-By` header.
|
267
|
-
#
|
268
|
-
# @see Network::HTTP#http_powered_by
|
269
|
-
#
|
270
|
-
# @since 1.1.0
|
271
|
-
#
|
272
|
-
# @api public
|
273
|
-
#
|
274
|
-
def http_powered_by(options={})
|
275
|
-
options = http_merge_options(options)
|
180
|
+
print_info "HTTP #{response.code} #{response.message}"
|
276
181
|
|
277
|
-
|
278
|
-
print_debug "
|
182
|
+
response.each_capitalized do |name,value|
|
183
|
+
print_debug " #{name}: #{value}"
|
279
184
|
end
|
280
185
|
|
281
|
-
return
|
282
|
-
end
|
283
|
-
|
284
|
-
#
|
285
|
-
# Performs an HTTP Copy request.
|
286
|
-
#
|
287
|
-
# @yield [response]
|
288
|
-
# If a block is given, it will be passed the response received
|
289
|
-
# from the request.
|
290
|
-
#
|
291
|
-
# @yieldparam [Net::HTTP::Response] response
|
292
|
-
# The HTTP response object.
|
293
|
-
#
|
294
|
-
# @return [Net::HTTP::Response]
|
295
|
-
# The response of the HTTP request.
|
296
|
-
#
|
297
|
-
# @see Network::HTTP#http_copy
|
298
|
-
#
|
299
|
-
# @api public
|
300
|
-
#
|
301
|
-
def http_copy(options={},&block)
|
302
|
-
options = http_merge_options(options)
|
303
|
-
print_info "HTTP COPY #{http_options_to_s(options)}"
|
304
|
-
|
305
|
-
return super(options,&block)
|
306
|
-
end
|
307
|
-
|
308
|
-
#
|
309
|
-
# Performs an HTTP Delete request.
|
310
|
-
#
|
311
|
-
# @yield [response]
|
312
|
-
# If a block is given, it will be passed the response received
|
313
|
-
# from the request.
|
314
|
-
#
|
315
|
-
# @yieldparam [Net::HTTP::Response] response
|
316
|
-
# The HTTP response object.
|
317
|
-
#
|
318
|
-
# @return [Net::HTTP::Response]
|
319
|
-
# The response of the HTTP request.
|
320
|
-
#
|
321
|
-
# @see Network::HTTP#http_delete
|
322
|
-
#
|
323
|
-
# @api public
|
324
|
-
#
|
325
|
-
def http_delete(options={},&block)
|
326
|
-
options = http_merge_options(options)
|
327
|
-
print_info "HTTP DELETE #{http_options_to_s(options)}"
|
328
|
-
|
329
|
-
return super(options,&block)
|
330
|
-
end
|
331
|
-
|
332
|
-
#
|
333
|
-
# Performs an HTTP Get request.
|
334
|
-
#
|
335
|
-
# @yield [response]
|
336
|
-
# If a block is given, it will be passed the response received
|
337
|
-
# from the request.
|
338
|
-
#
|
339
|
-
# @yieldparam [Net::HTTP::Response] response
|
340
|
-
# The HTTP response object.
|
341
|
-
#
|
342
|
-
# @return [Net::HTTP::Response]
|
343
|
-
# The response of the HTTP request.
|
344
|
-
#
|
345
|
-
# @see Network::HTTP#http_get
|
346
|
-
#
|
347
|
-
# @api public
|
348
|
-
#
|
349
|
-
def http_get(options={},&block)
|
350
|
-
options = http_merge_options(options)
|
351
|
-
print_info "HTTP GET #{http_options_to_s(options)}"
|
352
|
-
|
353
|
-
return super(options,&block)
|
354
|
-
end
|
355
|
-
|
356
|
-
#
|
357
|
-
# Performs an HTTP Get request.
|
358
|
-
#
|
359
|
-
# @yield [response]
|
360
|
-
# If a block is given, it will be passed the response received
|
361
|
-
# from the request.
|
362
|
-
#
|
363
|
-
# @yieldparam [Net::HTTP::Response] response
|
364
|
-
# The HTTP response object.
|
365
|
-
#
|
366
|
-
# @return [String]
|
367
|
-
# The body of the HTTP Get request.
|
368
|
-
#
|
369
|
-
# @see Network::HTTP#http_get_body
|
370
|
-
#
|
371
|
-
# @api public
|
372
|
-
#
|
373
|
-
def http_get_body(options={},&block)
|
374
|
-
options = http_merge_options(options)
|
375
|
-
print_info "HTTP GET #{http_options_to_s(options)}"
|
376
|
-
|
377
|
-
return super(options,&block)
|
378
|
-
end
|
379
|
-
|
380
|
-
#
|
381
|
-
# Performs an HTTP Head request.
|
382
|
-
#
|
383
|
-
# @yield [response]
|
384
|
-
# If a block is given, it will be passed the response received
|
385
|
-
# from the request.
|
386
|
-
#
|
387
|
-
# @yieldparam [Net::HTTP::Response] response
|
388
|
-
# The HTTP response object.
|
389
|
-
#
|
390
|
-
# @return [Net::HTTP::Response]
|
391
|
-
# The response of the HTTP request.
|
392
|
-
#
|
393
|
-
# @see Network::HTTP#http_head
|
394
|
-
#
|
395
|
-
# @api public
|
396
|
-
#
|
397
|
-
def http_head(options={},&block)
|
398
|
-
options = http_merge_options(options)
|
399
|
-
print_info "HTTP HEAD #{http_options_to_s(options)}"
|
400
|
-
|
401
|
-
return super(options,&block)
|
402
|
-
end
|
403
|
-
|
404
|
-
#
|
405
|
-
# Performs an HTTP Lock request.
|
406
|
-
#
|
407
|
-
# @yield [response]
|
408
|
-
# If a block is given, it will be passed the response received
|
409
|
-
# from the request.
|
410
|
-
#
|
411
|
-
# @yieldparam [Net::HTTP::Response] response
|
412
|
-
# The HTTP response object.
|
413
|
-
#
|
414
|
-
# @return [Net::HTTP::Response]
|
415
|
-
# The response of the HTTP request.
|
416
|
-
#
|
417
|
-
# @see Network::HTTP#http_lock
|
418
|
-
#
|
419
|
-
# @api public
|
420
|
-
#
|
421
|
-
def http_lock(options={},&block)
|
422
|
-
options = http_merge_options(options)
|
423
|
-
print_info "HTTP LOCK #{http_options_to_s(options)}"
|
424
|
-
|
425
|
-
return super(options,&block)
|
426
|
-
end
|
427
|
-
|
428
|
-
#
|
429
|
-
# Performs an HTTP Mkcol request.
|
430
|
-
#
|
431
|
-
# @yield [response]
|
432
|
-
# If a block is given, it will be passed the response received
|
433
|
-
# from the request.
|
434
|
-
#
|
435
|
-
# @yieldparam [Net::HTTP::Response] response
|
436
|
-
# The HTTP response object.
|
437
|
-
#
|
438
|
-
# @return [Net::HTTP::Response]
|
439
|
-
# The response of the HTTP request.
|
440
|
-
#
|
441
|
-
# @see Network::HTTP#http_mkcol
|
442
|
-
#
|
443
|
-
# @api public
|
444
|
-
#
|
445
|
-
def http_mkcol(options={},&block)
|
446
|
-
options = http_merge_options(options)
|
447
|
-
print_info "HTTP MKCOL #{http_options_to_s(options)}"
|
448
|
-
|
449
|
-
return super(options,&block)
|
450
|
-
end
|
451
|
-
|
452
|
-
#
|
453
|
-
# Performs an HTTP Move request.
|
454
|
-
#
|
455
|
-
# @yield [response]
|
456
|
-
# If a block is given, it will be passed the response received
|
457
|
-
# from the request.
|
458
|
-
#
|
459
|
-
# @yieldparam [Net::HTTP::Response] response
|
460
|
-
# The HTTP response object.
|
461
|
-
#
|
462
|
-
# @return [Net::HTTP::Response]
|
463
|
-
# The response of the HTTP request.
|
464
|
-
#
|
465
|
-
# @see Network::HTTP#http_move
|
466
|
-
#
|
467
|
-
# @api public
|
468
|
-
#
|
469
|
-
def http_move(options={},&block)
|
470
|
-
options = http_merge_options(options)
|
471
|
-
print_info "HTTP MOVE #{http_options_to_s(options)}"
|
472
|
-
|
473
|
-
return super(options,&block)
|
474
|
-
end
|
475
|
-
|
476
|
-
#
|
477
|
-
# Performs an HTTP Options request.
|
478
|
-
#
|
479
|
-
# @yield [response]
|
480
|
-
# If a block is given, it will be passed the response received
|
481
|
-
# from the request.
|
482
|
-
#
|
483
|
-
# @yieldparam [Net::HTTP::Response] response
|
484
|
-
# The HTTP response object.
|
485
|
-
#
|
486
|
-
# @return [Net::HTTP::Response]
|
487
|
-
# The response of the HTTP request.
|
488
|
-
#
|
489
|
-
# @see Network::HTTP#http_options
|
490
|
-
#
|
491
|
-
# @api public
|
492
|
-
#
|
493
|
-
def http_options(options={},&block)
|
494
|
-
options = http_merge_options(options)
|
495
|
-
print_info "HTTP OPTIONS #{http_options_to_s(options)}"
|
496
|
-
|
497
|
-
return super(options,&block)
|
498
|
-
end
|
499
|
-
|
500
|
-
#
|
501
|
-
# Performs an HTTP Post request.
|
502
|
-
#
|
503
|
-
# @param [Hash] options
|
504
|
-
# Additional options.
|
505
|
-
#
|
506
|
-
# @option options [String] :post_data
|
507
|
-
# The `POSTDATA` to send with the HTTP Post request.
|
508
|
-
#
|
509
|
-
# @yield [response]
|
510
|
-
# If a block is given, it will be passed the response received
|
511
|
-
# from the request.
|
512
|
-
#
|
513
|
-
# @yieldparam [Net::HTTP::Response] response
|
514
|
-
# The HTTP response object.
|
515
|
-
#
|
516
|
-
# @return [Net::HTTP::Response]
|
517
|
-
# The response of the HTTP request.
|
518
|
-
#
|
519
|
-
# @see Network::HTTP#http_post
|
520
|
-
#
|
521
|
-
# @api public
|
522
|
-
#
|
523
|
-
def http_post(options={},&block)
|
524
|
-
options = http_merge_options(options)
|
525
|
-
print_info "HTTP POST #{http_options_to_s(options)}"
|
526
|
-
|
527
|
-
return super(options,&block)
|
528
|
-
end
|
529
|
-
|
530
|
-
#
|
531
|
-
# Performs an HTTP Post request.
|
532
|
-
#
|
533
|
-
# @yield [response]
|
534
|
-
# If a block is given, it will be passed the response received
|
535
|
-
# from the request.
|
536
|
-
#
|
537
|
-
# @yieldparam [Net::HTTP::Response] response
|
538
|
-
# The HTTP response object.
|
539
|
-
#
|
540
|
-
# @return [String]
|
541
|
-
# The body of the Post request.
|
542
|
-
#
|
543
|
-
# @see Network::HTTP#http_post_body
|
544
|
-
#
|
545
|
-
# @api public
|
546
|
-
#
|
547
|
-
def http_post_body(options={},&block)
|
548
|
-
options = http_merge_options(options)
|
549
|
-
print_info "HTTP POST #{http_options_to_s(options)}"
|
550
|
-
|
551
|
-
return super(options,&block)
|
552
|
-
end
|
553
|
-
|
554
|
-
#
|
555
|
-
# Performs an HTTP PUT request.
|
556
|
-
#
|
557
|
-
# @param [Hash] options
|
558
|
-
# Additional options.
|
559
|
-
#
|
560
|
-
# @option options [String] :body
|
561
|
-
# The body for the request.
|
562
|
-
#
|
563
|
-
# @option options [String] :post_data
|
564
|
-
# The `POSTDATA` to send with the HTTP PUT request.
|
565
|
-
#
|
566
|
-
# @yield [response]
|
567
|
-
# If a block is given, it will be passed the response received
|
568
|
-
# from the request.
|
569
|
-
#
|
570
|
-
# @yieldparam [Net::HTTP::Response] response
|
571
|
-
# The HTTP response object.
|
572
|
-
#
|
573
|
-
# @return [Net::HTTP::Response]
|
574
|
-
# The response of the HTTP request.
|
575
|
-
#
|
576
|
-
# @see Network::HTTP#http_put
|
577
|
-
#
|
578
|
-
# @since 0.4.0
|
579
|
-
#
|
580
|
-
# @api public
|
581
|
-
#
|
582
|
-
def http_put(options={},&block)
|
583
|
-
options = http_merge_options(options)
|
584
|
-
print_info "HTTP PUT #{http_options_to_s(options)}"
|
585
|
-
|
586
|
-
return super(options,&block)
|
587
|
-
end
|
588
|
-
|
589
|
-
#
|
590
|
-
# Performs an HTTP Propfind request.
|
591
|
-
#
|
592
|
-
# @yield [response]
|
593
|
-
# If a block is given, it will be passed the response received
|
594
|
-
# from the request.
|
595
|
-
#
|
596
|
-
# @yieldparam [Net::HTTP::Response] response
|
597
|
-
# The HTTP response object.
|
598
|
-
#
|
599
|
-
# @return [Net::HTTP::Response]
|
600
|
-
# The response of the HTTP request.
|
601
|
-
#
|
602
|
-
# @see Network::HTTP#http_prop_find
|
603
|
-
#
|
604
|
-
# @api public
|
605
|
-
#
|
606
|
-
def http_prop_find(options={},&block)
|
607
|
-
options = http_merge_options(options)
|
608
|
-
print_info "HTTP PROPFIND #{http_options_to_s(options)}"
|
609
|
-
|
610
|
-
return super(options,&block)
|
611
|
-
end
|
612
|
-
|
613
|
-
#
|
614
|
-
# Performs an HTTP Proppatch request.
|
615
|
-
#
|
616
|
-
# @yield [response]
|
617
|
-
# If a block is given, it will be passed the response received
|
618
|
-
# from the request.
|
619
|
-
#
|
620
|
-
# @yieldparam [Net::HTTP::Response] response
|
621
|
-
# The HTTP response object.
|
622
|
-
#
|
623
|
-
# @return [Net::HTTP::Response]
|
624
|
-
# The response of the HTTP request.
|
625
|
-
#
|
626
|
-
# @see Network::HTTP#http_prop_patch
|
627
|
-
#
|
628
|
-
# @api public
|
629
|
-
#
|
630
|
-
def http_prop_patch(options={},&block)
|
631
|
-
options = http_merge_options(options)
|
632
|
-
print_info "HTTP PROPPATCH #{http_options_to_s(options)}"
|
633
|
-
|
634
|
-
return super(options,&block)
|
635
|
-
end
|
636
|
-
|
637
|
-
#
|
638
|
-
# Performs an HTTP Trace request.
|
639
|
-
#
|
640
|
-
# @yield [response]
|
641
|
-
# If a block is given, it will be passed the response received
|
642
|
-
# from the request.
|
643
|
-
#
|
644
|
-
# @yieldparam [Net::HTTP::Response] response
|
645
|
-
# The HTTP response object.
|
646
|
-
#
|
647
|
-
# @return [Net::HTTP::Response]
|
648
|
-
# The response of the HTTP request.
|
649
|
-
#
|
650
|
-
# @see Network::HTTP#http_trace
|
651
|
-
#
|
652
|
-
# @api public
|
653
|
-
#
|
654
|
-
def http_trace(options={},&block)
|
655
|
-
options = http_merge_options(options)
|
656
|
-
print_info "HTTP TRACE #{http_options_to_s(options)}"
|
657
|
-
|
658
|
-
return super(options,&block)
|
659
|
-
end
|
660
|
-
|
661
|
-
#
|
662
|
-
# Performs an HTTP Unlock request.
|
663
|
-
#
|
664
|
-
# @yield [response]
|
665
|
-
# If a block is given, it will be passed the response received
|
666
|
-
# from the request.
|
667
|
-
#
|
668
|
-
# @yieldparam [Net::HTTP::Response] response
|
669
|
-
# The HTTP response object.
|
670
|
-
#
|
671
|
-
# @return [Net::HTTP::Response]
|
672
|
-
# The response of the HTTP request.
|
673
|
-
#
|
674
|
-
# @see Network::HTTP#http_unlock
|
675
|
-
#
|
676
|
-
# @api public
|
677
|
-
#
|
678
|
-
def http_unlock(options={},&block)
|
679
|
-
options = http_merge_options(options)
|
680
|
-
print_info "HTTP UNLOCK #{http_options_to_s(options)}"
|
681
|
-
|
682
|
-
return super(options,&block)
|
186
|
+
return response
|
683
187
|
end
|
684
188
|
|
685
189
|
private
|
@@ -698,58 +202,25 @@ module Ronin
|
|
698
202
|
# @api private
|
699
203
|
#
|
700
204
|
def http_merge_options(options={})
|
701
|
-
options
|
702
|
-
|
205
|
+
options = options.dup
|
206
|
+
|
207
|
+
options[:proxy] ||= self.http_proxy if self.http_proxy
|
208
|
+
options[:host] ||= self.host if self.host
|
209
|
+
options[:port] ||= self.port if self.port
|
703
210
|
|
704
211
|
if (self.http_vhost || self.http_user_agent)
|
705
|
-
headers = options
|
212
|
+
headers = (options[:headers] ||= {})
|
706
213
|
|
707
|
-
headers[:host]
|
214
|
+
headers[:host] ||= self.http_vhost if self.http_vhost
|
708
215
|
headers[:user_agent] ||= self.http_user_agent if self.http_user_agent
|
709
|
-
|
710
|
-
options[:headers] = headers
|
711
216
|
end
|
712
217
|
|
713
|
-
options[:user]
|
218
|
+
options[:user] ||= self.http_user if self.http_user
|
714
219
|
options[:password] ||= self.http_password if self.http_password
|
715
220
|
|
716
|
-
options[:proxy] ||= self.http_proxy if self.http_proxy
|
717
|
-
|
718
221
|
return options
|
719
222
|
end
|
720
223
|
|
721
|
-
#
|
722
|
-
# Converts the HTTP options to a printable String.
|
723
|
-
#
|
724
|
-
# @param [Hash] options
|
725
|
-
# HTTP options.
|
726
|
-
#
|
727
|
-
# @return [String]
|
728
|
-
# The printable String.
|
729
|
-
#
|
730
|
-
# @since 1.1.0
|
731
|
-
#
|
732
|
-
# @api private
|
733
|
-
#
|
734
|
-
def http_options_to_s(options)
|
735
|
-
fields = ["#{options[:host]}:#{options[:port]}"]
|
736
|
-
|
737
|
-
if (options[:user] || options[:password])
|
738
|
-
fields << "#{options[:user]}:#{options[:password]}"
|
739
|
-
end
|
740
|
-
|
741
|
-
path = options[:path]
|
742
|
-
path += "?#{options[:query]}" if options[:query]
|
743
|
-
|
744
|
-
fields << path
|
745
|
-
|
746
|
-
if options[:headers]
|
747
|
-
fields << ("%p" % options[:headers])
|
748
|
-
end
|
749
|
-
|
750
|
-
return fields.join(' ')
|
751
|
-
end
|
752
|
-
|
753
224
|
end
|
754
225
|
end
|
755
226
|
end
|