buby 1.3.3-java → 1.5.0-java

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 (109) hide show
  1. data/README.rdoc +28 -14
  2. data/Rakefile +96 -6
  3. data/VERSION.yml +5 -0
  4. data/bin/buby +2 -0
  5. data/buby.gemspec +102 -17
  6. data/{java/src → ext/buby/burp}/BurpExtender.java +189 -29
  7. data/ext/burp_interfaces/burp/IBurpExtender.java +31 -0
  8. data/ext/burp_interfaces/burp/IBurpExtenderCallbacks.java +785 -0
  9. data/ext/burp_interfaces/burp/IContextMenuFactory.java +38 -0
  10. data/ext/burp_interfaces/burp/IContextMenuInvocation.java +156 -0
  11. data/ext/burp_interfaces/burp/ICookie.java +53 -0
  12. data/ext/burp_interfaces/burp/IExtensionHelpers.java +352 -0
  13. data/ext/burp_interfaces/burp/IExtensionStateListener.java +27 -0
  14. data/ext/burp_interfaces/burp/IHttpListener.java +37 -0
  15. data/ext/burp_interfaces/burp/IHttpRequestResponse.java +102 -0
  16. data/ext/burp_interfaces/burp/IHttpRequestResponsePersisted.java +26 -0
  17. data/ext/burp_interfaces/burp/IHttpRequestResponseWithMarkers.java +44 -0
  18. data/ext/burp_interfaces/burp/IHttpService.java +39 -0
  19. data/ext/burp_interfaces/burp/IInterceptedProxyMessage.java +116 -0
  20. data/ext/burp_interfaces/burp/IIntruderAttack.java +31 -0
  21. data/ext/burp_interfaces/burp/IIntruderPayloadGenerator.java +50 -0
  22. data/ext/burp_interfaces/burp/IIntruderPayloadGeneratorFactory.java +40 -0
  23. data/ext/burp_interfaces/burp/IIntruderPayloadProcessor.java +45 -0
  24. data/{java/src → ext/burp_interfaces}/burp/IMenuItemHandler.java +36 -40
  25. data/ext/burp_interfaces/burp/IMessageEditor.java +64 -0
  26. data/ext/burp_interfaces/burp/IMessageEditorController.java +49 -0
  27. data/ext/burp_interfaces/burp/IMessageEditorTab.java +102 -0
  28. data/ext/burp_interfaces/burp/IMessageEditorTabFactory.java +38 -0
  29. data/ext/burp_interfaces/burp/IParameter.java +104 -0
  30. data/ext/burp_interfaces/burp/IProxyListener.java +37 -0
  31. data/ext/burp_interfaces/burp/IRequestInfo.java +95 -0
  32. data/ext/burp_interfaces/burp/IResponseInfo.java +54 -0
  33. data/ext/burp_interfaces/burp/IScanIssue.java +120 -0
  34. data/ext/burp_interfaces/burp/IScanQueueItem.java +80 -0
  35. data/ext/burp_interfaces/burp/IScannerCheck.java +89 -0
  36. data/ext/burp_interfaces/burp/IScannerInsertionPoint.java +156 -0
  37. data/ext/burp_interfaces/burp/IScannerInsertionPointProvider.java +38 -0
  38. data/ext/burp_interfaces/burp/IScannerListener.java +30 -0
  39. data/ext/burp_interfaces/burp/IScopeChangeListener.java +25 -0
  40. data/ext/burp_interfaces/burp/ISessionHandlingAction.java +51 -0
  41. data/ext/burp_interfaces/burp/ITab.java +38 -0
  42. data/ext/burp_interfaces/burp/ITempFile.java +33 -0
  43. data/ext/burp_interfaces/burp/ITextEditor.java +90 -0
  44. data/lib/buby/burp_extender/console_frame.rb +33 -0
  45. data/lib/buby/burp_extender/console_pane.rb +26 -0
  46. data/lib/buby/burp_extender/console_tab.rb +15 -0
  47. data/lib/buby/burp_extender/context_menu.rb +29 -0
  48. data/lib/buby/burp_extender/context_menu_factory.rb +17 -0
  49. data/lib/buby/burp_extender/context_menu_item.rb +13 -0
  50. data/lib/buby/burp_extender/jcheck_box_menu_item.rb +12 -0
  51. data/lib/buby/burp_extender/jmenu.rb +11 -0
  52. data/lib/buby/burp_extender/jmenu_item.rb +12 -0
  53. data/lib/buby/burp_extender/menu.rb +11 -0
  54. data/lib/buby/burp_extender/menu_item.rb +12 -0
  55. data/lib/buby/burp_extender.rb +339 -0
  56. data/lib/buby/context_menu_factory.rb +35 -0
  57. data/lib/buby/cookie.rb +37 -0
  58. data/lib/buby/extender.rb +156 -0
  59. data/lib/buby/http_listener.rb +29 -0
  60. data/lib/buby/{extends → implants}/buby_array_wrapper.rb +0 -0
  61. data/lib/buby/implants/context_menu_invocation.rb +113 -0
  62. data/lib/buby/implants/cookie.rb +47 -0
  63. data/lib/buby/implants/extension_helpers.rb +286 -0
  64. data/lib/buby/{extends → implants}/http_request_response.rb +8 -1
  65. data/lib/buby/implants/intercepted_proxy_message.rb +53 -0
  66. data/lib/buby/implants/intruder_attack.rb +42 -0
  67. data/lib/buby/implants/jruby.rb +64 -0
  68. data/lib/buby/implants/message_editor.rb +70 -0
  69. data/lib/buby/implants/message_editor_controller.rb +60 -0
  70. data/lib/buby/implants/parameter.rb +84 -0
  71. data/lib/buby/implants/request_info.rb +47 -0
  72. data/lib/buby/implants/response_info.rb +44 -0
  73. data/lib/buby/{extends → implants}/scan_issue.rb +1 -2
  74. data/lib/buby/implants/scan_queue_item.rb +53 -0
  75. data/lib/buby/implants/scanner_insertion_point.rb +92 -0
  76. data/lib/buby/implants/temp_file.rb +43 -0
  77. data/lib/buby/implants/text_editor.rb +63 -0
  78. data/lib/buby/implants.rb +28 -0
  79. data/lib/buby/intruder_payload_generator.rb +60 -0
  80. data/lib/buby/intruder_payload_generator_factory.rb +32 -0
  81. data/lib/buby/intruder_payload_processor.rb +38 -0
  82. data/lib/buby/message_editor_controller.rb +41 -0
  83. data/lib/buby/message_editor_tab.rb +98 -0
  84. data/lib/buby/message_editor_tab_factory.rb +28 -0
  85. data/lib/buby/parameter/base.rb +40 -0
  86. data/lib/buby/parameter/body.rb +7 -0
  87. data/lib/buby/parameter/cookie.rb +7 -0
  88. data/lib/buby/parameter/url.rb +7 -0
  89. data/lib/buby/parameter.rb +15 -0
  90. data/lib/buby/proxy_listener.rb +26 -0
  91. data/lib/buby/scan_issue.rb +112 -0
  92. data/lib/buby/scanner_check.rb +84 -0
  93. data/lib/buby/scanner_insertion_point.rb +118 -0
  94. data/lib/buby/scanner_insertion_point_provider.rb +27 -0
  95. data/lib/buby/scanner_listener.rb +22 -0
  96. data/lib/buby/scope_change_listener.rb +19 -0
  97. data/lib/buby/session_handling_action.rb +43 -0
  98. data/lib/buby/tab.rb +37 -0
  99. data/lib/buby/version.rb +9 -0
  100. data/lib/buby.rb +892 -101
  101. metadata +118 -22
  102. data/VERSION +0 -1
  103. data/java/buby.jar +0 -0
  104. data/java/src/burp/IBurpExtender.java +0 -180
  105. data/java/src/burp/IBurpExtenderCallbacks.java +0 -373
  106. data/java/src/burp/IHttpRequestResponse.java +0 -156
  107. data/java/src/burp/IScanIssue.java +0 -106
  108. data/java/src/burp/IScanQueueItem.java +0 -76
  109. data/lib/buby/extends.rb +0 -4
@@ -1,7 +1,9 @@
1
1
  require 'uri'
2
2
 
3
3
  class Buby
4
+ # @todo bring IHttpRequestResponse into the now.
4
5
 
6
+ # @deprecated no longer needed in JRuby
5
7
  class HttpRequestResponseList < BubyArrayWrapper
6
8
  def initialize(obj)
7
9
  HttpRequestResponseHelper.implant(obj[0]) if obj.size > 0
@@ -10,11 +12,15 @@ class Buby
10
12
 
11
13
  end
12
14
 
13
-
15
+ # @deprecated This will change to the new Buby::Implants style in the next
16
+ # release. The interface methods will be overwritten to be Ruby-like
17
+ # themselves. If the standard Java implententation is still desired, use the
18
+ # +__method+ version (e.g. +#__response+ or +#__request+).
14
19
  module HttpRequestResponseHelper
15
20
 
16
21
  # returns the response as a Ruby String object - returns an empty string
17
22
  # if response is nil.
23
+ # @deprecated
18
24
  def response_str
19
25
  return response().nil? ? "" : ::String.from_java_bytes(response())
20
26
  end
@@ -45,6 +51,7 @@ class Buby
45
51
 
46
52
  # Returns the full request as a Ruby String - returns an empty string if
47
53
  # request is nil.
54
+ # @deprecated
48
55
  def request_str
49
56
  return request().nil? ? "" : ::String.from_java_bytes(request())
50
57
  end
@@ -0,0 +1,53 @@
1
+ class Buby
2
+ module Implants
3
+
4
+ # This interface is used to represent an HTTP message that has been
5
+ # intercepted by Burp Proxy. Extensions can register an +IProxyListener+ to
6
+ # receive details of proxy messages using this interface.
7
+ #
8
+ module InterceptedProxyMessage
9
+ FOLLOW_RULES = Java::Burp::IInterceptedProxyMessage::ACTION_FOLLOW_RULES
10
+ DO_INTERCEPT = Java::Burp::IInterceptedProxyMessage::ACTION_DO_INTERCEPT
11
+ DONT_INTERCEPT = Java::Burp::IInterceptedProxyMessage::ACTION_DONT_INTERCEPT
12
+ DROP = Java::Burp::IInterceptedProxyMessage::ACTION_DROP
13
+ FOLLOW_RULES_AND_REHOOK = Java::Burp::IInterceptedProxyMessage::ACTION_FOLLOW_RULES_AND_REHOOK
14
+ DO_INTERCEPT_AND_REHOOK = Java::Burp::IInterceptedProxyMessage::ACTION_DO_INTERCEPT_AND_REHOOK
15
+ DONT_INTERCEPT_AND_REHOOK = Java::Burp::IInterceptedProxyMessage::ACTION_DONT_INTERCEPT_AND_REHOOK
16
+
17
+ # This method retrieves details of the intercepted message.
18
+ #
19
+ # @return [IHttpRequestResponse] object containing details of the
20
+ # intercepted message.
21
+ #
22
+ # @todo IHttpRequestResponse
23
+ def getMessageInfo
24
+ __getMessageInfo.tap{|msg| Buby::HttpRequestResponseHelper.implant(msg)}
25
+ end
26
+
27
+ # Install ourselves into the current +IInterceptedProxyMessage+ java class
28
+ # @param [IInterceptedProxyMessage] message
29
+ #
30
+ def self.implant(message)
31
+ unless message.implanted? || message.nil?
32
+ pp [:implanting, message, message.class] if $DEBUG
33
+ message.class.class_exec(message) do |message|
34
+ a_methods = %w{
35
+ getMessageInfo
36
+ }
37
+ a_methods.each do |meth|
38
+ alias_method "__"+meth.to_s, meth
39
+ end
40
+ include Buby::Implants::InterceptedProxyMessage
41
+ a_methods.each do |meth|
42
+ java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
43
+ define_method ruby_meth, Buby::Implants::InterceptedProxyMessage.instance_method(meth)
44
+ end
45
+ end
46
+ include Buby::Implants::Proxy
47
+ end
48
+ end
49
+ message
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,42 @@
1
+ class Buby
2
+ module Implants
3
+ # This interface is used to hold details about an Intruder attack.
4
+ #
5
+ module IntruderAttack
6
+ # This method is used to retrieve the request template for the attack.
7
+ #
8
+ # @return [String] The request template for the attack.
9
+ #
10
+ def getRequestTemplate
11
+ pp [:got_getRequestTemplate] if $DEBUG
12
+ String.from_java_bytes __getRequestTemplate
13
+ end
14
+
15
+ # Install ourselves into the current +IIntruderAttack+ java class
16
+ # @param [IIntruderAttack] attack
17
+ #
18
+ def self.implant(attack)
19
+ unless attack.implanted? || attack.nil?
20
+ pp [:implanting, attack, attack.class] if $DEBUG
21
+ attack.class.class_exec(attack) do |attack|
22
+ a_methods = %w{
23
+ getRequestTemplate
24
+ }
25
+ a_methods.each do |meth|
26
+ alias_method "__"+meth.to_s, meth
27
+ end
28
+ include Buby::Implants::IntruderAttack
29
+ a_methods.each do |meth|
30
+ java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
31
+ define_method ruby_meth, Buby::Implants::IntruderAttack.instance_method(meth)
32
+ end
33
+ end
34
+ include Buby::Implants::Proxy
35
+ end
36
+ end
37
+ attack
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,64 @@
1
+ class Buby
2
+ module Implants
3
+ module Object
4
+ def implanted?(klass = nil)
5
+ self.class.ancestors.include?(klass)
6
+ end
7
+
8
+ def unique_methods regular = true
9
+ klass = self.class
10
+ meths = self.methods regular
11
+ while (klass != ::Object)
12
+ meths -= JRuby.reference(klass).getMethods.each_with_object([]){|meth, arr| arr << meth.first.intern if meth.last.kind_of?(Java::OrgJrubyInternalRuntimeMethods::AliasMethod)}
13
+ klass = klass.superclass
14
+ end
15
+ meths
16
+ end
17
+ end
18
+
19
+ unless [].respond_to?(:each_with_object)
20
+ module Enumerable
21
+ # XXX backport for 1.8.7
22
+ def each_with_object(memo)
23
+ inject(memo) do |memo, item|
24
+ yield item, memo
25
+ memo
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module JavaClass
32
+ def ruby_names_for_java_method meth
33
+ self_java_ref = JRuby.reference(self).javaClass
34
+ target_methods = self_java_ref.getMethods.group_by{|jmeth| jmeth.name}[meth.to_s]
35
+ Java::OrgJrubyJavasupport::JavaUtil.getRubyNamesForJavaName(target_methods.first.name, target_methods)
36
+ end
37
+
38
+ # copies wrapper_id method to java_id and all ruby-like aliases
39
+ # used to re-attach java method proxies to new call wrapper
40
+ #
41
+ # @param java_id target java method (the original java method name)
42
+ def rewrap_java_method java_id
43
+ ruby_names_for_java_method(java_id).each do |ruby_name|
44
+ alias_method(ruby_name, java_id) unless wrapper_id == ruby_name
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ class Object
52
+ include Buby::Implants::Object
53
+ end
54
+
55
+ module Enumerable
56
+ include Buby::Implants::Enumerable unless [].respond_to?(:each_with_object)
57
+ end
58
+
59
+ module Java
60
+ class JavaClass
61
+ include Buby::Implants::JavaClass
62
+ end
63
+ end
64
+
@@ -0,0 +1,70 @@
1
+ class Buby
2
+ module Implants
3
+ # This interface is used to provide extensions with an instance of Burp's
4
+ # HTTP message editor, for the extension to use in its own UI. Extensions
5
+ # should call {Buby#createMessageEditor} to obtain an instance of this
6
+ # interface.
7
+ #
8
+ module MessageEditor
9
+ # This method is used to display an HTTP message in the editor.
10
+ #
11
+ # @param [Array<byte>, String] message The HTTP message to be displayed.
12
+ # @param [Boolean] isRequest Flags whether the message is an HTTP request
13
+ # or response.
14
+ # @return [void]
15
+ #
16
+ def setMessage(message, isRequest)
17
+ message = message.to_java_bytes if message.respond_to? :to_java_bytes
18
+ message = message.to_java :byte if message.kind_of? Array
19
+ __setMessage(message, isRequest)
20
+ end
21
+
22
+ # This method is used to retrieve the currently displayed message, which
23
+ # may have been modified by the user.
24
+ #
25
+ # @return [String] The currently displayed HTTP message.
26
+ #
27
+ def getMessage
28
+ String.from_java_bytes __getMessage
29
+ end
30
+
31
+ # This method returns the data that is currently selected by the user.
32
+ #
33
+ # @return [String, nil] The data that is currently selected by the user,
34
+ # or +nil+ if no selection is made.
35
+ #
36
+ def getSelectedData
37
+ ret = __getSelectedData
38
+ ret ? String.from_java_bytes(ret) : ret
39
+ end
40
+
41
+ # Install ourselves into the current +IMessageEditor+ java class
42
+ # @param [IMessageEditor] editor
43
+ #
44
+ def self.implant(editor)
45
+ unless editor.implanted? || editor.nil?
46
+ pp [:implanting, editor, editor.class] if $DEBUG
47
+ editor.class.class_exec(editor) do |editor|
48
+ a_methods = %w{
49
+ setMessage
50
+ getMessage
51
+ getSelectedData
52
+ }
53
+ a_methods.each do |meth|
54
+ alias_method "__"+meth.to_s, meth
55
+ end
56
+ include Buby::Implants::MessageEditor
57
+ a_methods.each do |meth|
58
+ java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
59
+ define_method ruby_meth, Buby::Implants::MessageEditor.instance_method(meth)
60
+ end
61
+ end
62
+ include Buby::Implants::Proxy
63
+ end
64
+ end
65
+ editor
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,60 @@
1
+ class Buby
2
+ module Implants
3
+ # This interface is used by an +IMessageEditor+ to obtain details about the
4
+ # currently displayed message. Extensions that create instances of Burp's
5
+ # HTTP message editor can optionally provide an implementation of
6
+ # +IMessageEditorController+, which the editor will invoke when it requires
7
+ # further information about the current message (for example, to send it to
8
+ # another Burp tool). Extensions that provide custom editor tabs via an
9
+ # +IMessageEditorTabFactory+ will receive a reference to an
10
+ # +IMessageEditorController+ object for each tab instance they generate,
11
+ # which the tab can invoke if it requires further information about the
12
+ # current message.
13
+ #
14
+ module MessageEditorController
15
+ # This method is used to retrieve the HTTP request associated with the
16
+ # current message (which may itself be a response).
17
+ #
18
+ # @return [String] The HTTP request associated with the current message.
19
+ #
20
+ def getRequest
21
+ String.from_java_bytes __getRequest
22
+ end
23
+
24
+ # This method is used to retrieve the HTTP response associated with the
25
+ # current message (which may itself be a request).
26
+ #
27
+ # @return [String] The HTTP response associated with the current message.
28
+ #
29
+ def getResponse
30
+ String.from_java_bytes __getResponse
31
+ end
32
+
33
+ # Install ourselves into the current +IMessageEditorController+ java class
34
+ # @param [IMessageEditorController] controller
35
+ #
36
+ def self.implant(controller)
37
+ unless controller.implanted? || controller.nil?
38
+ pp [:implanting, controller, controller.class] if $DEBUG
39
+ controller.class.class_exec(controller) do |controller|
40
+ a_methods = %w{
41
+ getRequest
42
+ getResponse
43
+ }
44
+ a_methods.each do |meth|
45
+ alias_method "__"+meth.to_s, meth
46
+ end
47
+ include Buby::Implants::MessageEditorController
48
+ a_methods.each do |meth|
49
+ java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
50
+ define_method ruby_meth, Buby::Implants::MessageEditorController.instance_method(meth)
51
+ end
52
+ end
53
+ include Buby::Implants::Proxy
54
+ end
55
+ end
56
+ controller
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,84 @@
1
+ class Buby
2
+ module Implants
3
+ # This interface is used to hold details about an HTTP request parameter.
4
+ #
5
+ module Parameter
6
+
7
+ # This method is used to retrieve the start offset of the parameter name
8
+ # within the HTTP request.
9
+ #
10
+ # @return [Fixnum, nil] The start offset of the parameter name within
11
+ # the HTTP request, or +nil+ if the parameter is not associated with a
12
+ # specific request.
13
+ #
14
+ def getNameStart
15
+ ret = __getNameStart
16
+ ret == -1 ? nil : ret
17
+ end
18
+
19
+ # This method is used to retrieve the end offset of the parameter name
20
+ # within the HTTP request.
21
+ #
22
+ # @return [Fixnum, nil] The end offset of the parameter name within the
23
+ # HTTP request, or +nil+ if the parameter is not associated with a
24
+ # specific request.
25
+ #
26
+ def getNameEnd
27
+ ret = __getNameEnd
28
+ ret == -1 ? nil : ret
29
+ end
30
+
31
+ # This method is used to retrieve the start offset of the parameter
32
+ # value within the HTTP request.
33
+ #
34
+ # @return [Fixnum, nil] The start offset of the parameter value within
35
+ # the HTTP request, or +nil+ if the parameter is not associated with a
36
+ # specific request.
37
+ #
38
+ def getValueStart
39
+ ret = __getValueStart
40
+ ret == -1 ? nil : ret
41
+ end
42
+
43
+ # This method is used to retrieve the end offset of the parameter value
44
+ # within the HTTP request.
45
+ #
46
+ # @return [Fixnum, nil] The end offset of the parameter value within the
47
+ # HTTP request, or +nil+ if the parameter is not associated with a
48
+ # specific request.
49
+ #
50
+ def getValueEnd
51
+ ret = __getValueEnd
52
+ ret == -1 ? nil : ret
53
+ end
54
+
55
+ # Install ourselves into the current +IParameter+ java class
56
+ # @param [IParameter] parameter
57
+ #
58
+ def self.implant(parameter)
59
+ unless parameter.implanted? || parameter.nil?
60
+ pp [:implanting, parameter, parameter.class] if $DEBUG
61
+ parameter.class.class_exec(parameter) do |parameter|
62
+ a_methods = %w{
63
+ getNameStart
64
+ getNameEnd
65
+ getValueEnd
66
+ getValueStart
67
+ }
68
+ a_methods.each do |meth|
69
+ alias_method "__"+meth.to_s, meth
70
+ end
71
+ include Buby::Implants::Parameter
72
+ a_methods.each do |meth|
73
+ java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
74
+ define_method ruby_meth, Buby::Implants::Parameter.instance_method(meth)
75
+ end
76
+ end
77
+ include Buby::Implants::Proxy
78
+ end
79
+ end
80
+ parameter
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,47 @@
1
+ require 'uri'
2
+
3
+ class Buby
4
+ module Implants
5
+ # This interface is used to retrieve key details about an HTTP request.
6
+ # Extensions can obtain an +IRequestInfo+ object for a given request by
7
+ # calling {Buby#analyzeRequest}.
8
+ #
9
+ module RequestInfo
10
+
11
+ # This method is used to obtain the parameters contained in the request.
12
+ #
13
+ # @return [Array<IParameter>] The parameters contained in the request.
14
+ #
15
+ def getParameters
16
+ __getParameters.tap{|parm| Buby::Implants::Parameter.implant parm.first}
17
+ end
18
+
19
+
20
+ # Install ourselves into the current +IRequestInfo+ java class
21
+ # @param [IRequestInfo] info
22
+ #
23
+ def self.implant(info)
24
+ unless info.implanted? || info.nil?
25
+ pp [:implanting, info, info.class] if $DEBUG
26
+ info.class.class_exec(info) do |info|
27
+ a_methods = %w{
28
+ getParameters
29
+ }
30
+ a_methods.each do |meth|
31
+ alias_method "__"+meth.to_s, meth
32
+ end
33
+ include Buby::Implants::RequestInfo
34
+ a_methods.each do |meth|
35
+ java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
36
+ define_method ruby_meth, Buby::Implants::RequestInfo.instance_method(meth)
37
+ end
38
+ end
39
+ include Buby::Implants::Proxy
40
+ end
41
+ end
42
+ info
43
+ end
44
+
45
+ end
46
+ end
47
+ end