ronin-support 0.3.0 → 0.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/ChangeLog.md +77 -7
  2. data/README.md +19 -3
  3. data/gemspec.yml +2 -2
  4. data/lib/ronin/extensions/regexp.rb +50 -2
  5. data/lib/ronin/extensions/string.rb +1 -0
  6. data/lib/ronin/formatting.rb +1 -0
  7. data/lib/ronin/formatting/extensions.rb +1 -0
  8. data/lib/ronin/formatting/extensions/binary/string.rb +56 -5
  9. data/lib/ronin/formatting/extensions/html/string.rb +6 -7
  10. data/lib/ronin/formatting/extensions/sql/string.rb +34 -0
  11. data/lib/ronin/formatting/extensions/text/string.rb +0 -180
  12. data/lib/ronin/fuzzing.rb +21 -0
  13. data/lib/ronin/fuzzing/extensions.rb +20 -0
  14. data/lib/ronin/fuzzing/extensions/string.rb +380 -0
  15. data/lib/ronin/fuzzing/fuzzing.rb +191 -0
  16. data/lib/ronin/network/esmtp.rb +94 -1
  17. data/lib/ronin/network/extensions/esmtp/net.rb +2 -82
  18. data/lib/ronin/network/extensions/http/net.rb +1 -736
  19. data/lib/ronin/network/extensions/imap/net.rb +1 -103
  20. data/lib/ronin/network/extensions/pop3/net.rb +1 -71
  21. data/lib/ronin/network/extensions/smtp/net.rb +2 -157
  22. data/lib/ronin/network/extensions/ssl/net.rb +1 -132
  23. data/lib/ronin/network/extensions/tcp/net.rb +2 -296
  24. data/lib/ronin/network/extensions/telnet/net.rb +1 -135
  25. data/lib/ronin/network/extensions/udp/net.rb +2 -214
  26. data/lib/ronin/network/http/http.rb +750 -5
  27. data/lib/ronin/network/imap.rb +105 -2
  28. data/lib/ronin/network/mixins.rb +1 -1
  29. data/lib/ronin/network/mixins/esmtp.rb +49 -52
  30. data/lib/ronin/network/mixins/http.rb +49 -53
  31. data/lib/ronin/network/mixins/imap.rb +47 -44
  32. data/lib/ronin/network/mixins/mixin.rb +58 -0
  33. data/lib/ronin/network/mixins/pop3.rb +44 -38
  34. data/lib/ronin/network/mixins/smtp.rb +49 -51
  35. data/lib/ronin/network/mixins/tcp.rb +56 -69
  36. data/lib/ronin/network/mixins/telnet.rb +57 -50
  37. data/lib/ronin/network/mixins/udp.rb +48 -52
  38. data/lib/ronin/network/network.rb +1 -0
  39. data/lib/ronin/network/pop3.rb +72 -2
  40. data/lib/ronin/network/smtp/email.rb +1 -0
  41. data/lib/ronin/network/smtp/smtp.rb +159 -3
  42. data/lib/ronin/network/ssl.rb +131 -2
  43. data/lib/ronin/network/tcp.rb +306 -1
  44. data/lib/ronin/network/telnet.rb +136 -2
  45. data/lib/ronin/network/udp.rb +229 -1
  46. data/lib/ronin/support.rb +2 -3
  47. data/lib/ronin/support/support.rb +38 -0
  48. data/lib/ronin/support/version.rb +1 -1
  49. data/lib/ronin/templates/erb.rb +2 -1
  50. data/lib/ronin/ui/output/helpers.rb +35 -1
  51. data/lib/ronin/ui/shell.rb +12 -2
  52. data/lib/ronin/wordlist.rb +157 -0
  53. data/spec/extensions/regexp_spec.rb +38 -0
  54. data/spec/formatting/html/string_spec.rb +1 -1
  55. data/spec/formatting/sql/string_spec.rb +23 -3
  56. data/spec/formatting/text/string_spec.rb +0 -110
  57. data/spec/fuzzing/string_spec.rb +158 -0
  58. data/spec/wordlist_spec.rb +65 -0
  59. metadata +35 -27
@@ -19,21 +19,32 @@
19
19
 
20
20
  require 'ronin/network/http/exceptions/unknown_request'
21
21
  require 'ronin/network/http/proxy'
22
- require 'ronin/network/extensions/http'
22
+ require 'ronin/network/ssl'
23
+
24
+ require 'uri/query_params'
25
+ require 'net/http'
26
+
27
+ begin
28
+ require 'net/https'
29
+ rescue ::LoadError
30
+ end
23
31
 
24
32
  module Ronin
25
33
  module Network
26
34
  #
27
- # Settings and helper methods for HTTP.
35
+ # Provides helper methods for communicating with HTTP Servers.
28
36
  #
29
37
  module HTTP
30
38
  #
31
- # The Ronin HTTP proxy to use. Parses the value of the `HTTP_PROXY`
32
- # environment variable if set.
39
+ # The Ronin HTTP proxy to use.
33
40
  #
34
41
  # @return [Proxy]
35
42
  # The Ronin HTTP proxy.
36
43
  #
44
+ # @note
45
+ # If the `HTTP_PROXY` environment variable is specified, it will
46
+ # be used as the default value.
47
+ #
37
48
  # @see Proxy.new
38
49
  # @see Proxy.parse
39
50
  #
@@ -155,7 +166,7 @@ module Ronin
155
166
  # @option options [String] :path ('/')
156
167
  # The path to request.
157
168
  #
158
- # @option options [String, Hash] :proxy (Ronin::Network::HTTP.proxy)
169
+ # @option options [String, Hash] :proxy (HTTP.proxy)
159
170
  # The Proxy information.
160
171
  #
161
172
  # @return [Hash]
@@ -310,6 +321,740 @@ module Ronin
310
321
 
311
322
  return request
312
323
  end
324
+
325
+ #
326
+ # Starts a HTTP connection with the server.
327
+ #
328
+ # @param [Hash] options
329
+ # Additional options
330
+ #
331
+ # @option options [String, URI::HTTP] :url
332
+ # The full URL to request.
333
+ #
334
+ # @option options [String] :host
335
+ # The host the HTTP server is running on.
336
+ #
337
+ # @option options [Integer] :port (Net::HTTP.default_port)
338
+ # The port the HTTP server is listening on.
339
+ #
340
+ # @option options [String, Hash] :proxy (HTTP.proxy)
341
+ # A Hash of proxy settings to use when connecting to the HTTP server.
342
+ #
343
+ # @option options [String] :user
344
+ # The user to authenticate with when connecting to the HTTP server.
345
+ #
346
+ # @option options [String] :password
347
+ # The password to authenticate with when connecting to the HTTP server.
348
+ #
349
+ # @option options [Boolean, Hash] :ssl
350
+ # Enables SSL for the HTTP connection.
351
+ #
352
+ # @option :ssl [Symbol] :verify
353
+ # Specifies the SSL certificate verification mode.
354
+ #
355
+ # @yield [session]
356
+ # If a block is given, it will be passed the newly created HTTP
357
+ # session object.
358
+ #
359
+ # @yieldparam [Net::HTTP] session
360
+ # The newly created HTTP session.
361
+ #
362
+ # @return [Net::HTTP]
363
+ # The HTTP session object.
364
+ #
365
+ # @api public
366
+ #
367
+ def http_connect(options={},&block)
368
+ options = HTTP.expand_options(options)
369
+
370
+ host = options[:host].to_s
371
+ port = options[:port]
372
+ proxy = options[:proxy]
373
+ proxy_host = if (proxy && proxy[:host])
374
+ proxy[:host].to_s
375
+ end
376
+
377
+ sess = Net::HTTP::Proxy(
378
+ proxy_host,
379
+ proxy[:port],
380
+ proxy[:user],
381
+ proxy[:password]
382
+ ).new(host.to_s,port)
383
+
384
+ if options[:ssl]
385
+ sess.use_ssl = true
386
+ sess.verify_mode = SSL::VERIFY[options[:ssl][:verify]]
387
+ end
388
+
389
+ sess.start()
390
+
391
+ if block
392
+ if block.arity == 2
393
+ block.call(sess,options)
394
+ else
395
+ block.call(sess)
396
+ end
397
+ end
398
+
399
+ return sess
400
+ end
401
+
402
+ #
403
+ # Creates a new temporary HTTP session with the server.
404
+ #
405
+ # @param [Hash] options
406
+ # Additional options
407
+ #
408
+ # @option options [String, URI::HTTP] :url
409
+ # The full URL to request.
410
+ #
411
+ # @option options [String] :host
412
+ # The host the HTTP server is running on.
413
+ #
414
+ # @option options [Integer] :port (Net::HTTP.default_port)
415
+ # The port the HTTP server is listening on.
416
+ #
417
+ # @option options [String] :user
418
+ # The user to authenticate with when connecting to the HTTP server.
419
+ #
420
+ # @option options [String] :password
421
+ # The password to authenticate with when connecting to the HTTP server.
422
+ #
423
+ # @option options [String, Hash] :proxy (HTTP.proxy)
424
+ # A Hash of proxy settings to use when connecting to the HTTP server.
425
+ #
426
+ # @option options [Boolean, Hash] :ssl
427
+ # Enables SSL for the HTTP connection.
428
+ #
429
+ # @option :ssl [Symbol] :verify
430
+ # Specifies the SSL certificate verification mode.
431
+ #
432
+ # @yield [session]
433
+ # If a block is given, it will be passed the newly created HTTP
434
+ # session object.
435
+ #
436
+ # @yieldparam [Net::HTTP] session
437
+ # The newly created HTTP session.
438
+ #
439
+ # @return [nil]
440
+ #
441
+ # @see http_connect
442
+ #
443
+ # @api public
444
+ #
445
+ def http_session(options={},&block)
446
+ http_connect(options) do |sess,expanded_options|
447
+ if block
448
+ if block.arity == 2
449
+ block.call(sess,expanded_options)
450
+ else
451
+ block.call(sess)
452
+ end
453
+ end
454
+
455
+ sess.finish
456
+ end
457
+
458
+ return nil
459
+ end
460
+
461
+ #
462
+ # Connects to the HTTP server and sends an HTTP Request.
463
+ #
464
+ # @param [Hash] options
465
+ # Additional options.
466
+ #
467
+ # @option options [Symbol, String] :method
468
+ # The HTTP method to use in the request.
469
+ #
470
+ # @option options [String] :path
471
+ # The path to request from the HTTP server.
472
+ #
473
+ # @option options [Hash] :headers
474
+ # The Hash of the HTTP headers to send with the request.
475
+ # May contain either Strings or Symbols, lower-case or camel-case keys.
476
+ #
477
+ # @option options [String] :body
478
+ # The body of the request.
479
+ #
480
+ # @option options [Hash, String] :form_data
481
+ # The form data that may be sent in the body of the request.
482
+ #
483
+ # @yield [request, (options)]
484
+ # If a block is given, it will be passed the HTTP request object.
485
+ # If the block has an arity of 2, it will also be passed the expanded
486
+ # version of the given _options_.
487
+ #
488
+ # @yieldparam [Net::HTTP::Request] request
489
+ # The HTTP request object to use in the request.
490
+ #
491
+ # @yieldparam [Hash] options
492
+ # The expanded version of the given _options_.
493
+ #
494
+ # @return [Net::HTTP::Response]
495
+ # The response of the HTTP request.
496
+ #
497
+ # @see http_session
498
+ #
499
+ # @api public
500
+ #
501
+ def http_request(options={},&block)
502
+ resp = nil
503
+
504
+ http_session(options) do |http,expanded_options|
505
+ req = HTTP.request(expanded_options)
506
+
507
+ if block
508
+ if block.arity == 2
509
+ block.call(req,expanded_options)
510
+ else
511
+ block.call(req)
512
+ end
513
+ end
514
+
515
+ resp = http.request(req)
516
+ end
517
+
518
+ return resp
519
+ end
520
+
521
+ #
522
+ # Returns the Status Code of the Response.
523
+ #
524
+ # @param [Hash] options
525
+ # Additional options.
526
+ #
527
+ # @option options [Symbol, String] :method (:head)
528
+ # The method to use for the request.
529
+ #
530
+ # @return [Integer]
531
+ # The HTTP Response Status.
532
+ #
533
+ # @see http_request
534
+ #
535
+ # @since 0.2.0
536
+ #
537
+ # @api public
538
+ #
539
+ def http_status(options={})
540
+ options = {:method => :head}.merge(options)
541
+
542
+ return http_request(options).code.to_i
543
+ end
544
+
545
+ #
546
+ # Checks if the response has an HTTP OK status code.
547
+ #
548
+ # @param [Hash] options
549
+ # Additional options.
550
+ #
551
+ # @option options [Symbol, String] :method (:head)
552
+ # The method to use for the request.
553
+ #
554
+ # @return [Boolean]
555
+ # Specifies whether the response had an HTTP OK status code or not.
556
+ #
557
+ # @see http_status
558
+ #
559
+ # @api public
560
+ #
561
+ def http_ok?(options={})
562
+ http_status(options) == 200
563
+ end
564
+
565
+ #
566
+ # Sends a HTTP Head request and returns the HTTP Server header.
567
+ #
568
+ # @param [Hash] options
569
+ # Additional options.
570
+ #
571
+ # @option options [Symbol, String] :method (:head)
572
+ # The method to use for the request.
573
+ #
574
+ # @return [String]
575
+ # The HTTP `Server` header.
576
+ #
577
+ # @see http_request
578
+ #
579
+ # @api public
580
+ #
581
+ def http_server(options={})
582
+ options = {:method => :head}.merge(options)
583
+
584
+ return http_request(options)['server']
585
+ end
586
+
587
+ #
588
+ # Sends an HTTP Head request and returns the HTTP X-Powered-By header.
589
+ #
590
+ # @param [Hash] options
591
+ # Additional options.
592
+ #
593
+ # @option options [Symbol, String] :method (:get)
594
+ # The method to use for the request.
595
+ #
596
+ # @return [String]
597
+ # The HTTP `X-Powered-By` header.
598
+ #
599
+ # @see http_request
600
+ #
601
+ # @api public
602
+ #
603
+ def http_powered_by(options={})
604
+ options = {:method => :get}.merge(options)
605
+
606
+ return http_request(options)['x-powered-by']
607
+ end
608
+
609
+ #
610
+ # Performs an HTTP Copy request.
611
+ #
612
+ # @param [Hash] options
613
+ # Additional options.
614
+ #
615
+ # @yield [response]
616
+ # If a block is given, it will be passed the response received
617
+ # from the request.
618
+ #
619
+ # @yieldparam [Net::HTTP::Response] response
620
+ # The HTTP response object.
621
+ #
622
+ # @return [Net::HTTP::Response]
623
+ # The response of the HTTP request.
624
+ #
625
+ # @see http_request
626
+ #
627
+ # @api public
628
+ #
629
+ def http_copy(options={})
630
+ resp = http_request(options.merge(:method => :copy))
631
+
632
+ yield resp if block_given?
633
+ return resp
634
+ end
635
+
636
+ #
637
+ # Performs an HTTP Delete request.
638
+ #
639
+ # @param [Hash] options
640
+ # Additional options.
641
+ #
642
+ # @yield [response]
643
+ # If a block is given, it will be passed the response received from
644
+ # the request.
645
+ #
646
+ # @yieldparam [Net::HTTP::Response] response
647
+ # The HTTP response object.
648
+ #
649
+ # @return [Net::HTTP::Response]
650
+ # The response of the HTTP request.
651
+ #
652
+ # @see http_request
653
+ #
654
+ # @api public
655
+ #
656
+ def http_delete(options={},&block)
657
+ original_headers = options[:headers]
658
+
659
+ # set the HTTP Depth header
660
+ options[:headers] = {:depth => 'Infinity'}
661
+
662
+ if original_headers
663
+ options[:header].merge!(original_headers)
664
+ end
665
+
666
+ resp = http_request(options.merge(:method => :delete))
667
+
668
+ yield resp if block_given?
669
+ return resp
670
+ end
671
+
672
+ #
673
+ # Performs an HTTP Get request.
674
+ #
675
+ # @param [Hash] options
676
+ # Additional options.
677
+ #
678
+ # @yield [response]
679
+ # If a block is given, it will be passed the response received from
680
+ # the request.
681
+ #
682
+ # @yieldparam [Net::HTTP::Response] response
683
+ # The HTTP response object.
684
+ #
685
+ # @return [Net::HTTP::Response]
686
+ # The response of the HTTP request.
687
+ #
688
+ # @see http_request
689
+ #
690
+ # @api public
691
+ #
692
+ def http_get(options={},&block)
693
+ resp = http_request(options.merge(:method => :get))
694
+
695
+ yield resp if block_given?
696
+ return resp
697
+ end
698
+
699
+ #
700
+ # Performs an HTTP Get request and returns the Response Headers.
701
+ #
702
+ # @param [Hash] options
703
+ # Additional options.
704
+ #
705
+ # @return [Hash{String => Array<String>}]
706
+ # The Headers of the HTTP response.
707
+ #
708
+ # @see http_get
709
+ #
710
+ # @since 0.2.0
711
+ #
712
+ # @api public
713
+ #
714
+ def http_get_headers(options={})
715
+ http_get(options).to_hash
716
+ end
717
+
718
+ #
719
+ # Performs an HTTP Get request and returns the Respond Body.
720
+ #
721
+ # @param [Hash] options
722
+ # Additional options.
723
+ #
724
+ # @return [String]
725
+ # The body of the HTTP response.
726
+ #
727
+ # @see http_get
728
+ #
729
+ # @api public
730
+ #
731
+ def http_get_body(options={})
732
+ http_get(options).body
733
+ end
734
+
735
+ #
736
+ # Performs an HTTP Head request.
737
+ #
738
+ # @param [Hash] options
739
+ # Additional options.
740
+ #
741
+ # @yield [response]
742
+ # If a block is given, it will be passed the response received from
743
+ # the request.
744
+ #
745
+ # @yieldparam [Net::HTTP::Response] response
746
+ # The HTTP response object.
747
+ #
748
+ # @return [Net::HTTP::Response]
749
+ # The response of the HTTP request.
750
+ #
751
+ # @see http_request
752
+ #
753
+ # @api public
754
+ #
755
+ def http_head(options={},&block)
756
+ resp = http_request(options.merge(:method => :head))
757
+
758
+ yield resp if block_given?
759
+ return resp
760
+ end
761
+
762
+ #
763
+ # Performs an HTTP Lock request.
764
+ #
765
+ # @param [Hash] options
766
+ # Additional options.
767
+ #
768
+ # @yield [response]
769
+ # If a block is given, it will be passed the response received from
770
+ # the request.
771
+ #
772
+ # @yieldparam [Net::HTTP::Response] response
773
+ # The HTTP response object.
774
+ #
775
+ # @return [Net::HTTP::Response]
776
+ # The response of the HTTP request.
777
+ #
778
+ # @see http_request
779
+ #
780
+ # @api public
781
+ #
782
+ def http_lock(options={},&block)
783
+ resp = http_request(options.merge(:method => :lock))
784
+
785
+ yield resp if block_given?
786
+ return resp
787
+ end
788
+
789
+ #
790
+ # Performs an HTTP Mkcol request.
791
+ #
792
+ # @param [Hash] options
793
+ # Additional options.
794
+ #
795
+ # @yield [response]
796
+ # If a block is given, it will be passed the response received from
797
+ # the request.
798
+ #
799
+ # @yieldparam [Net::HTTP::Response] response
800
+ # The HTTP response object.
801
+ #
802
+ # @return [Net::HTTP::Response]
803
+ # The response of the HTTP request.
804
+ #
805
+ # @see http_request
806
+ #
807
+ # @api public
808
+ #
809
+ def http_mkcol(options={},&block)
810
+ resp = http_request(options.merge(:method => :mkcol))
811
+
812
+ yield resp if block_given?
813
+ return resp
814
+ end
815
+
816
+ #
817
+ # Performs an HTTP Move request.
818
+ #
819
+ # @param [Hash] options
820
+ # Additional options.
821
+ #
822
+ # @yield [response]
823
+ # If a block is given, it will be passed the response received from
824
+ # the request.
825
+ #
826
+ # @yieldparam [Net::HTTP::Response] response
827
+ # The HTTP response object.
828
+ #
829
+ # @return [Net::HTTP::Response]
830
+ # The response of the HTTP request.
831
+ #
832
+ # @see http_request
833
+ #
834
+ # @api public
835
+ #
836
+ def http_move(options={},&block)
837
+ resp = http_request(options.merge(:method => :move))
838
+
839
+ yield resp if block_given?
840
+ return resp
841
+ end
842
+
843
+ #
844
+ # Performs an HTTP Options request.
845
+ #
846
+ # @param [Hash] options
847
+ # Additional options.
848
+ #
849
+ # @yield [response]
850
+ # If a block is given, it will be passed the response received from
851
+ # the request.
852
+ #
853
+ # @yieldparam [Net::HTTP::Response] response
854
+ # The HTTP response object.
855
+ #
856
+ # @return [Net::HTTP::Response]
857
+ # The response of the HTTP request.
858
+ #
859
+ # @see http_request
860
+ #
861
+ # @api public
862
+ #
863
+ def http_options(options={},&block)
864
+ resp = http_request(options.merge(:method => :options))
865
+
866
+ yield resp if block_given?
867
+ return resp
868
+ end
869
+
870
+ #
871
+ # Performs an HTTP Post request.
872
+ #
873
+ # @param [Hash] options
874
+ # Additional options.
875
+ #
876
+ # @option options [Hash, String] :form_data
877
+ # The form data to send with the HTTP Post request.
878
+ #
879
+ # @yield [response]
880
+ # If a block is given, it will be passed the response received from
881
+ # the request.
882
+ #
883
+ # @yieldparam [Net::HTTP::Response] response
884
+ # The HTTP response object.
885
+ #
886
+ # @return [Net::HTTP::Response]
887
+ # The response of the HTTP request.
888
+ #
889
+ # @see http_request
890
+ #
891
+ # @api public
892
+ #
893
+ def http_post(options={},&block)
894
+ resp = http_request(options.merge(:method => :post))
895
+
896
+ yield resp if block_given?
897
+ return resp
898
+ end
899
+
900
+ #
901
+ # Performs an HTTP Post request and returns the Response Headers.
902
+ #
903
+ # @param [Hash] options
904
+ # Additional options.
905
+ #
906
+ # @option options [Hash, String] :form_data
907
+ # The form data to send with the HTTP Post request.
908
+ #
909
+ # @return [Hash{String => Array<String>}]
910
+ # The headers of the HTTP response.
911
+ #
912
+ # @see http_post
913
+ #
914
+ # @since 0.2.0
915
+ #
916
+ # @api public
917
+ #
918
+ def http_post_headers(options={})
919
+ http_post(options).to_hash
920
+ end
921
+
922
+ #
923
+ # Performs an HTTP Post request and returns the Response Body.
924
+ #
925
+ # @param [Hash] options
926
+ # Additional options.
927
+ #
928
+ # @option options [Hash, String] :form_data
929
+ # The form data to send with the HTTP Post request.
930
+ #
931
+ # @return [String]
932
+ # The body of the HTTP response.
933
+ #
934
+ # @see http_post
935
+ #
936
+ # @api public
937
+ #
938
+ def http_post_body(options={})
939
+ http_post(options).body
940
+ end
941
+
942
+ #
943
+ # Performs an HTTP Propfind request.
944
+ #
945
+ # @param [Hash] options
946
+ # Additional options.
947
+ #
948
+ # @yield [response]
949
+ # If a block is given, it will be passed the response received from
950
+ # the request.
951
+ #
952
+ # @yieldparam [Net::HTTP::Response] response
953
+ # The HTTP response object.
954
+ #
955
+ # @return [Net::HTTP::Response]
956
+ # The response of the HTTP request.
957
+ #
958
+ # @see http_request
959
+ #
960
+ # @api public
961
+ #
962
+ def http_prop_find(options={},&block)
963
+ original_headers = options[:headers]
964
+
965
+ # set the HTTP Depth header
966
+ options[:headers] = {:depth => '0'}
967
+
968
+ if original_headers
969
+ options[:header].merge!(original_headers)
970
+ end
971
+
972
+ resp = http_request(options.merge(:method => :propfind))
973
+
974
+ yield resp if block_given?
975
+ return resp
976
+ end
977
+
978
+ #
979
+ # Performs an HTTP Proppatch request.
980
+ #
981
+ # @param [Hash] options
982
+ # Additional options.
983
+ #
984
+ # @yield [response]
985
+ # If a block is given, it will be passed the response received from
986
+ # the request.
987
+ #
988
+ # @yieldparam [Net::HTTP::Response] response
989
+ # The HTTP response object.
990
+ #
991
+ # @return [Net::HTTP::Response]
992
+ # The response of the HTTP request.
993
+ #
994
+ # @see http_request
995
+ #
996
+ # @api public
997
+ #
998
+ def http_prop_patch(options={},&block)
999
+ resp = http_request(options.merge(:method => :proppatch))
1000
+
1001
+ yield resp if block_given?
1002
+ return resp
1003
+ end
1004
+
1005
+ #
1006
+ # Performs an HTTP Trace request.
1007
+ #
1008
+ # @param [Hash] options
1009
+ # Additional options.
1010
+ #
1011
+ # @yield [response]
1012
+ # If a block is given, it will be passed the response received from
1013
+ # the request.
1014
+ #
1015
+ # @yieldparam [Net::HTTP::Response] response
1016
+ # The HTTP response object.
1017
+ #
1018
+ # @return [Net::HTTP::Response]
1019
+ # The response of the HTTP request.
1020
+ #
1021
+ # @see http_request
1022
+ #
1023
+ # @api public
1024
+ #
1025
+ def http_trace(options={},&block)
1026
+ resp = http_request(options.merge(:method => :trace))
1027
+
1028
+ yield resp if block_given?
1029
+ return resp
1030
+ end
1031
+
1032
+ #
1033
+ # Performs an HTTP Unlock request.
1034
+ #
1035
+ # @param [Hash] options
1036
+ # Additional options.
1037
+ #
1038
+ # @yield [response]
1039
+ # If a block is given, it will be passed the response received from
1040
+ # the request.
1041
+ #
1042
+ # @yieldparam [Net::HTTP::Response] response
1043
+ # The HTTP response object.
1044
+ #
1045
+ # @return [Net::HTTP::Response]
1046
+ # The response of the HTTP request.
1047
+ #
1048
+ # @see http_request
1049
+ #
1050
+ # @api public
1051
+ #
1052
+ def http_unlock(options={},&block)
1053
+ resp = http_request(options.merge(:method => :unlock))
1054
+
1055
+ yield resp if block_given?
1056
+ return resp
1057
+ end
313
1058
  end
314
1059
  end
315
1060
  end