ronin-support 0.2.0 → 0.3.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.
Files changed (62) hide show
  1. data/.gitignore +11 -0
  2. data/ChangeLog.md +42 -1
  3. data/README.md +4 -1
  4. data/gemspec.yml +2 -1
  5. data/lib/ronin/extensions.rb +2 -0
  6. data/lib/ronin/extensions/enumerable.rb +54 -0
  7. data/lib/ronin/extensions/file.rb +70 -2
  8. data/lib/ronin/extensions/ip_addr.rb +45 -45
  9. data/lib/ronin/extensions/regexp.rb +45 -0
  10. data/lib/ronin/extensions/resolv.rb +80 -0
  11. data/lib/ronin/extensions/string.rb +35 -32
  12. data/lib/ronin/formatting/extensions/binary/integer.rb +12 -5
  13. data/lib/ronin/formatting/extensions/binary/string.rb +44 -16
  14. data/lib/ronin/formatting/extensions/html/integer.rb +51 -31
  15. data/lib/ronin/formatting/extensions/html/string.rb +50 -31
  16. data/lib/ronin/formatting/extensions/http/integer.rb +10 -2
  17. data/lib/ronin/formatting/extensions/sql.rb +20 -0
  18. data/lib/ronin/formatting/extensions/sql/string.rb +98 -0
  19. data/lib/ronin/formatting/extensions/text/array.rb +11 -9
  20. data/lib/ronin/formatting/extensions/text/string.rb +213 -29
  21. data/lib/ronin/formatting/sql.rb +20 -0
  22. data/lib/ronin/network/extensions/http.rb +1 -0
  23. data/lib/ronin/network/extensions/http/net.rb +2 -2
  24. data/lib/ronin/network/extensions/http/uri/http.rb +226 -0
  25. data/lib/ronin/network/extensions/imap/net.rb +1 -1
  26. data/lib/ronin/network/extensions/ssl/net.rb +7 -1
  27. data/lib/ronin/network/http/proxy.rb +20 -21
  28. data/lib/ronin/network/mixins.rb +27 -0
  29. data/lib/ronin/network/mixins/esmtp.rb +165 -0
  30. data/lib/ronin/network/mixins/http.rb +723 -0
  31. data/lib/ronin/network/mixins/imap.rb +151 -0
  32. data/lib/ronin/network/mixins/pop3.rb +141 -0
  33. data/lib/ronin/network/mixins/smtp.rb +159 -0
  34. data/lib/ronin/network/mixins/tcp.rb +331 -0
  35. data/lib/ronin/network/mixins/telnet.rb +199 -0
  36. data/lib/ronin/network/mixins/udp.rb +227 -0
  37. data/lib/ronin/network/ssl.rb +17 -11
  38. data/lib/ronin/path.rb +3 -3
  39. data/lib/ronin/spec/ui/output.rb +28 -0
  40. data/lib/ronin/support.rb +3 -0
  41. data/lib/ronin/support/version.rb +1 -1
  42. data/lib/ronin/ui/output.rb +21 -0
  43. data/lib/ronin/ui/output/helpers.rb +248 -0
  44. data/lib/ronin/ui/output/output.rb +146 -0
  45. data/lib/ronin/ui/output/terminal.rb +21 -0
  46. data/lib/ronin/ui/output/terminal/color.rb +118 -0
  47. data/lib/ronin/ui/output/terminal/raw.rb +103 -0
  48. data/lib/ronin/ui/shell.rb +219 -0
  49. data/ronin-support.gemspec +1 -1
  50. data/spec/extensions/enumerable_spec.rb +24 -0
  51. data/spec/extensions/file_spec.rb +39 -0
  52. data/spec/extensions/ip_addr_spec.rb +6 -0
  53. data/spec/extensions/resolv_spec.rb +18 -0
  54. data/spec/formatting/html/integer_spec.rb +2 -2
  55. data/spec/formatting/html/string_spec.rb +1 -1
  56. data/spec/formatting/sql/string_spec.rb +55 -0
  57. data/spec/formatting/text/string_spec.rb +110 -0
  58. data/spec/network/ssl_spec.rb +10 -4
  59. data/spec/ui/classes/test_shell.rb +22 -0
  60. data/spec/ui/output_spec.rb +32 -0
  61. data/spec/ui/shell_spec.rb +79 -0
  62. metadata +132 -90
@@ -0,0 +1,723 @@
1
+ #
2
+ # Copyright (c) 2006-2011 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 'ronin/network/http'
21
+ require 'ronin/ui/output/helpers'
22
+ require 'ronin/mixin'
23
+
24
+ require 'parameters'
25
+
26
+ module Ronin
27
+ module Network
28
+ module Mixins
29
+ #
30
+ # Adds HTTP convenience methods and connection parameters to a class.
31
+ #
32
+ # Defines the following parameters:
33
+ #
34
+ # * `host` (`String`) - HTTP host.
35
+ # * `port` (`Integer`) - HTTP port. Defaults to `Net::HTTP.default_port`.
36
+ # * `http_vhost` (`String`) - HTTP Host header to send.
37
+ # * `http_user` (`String`) - HTTP user to authenticate as.
38
+ # * `http_password` (`String`) - HTTP password to authenticate with.
39
+ # * `http_proxy` - HTTP proxy information.
40
+ # * `http_user_agent` (`String`) - HTTP User-Agent header to send.
41
+ #
42
+ module HTTP
43
+ include Mixin
44
+
45
+ mixin UI::Output::Helpers, Parameters
46
+
47
+ mixin do
48
+ # HTTP host
49
+ parameter :host, :type => String,
50
+ :description => 'HTTP host'
51
+
52
+ # HTTP port
53
+ parameter :port, :default => Net::HTTP.default_port,
54
+ :description => 'HTTP port'
55
+
56
+ # HTTP `Host` header to send
57
+ parameter :http_vhost, :type => String,
58
+ :description => 'HTTP Host header to send'
59
+
60
+ # HTTP user to authenticate as
61
+ parameter :http_user, :type => String,
62
+ :description => 'HTTP user to authenticate as'
63
+
64
+ # HTTP password to authenticate with
65
+ parameter :http_password, :type => String,
66
+ :description => 'HTTP password to authenticate with'
67
+
68
+ # HTTP proxy information
69
+ parameter :http_proxy, :description => 'HTTP proxy information'
70
+
71
+ # HTTP `User-Agent` header to send
72
+ parameter :http_user_agent, :type => String,
73
+ :description => 'HTTP User-Agent header to send'
74
+ end
75
+
76
+ protected
77
+
78
+ #
79
+ # Resets the HTTP proxy settings.
80
+ #
81
+ # @api public
82
+ #
83
+ def disable_http_proxy
84
+ @http_proxy = nil
85
+ end
86
+
87
+ #
88
+ # Connects to the HTTP server.
89
+ #
90
+ # @param [Hash] options
91
+ # Additional options
92
+ #
93
+ # @option options [String, URI::HTTP] :url
94
+ # The full URL to request.
95
+ #
96
+ # @option options [String] :user
97
+ # The user to authenticate with when connecting to the HTTP
98
+ # server.
99
+ #
100
+ # @option options [String] :password
101
+ # The password to authenticate with when connecting to the HTTP
102
+ # server.
103
+ #
104
+ # @option options [String] :host
105
+ # The host the HTTP server is running on.
106
+ #
107
+ # @option options [Integer] :port (Net::HTTP.default_port)
108
+ # The port the HTTP server is listening on.
109
+ #
110
+ # @option options [String] :path
111
+ # The path to request from the HTTP server.
112
+ #
113
+ # @yield [session]
114
+ # If a block is given, it will be passes the new HTTP session
115
+ # object.
116
+ #
117
+ # @yieldparam [Net::HTTP] session
118
+ # The newly created HTTP session.
119
+ #
120
+ # @return [Net::HTTP]
121
+ # The HTTP session object.
122
+ #
123
+ # @api public
124
+ #
125
+ def http_session(options={})
126
+ options = http_merge_options(options)
127
+ host_port = "#{options[:host]}:#{options[:port]}"
128
+
129
+ Net.http_session(options) do |http|
130
+ print_info "Starting HTTP Session with #{host_port}"
131
+
132
+ yield http
133
+
134
+ print_info "Closing HTTP Session with #{host_port}"
135
+ end
136
+ end
137
+
138
+ #
139
+ # Connects to the HTTP server and sends an HTTP Request.
140
+ #
141
+ # @param [Hash] options
142
+ # Additional options.
143
+ #
144
+ # @option options [Hash{String,Symbol => Object}] :headers
145
+ # The Hash of the HTTP headers to send with the request.
146
+ # May contain either Strings or Symbols, lower-case or
147
+ # camel-case keys.
148
+ #
149
+ # @yield [request, (options)]
150
+ # If a block is given, it will be passed the HTTP request object.
151
+ # If the block has an arity of 2, it will also be passed the
152
+ # expanded version of the given options.
153
+ #
154
+ # @yieldparam [Net::HTTP::Request] request
155
+ # The HTTP request object to use in the request.
156
+ #
157
+ # @yieldparam [Hash] options
158
+ # The expanded version of the given options.
159
+ #
160
+ # @return [Net::HTTP::Response]
161
+ # The response of the HTTP request.
162
+ #
163
+ # @see #http_session
164
+ #
165
+ # @api public
166
+ #
167
+ def http_request(options={},&block)
168
+ options = http_merge_options(options)
169
+ print_info "HTTP #{options[:method]} #{http_options_to_s(options)}"
170
+
171
+ return Net.http_request(options,&block)
172
+ end
173
+
174
+ #
175
+ # Returns the Status Code of the Response.
176
+ #
177
+ # @param [Hash] options
178
+ # Additional options.
179
+ #
180
+ # @option options [Symbol, String] :method (:head)
181
+ # The method to use for the request.
182
+ #
183
+ # @return [Integer]
184
+ # The HTTP Response Status.
185
+ #
186
+ # @see #http_request
187
+ #
188
+ # @since 1.1.0
189
+ #
190
+ # @api public
191
+ #
192
+ def http_status(options={})
193
+ options = http_merge_options(options)
194
+
195
+ if (result = Net.http_status(options))
196
+ print_debug "HTTP #{result} #{http_options_to_s(options)}"
197
+ end
198
+
199
+ return result
200
+ end
201
+
202
+ #
203
+ # Checks if the response has an HTTP OK status code.
204
+ #
205
+ # @param [Hash] options
206
+ # Additional options.
207
+ #
208
+ # @option options [Symbol, String] :method (:head)
209
+ # The method to use for the request.
210
+ #
211
+ # @return [Boolean]
212
+ # Specifies whether the response had an HTTP OK status code or not.
213
+ #
214
+ # @see #http_status
215
+ #
216
+ # @since 1.1.0
217
+ #
218
+ # @api public
219
+ #
220
+ def http_ok?(options={})
221
+ options = http_merge_options(options)
222
+
223
+ if (result = Net.http_ok?(options))
224
+ print_debug "HTTP 200 OK #{http_options_to_s(options)}"
225
+ end
226
+
227
+ return result
228
+ end
229
+
230
+ #
231
+ # Sends a HTTP Head request and returns the HTTP Server header.
232
+ #
233
+ # @param [Hash] options
234
+ # Additional options.
235
+ #
236
+ # @option options [Symbol, String] :method (:head)
237
+ # The method to use for the request.
238
+ #
239
+ # @return [String]
240
+ # The HTTP `Server` header.
241
+ #
242
+ # @see #http_request
243
+ #
244
+ # @since 1.1.0
245
+ #
246
+ # @api public
247
+ #
248
+ def http_server(options={})
249
+ options = http_merge_options(options)
250
+
251
+ if (result = Net.http_server(options))
252
+ print_debug "HTTP Server: #{result}"
253
+ end
254
+
255
+ return result
256
+ end
257
+
258
+ #
259
+ # Sends an HTTP Head request and returns the HTTP X-Powered-By header.
260
+ #
261
+ # @param [Hash] options
262
+ # Additional options.
263
+ #
264
+ # @option options [Symbol, String] :method (:get)
265
+ # The method to use for the request.
266
+ #
267
+ # @return [String]
268
+ # The HTTP `X-Powered-By` header.
269
+ #
270
+ # @see #http_request
271
+ #
272
+ # @since 1.1.0
273
+ #
274
+ # @api public
275
+ #
276
+ def http_powered_by(options={})
277
+ options = http_merge_options(options)
278
+
279
+ if (result = Net.http_powered_by(options))
280
+ print_debug "HTTP X-Powered-By: #{result}"
281
+ end
282
+
283
+ return result
284
+ end
285
+
286
+ #
287
+ # Performs an HTTP Copy request.
288
+ #
289
+ # @yield [response]
290
+ # If a block is given, it will be passed the response received
291
+ # from the request.
292
+ #
293
+ # @yieldparam [Net::HTTP::Response] response
294
+ # The HTTP response object.
295
+ #
296
+ # @return [Net::HTTP::Response]
297
+ # The response of the HTTP request.
298
+ #
299
+ # @see #http_request
300
+ #
301
+ # @api public
302
+ #
303
+ def http_copy(options={},&block)
304
+ options = http_merge_options(options)
305
+ print_info "HTTP COPY #{http_options_to_s(options)}"
306
+
307
+ return Net.http_copy(options,&block)
308
+ end
309
+
310
+ #
311
+ # Performs an HTTP Delete request.
312
+ #
313
+ # @yield [response]
314
+ # If a block is given, it will be passed the response received
315
+ # from the request.
316
+ #
317
+ # @yieldparam [Net::HTTP::Response] response
318
+ # The HTTP response object.
319
+ #
320
+ # @return [Net::HTTP::Response]
321
+ # The response of the HTTP request.
322
+ #
323
+ # @see #http_request
324
+ #
325
+ # @api public
326
+ #
327
+ def http_delete(options={},&block)
328
+ options = http_merge_options(options)
329
+ print_info "HTTP DELETE #{http_options_to_s(options)}"
330
+
331
+ return Net.http_delete(options,&block)
332
+ end
333
+
334
+ #
335
+ # Performs an HTTP Get request.
336
+ #
337
+ # @yield [response]
338
+ # If a block is given, it will be passed the response received
339
+ # from the request.
340
+ #
341
+ # @yieldparam [Net::HTTP::Response] response
342
+ # The HTTP response object.
343
+ #
344
+ # @return [Net::HTTP::Response]
345
+ # The response of the HTTP request.
346
+ #
347
+ # @see #http_request
348
+ #
349
+ # @api public
350
+ #
351
+ def http_get(options={},&block)
352
+ options = http_merge_options(options)
353
+ print_info "HTTP GET #{http_options_to_s(options)}"
354
+
355
+ return Net.http_get(options,&block)
356
+ end
357
+
358
+ #
359
+ # Performs an HTTP Get request.
360
+ #
361
+ # @yield [response]
362
+ # If a block is given, it will be passed the response received
363
+ # from the request.
364
+ #
365
+ # @yieldparam [Net::HTTP::Response] response
366
+ # The HTTP response object.
367
+ #
368
+ # @return [String]
369
+ # The body of the HTTP Get request.
370
+ #
371
+ # @see #http_get
372
+ #
373
+ # @api public
374
+ #
375
+ def http_get_body(options={},&block)
376
+ options = http_merge_options(options)
377
+ print_info "HTTP GET #{http_options_to_s(options)}"
378
+
379
+ return Net.http_get_body(options,&block)
380
+ end
381
+
382
+ #
383
+ # Performs an HTTP Head request.
384
+ #
385
+ # @yield [response]
386
+ # If a block is given, it will be passed the response received
387
+ # from the request.
388
+ #
389
+ # @yieldparam [Net::HTTP::Response] response
390
+ # The HTTP response object.
391
+ #
392
+ # @return [Net::HTTP::Response]
393
+ # The response of the HTTP request.
394
+ #
395
+ # @see #http_request
396
+ #
397
+ # @api public
398
+ #
399
+ def http_head(options={},&block)
400
+ options = http_merge_options(options)
401
+ print_info "HTTP HEAD #{http_options_to_s(options)}"
402
+
403
+ return Net.http_head(options,&block)
404
+ end
405
+
406
+ #
407
+ # Performs an HTTP Lock request.
408
+ #
409
+ # @yield [response]
410
+ # If a block is given, it will be passed the response received
411
+ # from the request.
412
+ #
413
+ # @yieldparam [Net::HTTP::Response] response
414
+ # The HTTP response object.
415
+ #
416
+ # @return [Net::HTTP::Response]
417
+ # The response of the HTTP request.
418
+ #
419
+ # @see #http_request
420
+ #
421
+ # @api public
422
+ #
423
+ def http_lock(options={},&block)
424
+ options = http_merge_options(options)
425
+ print_info "HTTP LOCK #{http_options_to_s(options)}"
426
+
427
+ return Net.http_lock(options,&block)
428
+ end
429
+
430
+ #
431
+ # Performs an HTTP Mkcol request.
432
+ #
433
+ # @yield [response]
434
+ # If a block is given, it will be passed the response received
435
+ # from the request.
436
+ #
437
+ # @yieldparam [Net::HTTP::Response] response
438
+ # The HTTP response object.
439
+ #
440
+ # @return [Net::HTTP::Response]
441
+ # The response of the HTTP request.
442
+ #
443
+ # @see #http_request
444
+ #
445
+ # @api public
446
+ #
447
+ def http_mkcol(options={},&block)
448
+ options = http_merge_options(options)
449
+ print_info "HTTP MKCOL #{http_options_to_s(options)}"
450
+
451
+ return Net.http_mkcol(options,&block)
452
+ end
453
+
454
+ #
455
+ # Performs an HTTP Move request.
456
+ #
457
+ # @yield [response]
458
+ # If a block is given, it will be passed the response received
459
+ # from the request.
460
+ #
461
+ # @yieldparam [Net::HTTP::Response] response
462
+ # The HTTP response object.
463
+ #
464
+ # @return [Net::HTTP::Response]
465
+ # The response of the HTTP request.
466
+ #
467
+ # @see #http_request
468
+ #
469
+ # @api public
470
+ #
471
+ def http_move(options={},&block)
472
+ options = http_merge_options(options)
473
+ print_info "HTTP MOVE #{http_options_to_s(options)}"
474
+
475
+ return Net.http_move(options,&block)
476
+ end
477
+
478
+ #
479
+ # Performs an HTTP Options request.
480
+ #
481
+ # @yield [response]
482
+ # If a block is given, it will be passed the response received
483
+ # from the request.
484
+ #
485
+ # @yieldparam [Net::HTTP::Response] response
486
+ # The HTTP response object.
487
+ #
488
+ # @return [Net::HTTP::Response]
489
+ # The response of the HTTP request.
490
+ #
491
+ # @see #http_request
492
+ #
493
+ # @api public
494
+ #
495
+ def http_options(options={},&block)
496
+ options = http_merge_options(options)
497
+ print_info "HTTP OPTIONS #{http_options_to_s(options)}"
498
+
499
+ return Net.http_options(options,&block)
500
+ end
501
+
502
+ #
503
+ # Performs an HTTP Post request.
504
+ #
505
+ # @param [Hash] options
506
+ # Additional options.
507
+ #
508
+ # @option options [String] :post_data
509
+ # The `POSTDATA` to send with the HTTP Post request.
510
+ #
511
+ # @yield [response]
512
+ # If a block is given, it will be passed the response received
513
+ # from the request.
514
+ #
515
+ # @yieldparam [Net::HTTP::Response] response
516
+ # The HTTP response object.
517
+ #
518
+ # @return [Net::HTTP::Response]
519
+ # The response of the HTTP request.
520
+ #
521
+ # @see #http_request
522
+ #
523
+ # @api public
524
+ #
525
+ def http_post(options={},&block)
526
+ options = http_merge_options(options)
527
+ print_info "HTTP POST #{http_options_to_s(options)}"
528
+
529
+ return Net.http_post(options,&block)
530
+ end
531
+
532
+ #
533
+ # Performs an HTTP Post request.
534
+ #
535
+ # @yield [response]
536
+ # If a block is given, it will be passed the response received
537
+ # from the request.
538
+ #
539
+ # @yieldparam [Net::HTTP::Response] response
540
+ # The HTTP response object.
541
+ #
542
+ # @return [String]
543
+ # The body of the Post request.
544
+ #
545
+ # @see #http_post
546
+ #
547
+ # @api public
548
+ #
549
+ def http_post_body(options={},&block)
550
+ options = http_merge_options(options)
551
+ print_info "HTTP POST #{http_options_to_s(options)}"
552
+
553
+ return Net.http_post_body(options,&block)
554
+ end
555
+
556
+ #
557
+ # Performs an HTTP Propfind request.
558
+ #
559
+ # @yield [response]
560
+ # If a block is given, it will be passed the response received
561
+ # from the request.
562
+ #
563
+ # @yieldparam [Net::HTTP::Response] response
564
+ # The HTTP response object.
565
+ #
566
+ # @return [Net::HTTP::Response]
567
+ # The response of the HTTP request.
568
+ #
569
+ # @see #http_request
570
+ #
571
+ # @api public
572
+ #
573
+ def http_prop_find(options={},&block)
574
+ options = http_merge_options(options)
575
+ print_info "HTTP PROPFIND #{http_options_to_s(options)}"
576
+
577
+ return Net.http_prop_find(options,&block)
578
+ end
579
+
580
+ #
581
+ # Performs an HTTP Proppatch request.
582
+ #
583
+ # @yield [response]
584
+ # If a block is given, it will be passed the response received
585
+ # from the request.
586
+ #
587
+ # @yieldparam [Net::HTTP::Response] response
588
+ # The HTTP response object.
589
+ #
590
+ # @return [Net::HTTP::Response]
591
+ # The response of the HTTP request.
592
+ #
593
+ # @see #http_request
594
+ #
595
+ # @api public
596
+ #
597
+ def http_prop_patch(options={},&block)
598
+ options = http_merge_options(options)
599
+ print_info "HTTP PROPPATCH #{http_options_to_s(options)}"
600
+
601
+ return Net.http_prop_patch(options,&block)
602
+ end
603
+
604
+ #
605
+ # Performs an HTTP Trace request.
606
+ #
607
+ # @yield [response]
608
+ # If a block is given, it will be passed the response received
609
+ # from the request.
610
+ #
611
+ # @yieldparam [Net::HTTP::Response] response
612
+ # The HTTP response object.
613
+ #
614
+ # @return [Net::HTTP::Response]
615
+ # The response of the HTTP request.
616
+ #
617
+ # @see #http_request
618
+ #
619
+ # @api public
620
+ #
621
+ def http_trace(options={},&block)
622
+ options = http_merge_options(options)
623
+ print_info "HTTP TRACE #{http_options_to_s(options)}"
624
+
625
+ return Net.http_trace(options,&block)
626
+ end
627
+
628
+ #
629
+ # Performs an HTTP Unlock request.
630
+ #
631
+ # @yield [response]
632
+ # If a block is given, it will be passed the response received
633
+ # from the request.
634
+ #
635
+ # @yieldparam [Net::HTTP::Response] response
636
+ # The HTTP response object.
637
+ #
638
+ # @return [Net::HTTP::Response]
639
+ # The response of the HTTP request.
640
+ #
641
+ # @see #http_request
642
+ #
643
+ # @api public
644
+ #
645
+ def http_unlock(options={},&block)
646
+ options = http_merge_options(options)
647
+ print_info "HTTP UNLOCK #{http_options_to_s(options)}"
648
+
649
+ return Net.http_unlock(options,&block)
650
+ end
651
+
652
+ private
653
+
654
+ #
655
+ # Merges the HTTP parameters into the HTTP options.
656
+ #
657
+ # @param [Hash] options
658
+ # The HTTP options to merge into.
659
+ #
660
+ # @return [Hash]
661
+ # The merged HTTP options.
662
+ #
663
+ # @since 1.0.0
664
+ #
665
+ # @api private
666
+ #
667
+ def http_merge_options(options={})
668
+ options[:host] ||= self.host if self.host
669
+ options[:port] ||= self.port if self.port
670
+
671
+ if (self.http_vhost || self.http_user_agent)
672
+ headers = options.fetch(:headers,{})
673
+
674
+ headers[:host] ||= self.http_vhost if self.http_vhost
675
+ headers[:user_agent] ||= self.http_user_agent if self.http_user_agent
676
+
677
+ options[:headers] = headers
678
+ end
679
+
680
+ options[:user] ||= self.http_user if self.http_user
681
+ options[:password] ||= self.http_password if self.http_password
682
+
683
+ options[:proxy] ||= self.http_proxy if self.http_proxy
684
+
685
+ return options
686
+ end
687
+
688
+ #
689
+ # Converts the HTTP options to a printable String.
690
+ #
691
+ # @param [Hash] options
692
+ # HTTP options.
693
+ #
694
+ # @return [String]
695
+ # The printable String.
696
+ #
697
+ # @since 1.1.0
698
+ #
699
+ # @api private
700
+ #
701
+ def http_options_to_s(options)
702
+ fields = ["#{options[:host]}:#{options[:port]}"]
703
+
704
+ if (options[:user] || options[:password])
705
+ fields << "#{options[:user]}:#{options[:password]}"
706
+ end
707
+
708
+ path = options[:path]
709
+ path += "?#{options[:query]}" if options[:query]
710
+
711
+ fields << path
712
+
713
+ if options[:headers]
714
+ fields << ("%p" % options[:headers])
715
+ end
716
+
717
+ return fields.join(' ')
718
+ end
719
+
720
+ end
721
+ end
722
+ end
723
+ end