watobo 0.9.21 → 0.9.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (283) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -1
  3. data/bin/nfq_server.rb +0 -9
  4. data/bin/watobo_gui.rb +3 -13
  5. data/custom-views/prettify-json.rb +9 -18
  6. data/icons/watobo.ico +0 -0
  7. data/icons/watobo.ico.old +0 -0
  8. data/lib/watobo.rb +10 -19
  9. data/lib/watobo/adapters.rb +5 -14
  10. data/lib/watobo/adapters/data_store.rb +50 -59
  11. data/lib/watobo/adapters/file/file_store.rb +287 -296
  12. data/lib/watobo/adapters/file/marshal_store.rb +293 -296
  13. data/lib/watobo/adapters/session_store.rb +5 -14
  14. data/lib/watobo/ca.rb +1 -10
  15. data/lib/watobo/config.rb +197 -206
  16. data/lib/watobo/constants.rb +0 -9
  17. data/lib/watobo/core.rb +3 -12
  18. data/lib/watobo/core/active_check.rb +72 -135
  19. data/lib/watobo/core/active_checks.rb +49 -58
  20. data/lib/watobo/core/ca.rb +369 -389
  21. data/lib/watobo/core/cert_store.rb +34 -43
  22. data/lib/watobo/core/chat.rb +92 -101
  23. data/lib/watobo/core/chats.rb +271 -280
  24. data/lib/watobo/core/client_cert_store.rb +106 -35
  25. data/lib/watobo/core/conversation.rb +48 -57
  26. data/lib/watobo/core/cookie.rb +23 -32
  27. data/lib/watobo/core/egress_handlers.rb +98 -0
  28. data/lib/watobo/core/finding.rb +66 -75
  29. data/lib/watobo/core/findings.rb +107 -114
  30. data/lib/watobo/core/forwarding_proxy.rb +13 -22
  31. data/lib/watobo/core/fuzz_gen.rb +0 -9
  32. data/lib/watobo/core/intercept_carver.rb +166 -177
  33. data/lib/watobo/core/intercept_filter.rb +235 -244
  34. data/lib/watobo/core/interceptor.rb +98 -107
  35. data/lib/watobo/core/min_class.rb +4 -13
  36. data/lib/watobo/core/netfilter_queue.rb +170 -179
  37. data/lib/watobo/core/ott_cache.rb +132 -141
  38. data/lib/watobo/core/parameter.rb +43 -52
  39. data/lib/watobo/core/passive_check.rb +103 -102
  40. data/lib/watobo/core/passive_checks.rb +48 -57
  41. data/lib/watobo/core/passive_scanner.rb +54 -55
  42. data/lib/watobo/core/plugin.rb +11 -20
  43. data/lib/watobo/core/project.rb +3 -9
  44. data/lib/watobo/core/proxy.rb +43 -52
  45. data/lib/watobo/core/request.rb +125 -123
  46. data/lib/watobo/core/response.rb +44 -53
  47. data/lib/watobo/core/scanner.rb +0 -9
  48. data/lib/watobo/core/scanner3.rb +405 -414
  49. data/lib/watobo/core/scope.rb +83 -92
  50. data/lib/watobo/core/session.rb +1043 -1026
  51. data/lib/watobo/core/sid_cache.rb +98 -107
  52. data/lib/watobo/core/subscriber.rb +25 -34
  53. data/lib/watobo/defaults.rb +21 -30
  54. data/lib/watobo/external/diff/lcs.rb +0 -9
  55. data/lib/watobo/external/diff/lcs/array.rb +0 -9
  56. data/lib/watobo/external/diff/lcs/block.rb +0 -9
  57. data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
  58. data/lib/watobo/external/diff/lcs/change.rb +0 -9
  59. data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
  60. data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
  61. data/lib/watobo/external/diff/lcs/string.rb +0 -9
  62. data/lib/watobo/externals.rb +6 -15
  63. data/lib/watobo/framework.rb +4 -13
  64. data/lib/watobo/framework/create_project.rb +60 -69
  65. data/lib/watobo/framework/init.rb +0 -9
  66. data/lib/watobo/framework/init_modules.rb +0 -9
  67. data/lib/watobo/framework/license_text.rb +28 -37
  68. data/lib/watobo/framework/load_chat.rb +13 -22
  69. data/lib/watobo/gui.rb +132 -123
  70. data/lib/watobo/gui/about_watobo.rb +0 -9
  71. data/lib/watobo/gui/browser_preview.rb +0 -9
  72. data/lib/watobo/gui/certificate_dialog.rb +0 -9
  73. data/lib/watobo/gui/chat_diff.rb +0 -9
  74. data/lib/watobo/gui/chatviewer_frame.rb +73 -72
  75. data/lib/watobo/gui/checkboxtree.rb +0 -9
  76. data/lib/watobo/gui/checks_policy_frame.rb +0 -9
  77. data/lib/watobo/gui/client_cert_dialog.rb +96 -87
  78. data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
  79. data/lib/watobo/gui/conversation_table.rb +158 -164
  80. data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
  81. data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
  82. data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
  83. data/lib/watobo/gui/custom_viewer.rb +374 -383
  84. data/lib/watobo/gui/dashboard.rb +296 -303
  85. data/lib/watobo/gui/define_scope_frame.rb +0 -9
  86. data/lib/watobo/gui/differ_frame.rb +215 -224
  87. data/lib/watobo/gui/edit_comment.rb +0 -9
  88. data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
  89. data/lib/watobo/gui/export_dialog.rb +104 -113
  90. data/lib/watobo/gui/finding_info.rb +0 -9
  91. data/lib/watobo/gui/findings_tree.rb +210 -217
  92. data/lib/watobo/gui/full_scan_dialog.rb +0 -9
  93. data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
  94. data/lib/watobo/gui/fxsave_thread.rb +14 -0
  95. data/lib/watobo/gui/goto_url_dialog.rb +70 -79
  96. data/lib/watobo/gui/hex_viewer.rb +0 -9
  97. data/lib/watobo/gui/html_viewer.rb +287 -296
  98. data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
  99. data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
  100. data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
  101. data/lib/watobo/gui/json_viewer.rb +287 -0
  102. data/lib/watobo/gui/list_box.rb +101 -110
  103. data/lib/watobo/gui/log_file_viewer.rb +32 -41
  104. data/lib/watobo/gui/log_viewer.rb +83 -88
  105. data/lib/watobo/gui/login_wizzard.rb +0 -9
  106. data/lib/watobo/gui/main_window.rb +587 -618
  107. data/lib/watobo/gui/manual_request_editor.rb +620 -565
  108. data/lib/watobo/gui/master_pw_dialog.rb +0 -9
  109. data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
  110. data/lib/watobo/gui/page_tree.rb +217 -226
  111. data/lib/watobo/gui/password_policy_dialog.rb +0 -9
  112. data/lib/watobo/gui/plugin_board.rb +0 -9
  113. data/lib/watobo/gui/preferences_dialog.rb +0 -9
  114. data/lib/watobo/gui/progress_window.rb +17 -27
  115. data/lib/watobo/gui/project_wizzard.rb +0 -9
  116. data/lib/watobo/gui/proxy_dialog.rb +1 -10
  117. data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
  118. data/lib/watobo/gui/request_builder_frame.rb +102 -111
  119. data/lib/watobo/gui/request_editor.rb +181 -137
  120. data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
  121. data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
  122. data/lib/watobo/gui/save_chat_dialog.rb +140 -149
  123. data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
  124. data/lib/watobo/gui/select_chat_dialog.rb +0 -9
  125. data/lib/watobo/gui/session_management_dialog.rb +0 -9
  126. data/lib/watobo/gui/sites_tree.rb +0 -9
  127. data/lib/watobo/gui/status_bar.rb +0 -9
  128. data/lib/watobo/gui/table_editor.rb +0 -9
  129. data/lib/watobo/gui/tagless_viewer.rb +0 -9
  130. data/lib/watobo/gui/templates/plugin.rb +0 -9
  131. data/lib/watobo/gui/templates/plugin2.rb +92 -100
  132. data/lib/watobo/gui/templates/plugin_base.rb +144 -153
  133. data/lib/watobo/gui/text_viewer.rb +0 -9
  134. data/lib/watobo/gui/transcoder_window.rb +0 -9
  135. data/lib/watobo/gui/utils/gui_utils.rb +0 -9
  136. data/lib/watobo/gui/utils/init_icons.rb +86 -95
  137. data/lib/watobo/gui/utils/load_icons.rb +33 -42
  138. data/lib/watobo/gui/utils/load_plugins.rb +116 -119
  139. data/lib/watobo/gui/utils/master_password.rb +68 -77
  140. data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
  141. data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
  142. data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
  143. data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
  144. data/lib/watobo/gui/utils/session_history.rb +112 -121
  145. data/lib/watobo/gui/workspace_dialog.rb +0 -9
  146. data/lib/watobo/gui/www_auth_dialog.rb +0 -9
  147. data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
  148. data/lib/watobo/http.rb +4 -13
  149. data/lib/watobo/http/cookies/cookies.rb +26 -35
  150. data/lib/watobo/http/data/data.rb +45 -54
  151. data/lib/watobo/http/data/json.rb +47 -55
  152. data/lib/watobo/http/url/url.rb +38 -47
  153. data/lib/watobo/http/xml/xml.rb +124 -130
  154. data/lib/watobo/interceptor.rb +3 -12
  155. data/lib/watobo/interceptor/proxy.rb +742 -739
  156. data/lib/watobo/interceptor/transparent.rb +22 -24
  157. data/lib/watobo/mixins.rb +10 -19
  158. data/lib/watobo/mixins/check_info.rb +27 -36
  159. data/lib/watobo/mixins/httpparser.rb +613 -637
  160. data/lib/watobo/mixins/request_parser.rb +88 -97
  161. data/lib/watobo/mixins/shapers.rb +515 -529
  162. data/lib/watobo/mixins/transcoders.rb +3 -11
  163. data/lib/watobo/parser.rb +1 -10
  164. data/lib/watobo/parser/html.rb +83 -92
  165. data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
  166. data/lib/watobo/sockets.rb +3 -12
  167. data/lib/watobo/sockets/agent.rb +828 -837
  168. data/lib/watobo/sockets/client_socket.rb +308 -312
  169. data/lib/watobo/sockets/connection.rb +401 -410
  170. data/lib/watobo/sockets/http_socket.rb +11 -13
  171. data/lib/watobo/sockets/ntlm_auth.rb +129 -138
  172. data/lib/watobo/utils.rb +10 -19
  173. data/lib/watobo/utils/check_regex.rb +0 -9
  174. data/lib/watobo/utils/copy_object.rb +0 -9
  175. data/lib/watobo/utils/crypto.rb +0 -9
  176. data/lib/watobo/utils/expand_range.rb +23 -32
  177. data/lib/watobo/utils/export_xml.rb +97 -106
  178. data/lib/watobo/utils/file_management.rb +9 -11
  179. data/lib/watobo/utils/hexprint.rb +9 -18
  180. data/lib/watobo/utils/load_chat.rb +0 -9
  181. data/lib/watobo/utils/load_icon.rb +0 -9
  182. data/lib/watobo/utils/ntlm.rb +866 -875
  183. data/lib/watobo/utils/print_debug.rb +12 -21
  184. data/lib/watobo/utils/response_builder.rb +90 -99
  185. data/lib/watobo/utils/response_hash.rb +0 -9
  186. data/lib/watobo/utils/secure_eval.rb +0 -9
  187. data/lib/watobo/utils/strings.rb +10 -19
  188. data/lib/watobo/utils/text2request.rb +0 -9
  189. data/lib/watobo/utils/url.rb +23 -32
  190. data/lib/watobo/utils/utf16.rb +11 -20
  191. data/modules/active/Apache/mod_status.rb +0 -9
  192. data/modules/active/Apache/multiview.rb +151 -160
  193. data/modules/active/Flash/crossdomain.rb +0 -9
  194. data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
  195. data/modules/active/cq5/cq5_default_selectors.rb +106 -115
  196. data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
  197. data/modules/active/directories/dirwalker.rb +0 -9
  198. data/modules/active/discovery/fileextensions.rb +0 -9
  199. data/modules/active/discovery/http_methods.rb +0 -9
  200. data/modules/active/discovery/jsmapfiles.rb +79 -0
  201. data/modules/active/domino/domino_db.rb +68 -76
  202. data/modules/active/dotNET/custom_errors.rb +102 -111
  203. data/modules/active/dotNET/dotnet_files.rb +90 -99
  204. data/modules/active/fileinclusion/lfi_simple.rb +0 -9
  205. data/modules/active/jboss/jboss_basic.rb +0 -9
  206. data/modules/active/sap/business_objects.rb +51 -60
  207. data/modules/active/sap/its_commands.rb +0 -9
  208. data/modules/active/sap/its_service_parameter.rb +0 -9
  209. data/modules/active/sap/its_services.rb +0 -9
  210. data/modules/active/sap/its_xss.rb +0 -9
  211. data/modules/active/shell_shock/shell_shock.rb +139 -148
  212. data/modules/active/siebel/siebel_apps.rb +160 -169
  213. data/modules/active/sqlinjection/sql_boolean.rb +0 -9
  214. data/modules/active/sqlinjection/sql_numerical.rb +198 -0
  215. data/modules/active/sqlinjection/sqli_error.rb +0 -9
  216. data/modules/active/sqlinjection/sqli_timing.rb +220 -229
  217. data/modules/active/struts2/default_handler_ognl.rb +106 -115
  218. data/modules/active/struts2/include_params_ognl.rb +105 -114
  219. data/modules/active/xml/xml_xxe.rb +112 -123
  220. data/modules/active/xss/xss_ng.rb +214 -223
  221. data/modules/active/xss/xss_simple.rb +0 -9
  222. data/modules/passive/ajax.rb +68 -77
  223. data/modules/passive/autocomplete.rb +56 -65
  224. data/modules/passive/cookie_options.rb +0 -9
  225. data/modules/passive/cookie_xss.rb +0 -9
  226. data/modules/passive/detect_code.rb +0 -9
  227. data/modules/passive/detect_fileupload.rb +0 -9
  228. data/modules/passive/detect_infrastructure.rb +0 -9
  229. data/modules/passive/detect_one_time_tokens.rb +0 -9
  230. data/modules/passive/dirindexing.rb +0 -9
  231. data/modules/passive/disclosure_domino.rb +55 -64
  232. data/modules/passive/disclosure_emails.rb +0 -9
  233. data/modules/passive/disclosure_ipaddr.rb +55 -53
  234. data/modules/passive/filename_as_parameter.rb +0 -9
  235. data/modules/passive/form_spotter.rb +0 -9
  236. data/modules/passive/hidden_fields.rb +50 -59
  237. data/modules/passive/hotspots.rb +0 -9
  238. data/modules/passive/in_script_parameter.rb +0 -9
  239. data/modules/passive/json_web_token.rb +93 -0
  240. data/modules/passive/multiple_server_headers.rb +0 -9
  241. data/modules/passive/possible_login.rb +0 -9
  242. data/modules/passive/redirect_url.rb +0 -9
  243. data/modules/passive/redirectionz.rb +0 -9
  244. data/modules/passive/sap-headers.rb +56 -65
  245. data/modules/passive/xss_dom.rb +0 -9
  246. data/plugins/aem/aem.rb +11 -20
  247. data/plugins/aem/gui/main.rb +118 -127
  248. data/plugins/aem/gui/tree_view.rb +171 -180
  249. data/plugins/aem/lib/agent.rb +130 -138
  250. data/plugins/aem/lib/dispatcher.rb +45 -51
  251. data/plugins/aem/lib/engine.rb +177 -186
  252. data/plugins/catalog/catalog.rb +345 -355
  253. data/plugins/crawler/crawler.rb +4 -13
  254. data/plugins/crawler/gui.rb +5 -14
  255. data/plugins/crawler/gui/auth_frame.rb +270 -279
  256. data/plugins/crawler/gui/crawler_gui.rb +271 -276
  257. data/plugins/crawler/gui/general_settings_frame.rb +96 -105
  258. data/plugins/crawler/gui/hooks_frame.rb +80 -89
  259. data/plugins/crawler/gui/scope_frame.rb +50 -59
  260. data/plugins/crawler/gui/settings_tabbook.rb +38 -47
  261. data/plugins/crawler/gui/status_frame.rb +59 -68
  262. data/plugins/crawler/lib/bags.rb +18 -27
  263. data/plugins/crawler/lib/constants.rb +11 -20
  264. data/plugins/crawler/lib/engine.rb +488 -497
  265. data/plugins/crawler/lib/grabber.rb +68 -77
  266. data/plugins/crawler/lib/status.rb +71 -80
  267. data/plugins/crawler/lib/uri_mp.rb +12 -21
  268. data/plugins/filefinder/filefinder.rb +326 -333
  269. data/plugins/sqlmap/bin/test.rb +78 -87
  270. data/plugins/sqlmap/gui.rb +4 -13
  271. data/plugins/sqlmap/gui/main.rb +218 -227
  272. data/plugins/sqlmap/gui/options_frame.rb +97 -106
  273. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
  274. data/plugins/sqlmap/sqlmap.rb +2 -11
  275. data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
  276. data/plugins/sslchecker/gui/cipher_table.rb +246 -254
  277. data/plugins/sslchecker/gui/gui.rb +258 -264
  278. data/plugins/sslchecker/gui/sslchecker.rb +4 -13
  279. data/plugins/sslchecker/lib/check.rb +127 -133
  280. data/plugins/wshell/gui/main.rb +119 -117
  281. data/plugins/wshell/lib/core.rb +38 -88
  282. data/plugins/wshell/wshell.rb +11 -20
  283. metadata +170 -164
@@ -1,25 +1,23 @@
1
- #.
2
- # transparent.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # @private
11
- module Watobo#:nodoc: all
12
- module Interceptor
13
- module Transparent
14
- @nfq_drb = nil
15
- def self.start
16
- DRb.start_service
17
- @nfq_drb = DRbObject.new nil, "druby://127.0.0.1:9090"
18
- end
19
-
20
- def self.info(data)
21
- @nfq_drb.info(data)
22
- end
23
- end
24
- end
25
- end
2
+ module Watobo#:nodoc: all
3
+ module Interceptor
4
+ module Transparent
5
+ @nfq_drb = nil
6
+ def self.start
7
+ DRb.start_service
8
+ @nfq_drb = DRbObject.new nil, "druby://127.0.0.1:9090"
9
+ end
10
+
11
+ def self.info(data)
12
+ nfo = nil
13
+ begin
14
+ nfo = @nfq_drb.info(data)
15
+ rescue => bang
16
+ puts "! could not query nfq_server"
17
+ puts bang
18
+ end
19
+ nfo
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,21 +1,12 @@
1
- #.
2
- # mixins.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # @private
11
- module Watobo#:nodoc: all
12
- module Mixins
13
- mixins_path = File.expand_path(File.join(File.dirname(__FILE__), "mixins"))
14
- # puts "* loading mixins #{mixins_path}"
15
- Dir.glob("#{mixins_path}/*.rb").each do |cf|
16
- puts "+ #{File.basename(cf)}" if $DEBUG
17
- require File.join("watobo","mixins", File.basename(cf))
18
-
19
- end
20
- end
2
+ module Watobo#:nodoc: all
3
+ module Mixins
4
+ mixins_path = File.expand_path(File.join(File.dirname(__FILE__), "mixins"))
5
+ # puts "* loading mixins #{mixins_path}"
6
+ Dir.glob("#{mixins_path}/*.rb").each do |cf|
7
+ puts "+ #{File.basename(cf)}" if $DEBUG
8
+ require File.join("watobo","mixins", File.basename(cf))
9
+
10
+ end
11
+ end
21
12
  end
@@ -1,38 +1,29 @@
1
- #.
2
- # check_info.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # @private
11
- module Watobo#:nodoc: all
12
- module CheckInfoMixin
13
- module InfoMethods
14
- def check_name
15
-
16
- #puts self.methods.sort
17
- info = instance_variable_get("@info")
18
- return nil if info.nil?
19
- return info[:check_name]
20
- end
21
-
22
- def check_group
23
- info = instance_variable_get("@info")
24
- return nil if info.nil?
25
- return info[:check_group]
26
- end
27
-
28
- end
29
-
30
- extend InfoMethods
31
-
32
- def self.included( other )
33
- other.extend InfoMethods
34
- end
35
- #:name => "#{check.info[:check_group]}|#{check.info[:check_name]}",
36
-
37
- end
2
+ module Watobo#:nodoc: all
3
+ module CheckInfoMixin
4
+ module InfoMethods
5
+ def check_name
6
+
7
+ #puts self.methods.sort
8
+ info = instance_variable_get("@info")
9
+ return nil if info.nil?
10
+ return info[:check_name]
11
+ end
12
+
13
+ def check_group
14
+ info = instance_variable_get("@info")
15
+ return nil if info.nil?
16
+ return info[:check_group]
17
+ end
18
+
19
+ end
20
+
21
+ extend InfoMethods
22
+
23
+ def self.included( other )
24
+ other.extend InfoMethods
25
+ end
26
+ #:name => "#{check.info[:check_group]}|#{check.info[:check_name]}",
27
+
28
+ end
38
29
  end
@@ -1,12 +1,3 @@
1
- #.
2
- # httpparser.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # http://www.ietf.org/rfc/rfc2396.txt
11
2
  # http://en.wikipedia.org/wiki/URI_scheme
12
3
 
@@ -25,749 +16,734 @@
25
16
  # path_ext = "my/path/show.php?p=aaa&debug=true"
26
17
 
27
18
  # @private
28
- module Watobo#:nodoc: all
19
+ module Watobo #:nodoc: all
29
20
  module Mixin
30
- module Parser
31
-
32
- module Parameters
33
- def each(prefs, &block)
34
-
35
-
36
- end
37
- end
38
-
39
- module Url
40
- include Watobo::Constants
41
- def file
42
- #@file ||= nil
43
- #return @file unless @file.nil?
44
- if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}[^\?]*\/(.*) HTTP.*/
45
- tmp = $1
46
- end_of_file_index = tmp.index(/\?/)
47
-
48
- if end_of_file_index.nil?
49
- @file = tmp
50
- elsif end_of_file_index == 0
51
- @file = ""
52
- else
53
- @file = tmp[0..end_of_file_index-1]
54
- end
21
+ module Parser
22
+
23
+ module Parameters
24
+ def each(prefs, &block)
25
+
55
26
 
56
- else
57
- @file = ""
58
27
  end
59
28
  end
60
29
 
61
- def file_ext
62
- #@file_ext ||= nil
63
- #return @file_ext unless @file_ext.nil?
64
- if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}[^\?]*\/(.*) HTTP.*/
65
- @file_ext = $1
66
- else
67
- @file_ext = ''
30
+ module Url
31
+ include Watobo::Constants
32
+
33
+ def file
34
+ #@file ||= nil
35
+ #return @file unless @file.nil?
36
+ if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}[^\?]*\/(.*) HTTP.*/
37
+ tmp = $1
38
+ end_of_file_index = tmp.index(/\?/)
39
+
40
+ if end_of_file_index.nil?
41
+ @file = tmp
42
+ elsif end_of_file_index == 0
43
+ @file = ""
44
+ else
45
+ @file = tmp[0..end_of_file_index-1]
46
+ end
47
+
48
+ else
49
+ @file = ""
50
+ end
68
51
  end
69
- end
70
52
 
71
- # returns a string containing all urlparms
72
- # e.g. "parm1=first&parm2=second"
73
- def urlparms
74
- begin
75
- off = self.first.index('?')
76
- return nil if off.nil?
77
- eop = self.first.index(' HTTP/')
78
- return nil if eop.nil?
79
- parms = self.first[off+1..eop-1]
80
- return parms
81
- rescue => bang
82
- puts bang
83
- puts bang.backtrace if $DEBUG
84
- end
85
- return nil
86
- end
53
+ def file_ext
54
+ #@file_ext ||= nil
55
+ #return @file_ext unless @file_ext.nil?
56
+ if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}[^\?]*\/(.*) HTTP.*/
57
+ @file_ext = $1
58
+ else
59
+ @file_ext = ''
60
+ end
61
+ end
87
62
 
88
- def method
89
- if self.first =~ /(^[^[:space:]]{1,}) /i then
90
- return $1
91
- else
63
+ # returns a string containing all urlparms
64
+ # e.g. "parm1=first&parm2=second"
65
+ def urlparms
66
+ begin
67
+ off = self.first.index('?')
68
+ return nil if off.nil?
69
+ eop = self.first.index(' HTTP/')
70
+ return nil if eop.nil?
71
+ parms = self.first[off+1..eop-1]
72
+ return parms
73
+ rescue => bang
74
+ puts bang
75
+ puts bang.backtrace if $DEBUG
76
+ end
92
77
  return nil
93
78
  end
94
- end
95
-
96
- def method_get?
97
- return false if method.nil?
98
- return true if method =~ /^get$/i
99
- return false
100
- end
101
-
102
- def method_post?
103
- return false if method.nil?
104
- return true if method =~ /^post$/i
105
- return false
106
- end
107
79
 
108
- #The path may consist of a sequence of path segments separated by a
109
- #single slash "/" character. Within a path segment, the characters
110
- #"/", ";", "=", and "?" are reserved. Each path segment may include a
111
- #sequence of parameters, indicated by the semicolon ";" character.
112
- #The parameters are not significant to the parsing of relative
113
- #references.
114
-
115
- #
116
- # http://www.mysite.com:80/my/path/show.php?p=aaa&debug=true
117
- # path = "my/path/show.php"
118
- def path
119
- if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}\/([^\?]*).* HTTP/i then
120
- return $1
121
- else
122
- return ""
80
+ def method
81
+ if self.first =~ /(^[^[:space:]]{1,}) /i then
82
+ return $1
83
+ else
84
+ return nil
85
+ end
123
86
  end
124
- end
125
87
 
126
- # path_ext = "my/path/show.php?p=aaa&debug=true"
127
- def path_ext
128
- if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}\/(.*) HTTP\//i then
129
- return $1
130
- else
131
- return ""
88
+ def method_get?
89
+ return false if method.nil?
90
+ return true if method =~ /^get$/i
91
+ return false
132
92
  end
133
- end
134
93
 
135
- def dir
136
- if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}\/([^\?]*)\/.* HTTP/i then
137
- return $1
138
- else
139
- return ""
94
+ def method_post?
95
+ return false if method.nil?
96
+ return true if method =~ /^post$/i
97
+ return false
140
98
  end
141
- end
142
99
 
143
- def query
144
- begin
145
- q = nil
146
- if self.first =~ /^[^[:space:]]{1,} (.*) HTTP.*/ then
147
- uri = $1
100
+ #The path may consist of a sequence of path segments separated by a
101
+ #single slash "/" character. Within a path segment, the characters
102
+ #"/", ";", "=", and "?" are reserved. Each path segment may include a
103
+ #sequence of parameters, indicated by the semicolon ";" character.
104
+ #The parameters are not significant to the parsing of relative
105
+ #references.
106
+
107
+ #
108
+ # http://www.mysite.com:80/my/path/show.php?p=aaa&debug=true
109
+ # path = "my/path/show.php"
110
+ def path
111
+ if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}\/([^\?]*).* HTTP/i then
112
+ return $1
113
+ else
114
+ return ""
148
115
  end
149
- off = uri.index('?')
150
- #parts.shift
151
- # puts "HTTPParser.query: #{parts.join('?')}"
152
- return "" if off.nil?
153
- return uri[off+1..-1]
154
- rescue => bang
155
- puts "!!! Could not parse query !!!"
156
- puts bang
157
- puts bang.backtrace if $DEBUG
158
116
  end
159
- return ''
160
117
 
161
- end
118
+ # path_ext = "my/path/show.php?p=aaa&debug=true"
119
+ def path_ext
120
+ if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}\/(.*) HTTP\//i then
121
+ return $1
122
+ else
123
+ return ""
124
+ end
125
+ end
162
126
 
163
- def element
164
- cl = self.first.gsub(/\?+/,"?")
165
- cl.gsub!(/ HTTP.*/, '')
166
- dummy = cl.split('?').first
167
- if dummy =~ /^[^[:space:]]{1,} ([a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}).*\/(.*)/i then
168
- return $2
169
- else
170
- return ""
127
+ def dir
128
+ if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}\/([^\?]*)\/.* HTTP/i then
129
+ return $1
130
+ else
131
+ return ""
132
+ end
171
133
  end
172
- end
173
134
 
174
- def doctype
175
- /.*\/.*?\.(\w{2,4})(\?| )/.match(self.first)
176
- # puts $1
177
- return $1 unless $1.nil?
178
- return ''
179
- #dummy = self.first.gsub(/\?+/,"?")
180
- #parts = dummy.split('?')
181
- #parts[0].gsub!(/ HTTP\/(.*)/i,"")
182
- #if parts[0] =~ /(.*\.)(\w{2,3})$/i then
183
- # return $2
184
- #else
185
- # return ''
186
- #end
187
- end
135
+ def query
136
+ begin
137
+ q = nil
138
+ if self.first =~ /^[^[:space:]]{1,} (.*) HTTP.*/ then
139
+ uri = $1
140
+ end
141
+ off = uri.index('?')
142
+ #parts.shift
143
+ # puts "HTTPParser.query: #{parts.join('?')}"
144
+ return "" if off.nil?
145
+ return uri[off+1..-1]
146
+ rescue => bang
147
+ puts "!!! Could not parse query !!!"
148
+ puts bang
149
+ puts bang.backtrace if $DEBUG
150
+ end
151
+ return ''
188
152
 
189
- def proto
190
- proto = "unknown"
191
- if self.first =~ /^[^[:space:]]{1,} ([a-zA-Z]+):\/\//i
192
- proto = $1
193
153
  end
194
- proto
195
- end
196
154
 
197
- def is_ssl?
198
- return true if self.first =~ /^[^[:space:]]{1,} https/i
199
- return false
200
- end
201
-
202
- def is_chunked?
203
- self.each do |h|
204
- return true if h =~ /^Transfer-Encoding.*chunked/i
205
- break if h.strip.empty?
155
+ def element
156
+ cl = self.first.gsub(/\?+/, "?")
157
+ cl.gsub!(/ HTTP.*/, '')
158
+ dummy = cl.split('?').first
159
+ if dummy =~ /^[^[:space:]]{1,} ([a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}).*\/(.*)/i then
160
+ return $2
161
+ else
162
+ return ""
163
+ end
206
164
  end
207
- return false
208
- end
209
165
 
210
- def url_string
211
- url = ''
212
- #return @url unless @url.nil?
213
- if self.first =~ /^[^[:space:]]{1,} ([a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}.*) HTTP\//i then
214
- url = $1
166
+ def doctype
167
+ /.*\/.*?\.(\w{2,4})(\?| )/.match(self.first)
168
+ # puts $1
169
+ return $1 unless $1.nil?
170
+ return ''
171
+ #dummy = self.first.gsub(/\?+/,"?")
172
+ #parts = dummy.split('?')
173
+ #parts[0].gsub!(/ HTTP\/(.*)/i,"")
174
+ #if parts[0] =~ /(.*\.)(\w{2,3})$/i then
175
+ # return $2
176
+ #else
177
+ # return ''
178
+ #end
179
+ end
180
+
181
+ def proto
182
+ proto = "unknown"
183
+ if self.first =~ /^[^[:space:]]{1,} ([a-zA-Z]+):\/\//i
184
+ proto = $1
185
+ end
186
+ proto
215
187
  end
216
- url
217
- end
218
- # alias :url :url_string
219
-
220
- def site
221
- #@site ||= nil
222
- #return @site unless @site.nil?
223
- if self.first =~ /^[^[:space:]]{1,} ([a-zA-Z]+):\/\/([\-0-9a-zA-Z.]*)([:0-9]{0,6})/i then
224
- host = $2
225
- port_extension = $3
226
- proto = $1
227
- s = host + port_extension
228
- if port_extension == ''
229
- s = host + ":" + DEFAULT_PORT_HTTPS.to_s if proto =~ /^https$/i
230
- s = host + ":" + DEFAULT_PORT_HTTP.to_s if proto =~ /^http$/i
231
- end
232
- @site = s
233
- else
234
- @site = nil
235
- end
236
- @site
237
- end
238
188
 
239
- def host
240
- #@host ||= nil
241
- #return @host unless @host.nil?
242
- #if self.first =~ /^[^[:space:]]{1,} https?:\/\/([\-0-9a-zA-Z.]*)[:0-9]{0,6}/i then
243
- if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/([\-0-9a-zA-Z.]*)[:0-9]{0,6}/i then
244
- @host = $1
245
- else
246
- @host = ''
189
+ def is_ssl?
190
+ return true if self.first =~ /^[^[:space:]]{1,} https/i
191
+ return false
247
192
  end
248
- @host
249
- end
250
193
 
251
- # returns all subdir combinations
252
- # www.company.com/this/is/my/path.php
253
- # returns:
254
- # [ "/this", "/this/is", "/this/is/my" ]
255
- def subDirs
256
- sub_dirs = self.dir.split(/\//)
257
- dir = ""
258
- sub_dirs.map! do |d| dir += "/" + d ; end
259
- return sub_dirs
260
- end
194
+ def is_chunked?
195
+ self.each do |h|
196
+ return true if h =~ /^Transfer-Encoding.*chunked/i
197
+ break if h.strip.empty?
198
+ end
199
+ return false
200
+ end
261
201
 
262
- def port
263
- return nil if self.first.nil?
264
- dummy = self.first
265
- portnum = nil
266
- parts = dummy.split('?')
202
+ def url_string
203
+ url = ''
204
+ #return @url unless @url.nil?
205
+ if self.first =~ /^[^[:space:]]{1,} ([a-zA-Z]+:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}.*) HTTP\//i then
206
+ url = $1
207
+ end
208
+ url
209
+ end
210
+
211
+ # alias :url :url_string
212
+
213
+ def site
214
+ #@site ||= nil
215
+ #return @site unless @site.nil?
216
+ if self.first =~ /^[^[:space:]]{1,} ([a-zA-Z]+):\/\/([\-0-9a-zA-Z.]*)([:0-9]{0,6})/i then
217
+ host = $2
218
+ port_extension = $3
219
+ proto = $1
220
+ s = host + port_extension
221
+ if port_extension == ''
222
+ s = host + ":" + DEFAULT_PORT_HTTPS.to_s if proto =~ /^https$/i
223
+ s = host + ":" + DEFAULT_PORT_HTTP.to_s if proto =~ /^http$/i
224
+ end
225
+ @site = s
226
+ else
227
+ @site = nil
228
+ end
229
+ @site
230
+ end
267
231
 
268
- if parts[0] =~ /^[^[:space:]]{1,} https:\/\//i then
269
- portnum = 443
270
- elsif parts[0] =~ /^[^[:space:]]{1,} http:\/\//i
271
- portnum = 80
232
+ def host
233
+ #@host ||= nil
234
+ #return @host unless @host.nil?
235
+ #if self.first =~ /^[^[:space:]]{1,} https?:\/\/([\-0-9a-zA-Z.]*)[:0-9]{0,6}/i then
236
+ if self.first =~ /^[^[:space:]]{1,} [a-zA-Z]+:\/\/([\-0-9a-zA-Z.]*)[:0-9]{0,6}/i then
237
+ @host = $1
238
+ else
239
+ @host = ''
240
+ end
241
+ @host
242
+ end
243
+
244
+ # returns all subdir combinations
245
+ # www.company.com/this/is/my/path.php
246
+ # returns:
247
+ # [ "/this", "/this/is", "/this/is/my" ]
248
+ def subDirs
249
+ sub_dirs = self.dir.split(/\//)
250
+ dir = ""
251
+ sub_dirs.map! do |d|
252
+ dir += "/" + d;
253
+ end
254
+ return sub_dirs
272
255
  end
273
- if parts[0] =~ /^[^[:space:]]{1,} https?:\/\/[\-0-9a-zA-Z.]*:([0-9]{0,6})/i then
274
- portnum = $1
256
+
257
+ def port
258
+ return nil if self.first.nil?
259
+ dummy = self.first
260
+ portnum = nil
261
+ parts = dummy.split('?')
262
+
263
+ if parts[0] =~ /^[^[:space:]]{1,} https:\/\//i then
264
+ portnum = 443
265
+ elsif parts[0] =~ /^[^[:space:]]{1,} http:\/\//i
266
+ portnum = 80
267
+ end
268
+ if parts[0] =~ /^[^[:space:]]{1,} https?:\/\/[\-0-9a-zA-Z.]*:([0-9]{0,6})/i then
269
+ portnum = $1
270
+ end
271
+ return portnum
275
272
  end
276
- return portnum
277
- end
278
273
 
279
- # get_parms returns an array of parm=value
280
- def get_parms
281
- begin
282
- off = self.first.index('?')
283
- return [] if off.nil?
284
- eop = self.first.index(' HTTP/')
285
- return [] if eop.nil?
286
- parms = self.first[off+1..eop-1].split('&').select {|x| x =~ /=/ }
287
- # puts parms
288
- return parms
289
- rescue => bang
290
- puts bang
291
- puts bang.backtrace if $DEBUG
292
- end
293
- return []
294
- #parmlist=[]
295
- #if self.first =~ /^[^[:space:]]{1,} (https?:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}).*\/.*(\?.*=.*) HTTP/i then
296
- # dummy = $2.gsub!(/\?+/,"?").split('?')
297
- # remove left part of ? from url
298
- # dummy.shift
299
-
300
- # parmlist=dummy.join.split(/\&/)
301
- #end
302
- #return parmlist
274
+ # get_parms returns an array of parm=value
275
+ def get_parms
276
+ begin
277
+ off = self.first.index('?')
278
+ return [] if off.nil?
279
+ eop = self.first.index(' HTTP/')
280
+ return [] if eop.nil?
281
+ parms = self.first[off+1..eop-1].split('&').select { |x| x =~ /=/ }
282
+ # puts parms
283
+ return parms
284
+ rescue => bang
285
+ puts bang
286
+ puts bang.backtrace if $DEBUG
287
+ end
288
+ return []
289
+ #parmlist=[]
290
+ #if self.first =~ /^[^[:space:]]{1,} (https?:\/\/[\-0-9a-zA-Z.]*[:0-9]{0,6}).*\/.*(\?.*=.*) HTTP/i then
291
+ # dummy = $2.gsub!(/\?+/,"?").split('?')
292
+ # remove left part of ? from url
293
+ # dummy.shift
303
294
 
304
- end
295
+ # parmlist=dummy.join.split(/\&/)
296
+ #end
297
+ #return parmlist
305
298
 
306
- #################### doubles
299
+ end
300
+
301
+ #################### doubles
307
302
 
308
- def get_parm_names(&block)
303
+ def get_parm_names(&block)
309
304
 
310
- parm_names=[]
311
- parmlist=[]
312
- parmlist.concat(get_parms)
305
+ parm_names=[]
306
+ parmlist=[]
307
+ parmlist.concat(get_parms)
313
308
 
314
- parmlist.each do |p|
315
- if p then
316
- p.gsub!(/=.*/,'')
317
- yield p if block_given?
318
- parm_names.push p
309
+ parmlist.each do |p|
310
+ if p then
311
+ p.gsub!(/=.*/, '')
312
+ yield p if block_given?
313
+ parm_names.push p
314
+ end
319
315
  end
320
- end
321
316
 
322
- return parm_names
317
+ return parm_names
323
318
 
324
- end
319
+ end
325
320
 
326
- def get_parm_value(parm_name)
327
- parm_value = ""
328
- self.get_parms.each do |parm|
329
- if parm =~ /^#{Regexp.quote(parm_name)}=/i then
330
- dummy = parm.split(/=/)
331
- if dummy.length > 1 then
332
- # parm_value=dummy[1].gsub(/^[ ]*/,"")
333
- parm_value=dummy[1].strip
321
+ def get_parm_value(parm_name)
322
+ parm_value = ""
323
+ self.get_parms.each do |parm|
324
+ if parm =~ /^#{Regexp.quote(parm_name)}=/i then
325
+ dummy = parm.split(/=/)
326
+ if dummy.length > 1 then
327
+ # parm_value=dummy[1].gsub(/^[ ]*/,"")
328
+ parm_value=dummy[1].strip
329
+ end
334
330
  end
335
331
  end
332
+ return parm_value
333
+ end
334
+
335
+ def post_parm_value(parm_name)
336
+ parm_value=""
337
+ self.post_parms.each do |parm|
338
+ if parm =~ /#{Regexp.quote(parm_name)}/i then
339
+ dummy = parm.split(/=/)
340
+ if dummy.length > 1 then
341
+ parm_value = dummy[1].strip
342
+ else
343
+ # puts "Uhhhh ... need parameter value from '#{parm}''"
344
+ end
345
+ end
346
+ end
347
+ return parm_value
336
348
  end
337
- return parm_value
349
+
338
350
  end
339
351
 
340
- def post_parm_value(parm_name)
341
- parm_value=""
342
- self.post_parms.each do |parm|
343
- if parm =~ /#{Regexp.quote(parm_name)}/i then
344
- dummy = parm.split(/=/)
345
- if dummy.length > 1 then
346
- parm_value = dummy[1].strip
347
- else
348
- # puts "Uhhhh ... need parameter value from '#{parm}''"
352
+ module Web10
353
+ include Watobo::Constants
354
+
355
+ def post_parms
356
+ parmlist=[]
357
+ return parmlist unless has_body?
358
+ begin
359
+ if self.last =~ /\=.*\&?/i
360
+ parmlist = self.last.split(/\&/)
361
+ parmlist.map! { |p| x = p.strip.empty? ? nil : p }
362
+ parmlist.compact!
363
+ end
364
+ rescue => bang
365
+ # puts self.last.unpack("C*").pack("C*").gsub(/[^[:print:]]/,".")
366
+ if $DEBUG
367
+ puts bang
368
+ puts bang.backtrace
369
+
349
370
  end
350
371
  end
372
+ return parmlist
351
373
  end
352
- return parm_value
353
- end
354
374
 
355
- end
375
+ def parms
376
+ parmlist=[]
377
+ parmlist.concat(get_parms)
378
+ parmlist.concat(post_parms)
356
379
 
357
- module Web10
358
- include Watobo::Constants
359
- def post_parms
360
- parmlist=[]
361
- return parmlist unless has_body?
362
- begin
363
- if self.last =~ /\=.*\&?/i
364
- parmlist = self.last.split(/\&/)
365
- parmlist.map!{|p| x = p.strip.empty? ? nil : p }
366
- parmlist.compact!
367
- end
368
- rescue => bang
369
- # puts self.last.unpack("C*").pack("C*").gsub(/[^[:print:]]/,".")
370
- if $DEBUG
371
- puts bang
372
- puts bang.backtrace
373
-
374
- end
380
+ return parmlist
375
381
  end
376
- return parmlist
377
- end
378
382
 
379
- def parms
380
- parmlist=[]
381
- parmlist.concat(get_parms)
382
- parmlist.concat(post_parms)
383
+ def parm_names
384
+ parm_names=[]
385
+ parmlist=[]
386
+ parmlist.concat(get_parms)
387
+ parmlist.concat(post_parms)
388
+ parmlist.each do |p|
389
+ p.gsub!(/=.*/, '')
390
+ parm_names.push p
391
+ end
383
392
 
384
- return parmlist
385
- end
393
+ return parm_names
386
394
 
387
- def parm_names
388
- parm_names=[]
389
- parmlist=[]
390
- parmlist.concat(get_parms)
391
- parmlist.concat(post_parms)
392
- parmlist.each do |p|
393
- p.gsub!(/=.*/,'')
394
- parm_names.push p
395
395
  end
396
396
 
397
- return parm_names
397
+ def post_parm_names(&block)
398
398
 
399
- end
399
+ parm_names=[]
400
+ parmlist=[]
400
401
 
401
- def post_parm_names(&block)
402
+ parmlist.concat(post_parms)
403
+ parmlist.each do |p|
404
+ if p then
405
+ p.gsub!(/=.*/, '')
406
+ p.strip!
407
+ yield p if block_given?
408
+ parm_names << p
409
+ end
410
+ end
402
411
 
403
- parm_names=[]
404
- parmlist=[]
412
+ return parm_names
405
413
 
406
- parmlist.concat(post_parms)
407
- parmlist.each do |p|
408
- if p then
409
- p.gsub!(/=.*/,'')
410
- p.strip!
411
- yield p if block_given?
412
- parm_names << p
413
- end
414
414
  end
415
415
 
416
- return parm_names
417
416
 
418
- end
417
+ def header_value(header_name)
418
+ header_values =[]
419
+ self.headers.each do |header|
420
+ begin
421
+ if header =~ /^#{header_name}/i then
422
+ vstart = header.index ':'
423
+ unless vstart.nil?
424
+ header_values.push header[vstart+1..-1].strip
425
+ end
426
+ end
427
+ rescue => bang
428
+ puts bang
429
+ puts bang.backtrace if $DEBUG
430
+ end
431
+ end
432
+ return header_values
433
+ end
434
+
435
+ def content_type(default_ct='undefined')
436
+ ct = default_ct
437
+ self.each do |line|
438
+ begin
439
+ break if line.strip.empty?
440
+ #cl = line.encode('ASCII', :invalid => :replace, :undef => :replace)
441
+ cl = line.force_encoding('ASCII-8BIT')
442
+ if cl =~ /^Content-Type:([^;]*);?/i then
443
+ ct = $1
444
+ break
445
+ end
446
+ rescue => bang
447
+ puts "! could not parse content_type !"
448
+ puts bang
449
+ puts cl
450
+ # puts cl.gsub(/[^[:print:]]/, '.')
419
451
 
420
-
421
- def header_value(header_name)
422
- header_values =[]
423
- self.headers.each do |header|
424
- begin
425
- if header =~ /^#{header_name}/i then
426
- vstart = header.index ':'
427
- unless vstart.nil?
428
- header_values.push header[vstart+1..-1].strip
429
452
  end
430
453
  end
431
- rescue => bang
432
- puts bang
433
- puts bang.backtrace if $DEBUG
454
+ return ct.strip
455
+ end
456
+
457
+ def content_type_ex(default_ct='undefined')
458
+ ct = default_ct
459
+ self.each do |line|
460
+ break if line.strip.empty?
461
+ # cl = line.encode('ASCII', :invalid => :replace, :undef => :replace)
462
+ cl = line.force_encoding('ASCII-8BIT')
463
+ if cl =~ /^Content-Type:(.*)/i then
464
+ ct = $1.strip
465
+ break
466
+ end
467
+ end
468
+ return ct.strip
469
+ end
470
+
471
+ def content_length
472
+ # Note: Calculate Chunk-Encoded Content-Length
473
+ # this is only possible if the whole body is loaded???
474
+ ct = -1
475
+ self.each do |line|
476
+ break if line.strip.empty?
477
+ if line =~ /^Content-Length:(.*)/i then
478
+ ct = $1.strip.to_i
479
+ break
480
+ end
434
481
  end
482
+ return ct
483
+ end
484
+
485
+ def content_encoding
486
+ te = TE_NONE
487
+ self.each do |line|
488
+ break if line.strip.empty?
489
+ if line =~ /^Content-Encoding:(.*)/i then
490
+ dummy = $1.strip
491
+ # puts "Content-Encoding => #{dummy}"
492
+ te = case dummy
493
+ when /chunked/i
494
+ TE_CHUNKED
495
+ when /compress/i
496
+ TE_COMPRESS
497
+ when /zip/i
498
+ TE_GZIP
499
+ when /deflate/i
500
+ TE_DEFLATE
501
+ when /identity/i
502
+ TE_IDENTITY
503
+ else
504
+ TE_NONE
505
+ end
506
+ break
507
+ end
508
+ end
509
+ return te
510
+ end
511
+
512
+ def transferEncoding
513
+ te = TE_NONE
514
+ self.each do |line|
515
+ break if line.strip.empty?
516
+ if line =~ /^Transfer-Encoding:(.*)/i then
517
+ dummy = $1.strip
518
+ # puts dummy
519
+ te = case dummy
520
+ when 'chunked'
521
+ TE_CHUNKED
522
+ when 'compress'
523
+ TE_COMPRESS
524
+ when 'zip'
525
+ TE_GZIP
526
+ when 'deflate'
527
+ TE_DEFLATE
528
+ when 'identity'
529
+ TE_IDENTITY
530
+ else
531
+ TE_NONE
532
+ end
533
+ break
534
+ end
535
+ end
536
+ return te
537
+ end
538
+
539
+ alias :transfer_encoding :transferEncoding
540
+
541
+ def contentMD5
542
+ b = self.body.nil? ? "" : self.body
543
+ hash = Digest::MD5.hexdigest(b)
544
+ return hash
545
+ end
546
+
547
+ # def get_parm_value(parm_name)
548
+ # parm_value = ""
549
+ # self.get_parms.each do |parm|
550
+ # if parm =~ /^#{Regexp.quote(parm_name)}=/i then
551
+ # dummy = parm.split(/=/)
552
+ # if dummy.length > 1 then
553
+ # # parm_value=dummy[1].gsub(/^[ ]*/,"")
554
+ # parm_value=dummy[1].strip
555
+ # end
556
+ # end
557
+ # end
558
+ # return parm_value
559
+ # end
560
+
561
+ def post_parm_value(parm_name)
562
+ parm_value=""
563
+ self.post_parms.each do |parm|
564
+ if parm =~ /#{Regexp.quote(parm_name)}/i then
565
+ dummy = parm.split(/=/)
566
+ if dummy.length > 1 then
567
+ parm_value = dummy[1].strip
568
+ else
569
+ # puts "Uhhhh ... need parameter value from '#{parm}''"
570
+ end
571
+ end
572
+ end
573
+ return parm_value
435
574
  end
436
- return header_values
437
- end
438
575
 
439
- def content_type(default_ct='undefined')
440
- ct = default_ct
441
- self.each do |line|
442
- begin
443
- break if line.strip.empty?
444
- #cl = line.encode('ASCII', :invalid => :replace, :undef => :replace)
445
- cl = line.force_encoding('ASCII-8BIT')
446
- if cl =~ /^Content-Type:([^;]*);?/i then
447
- ct = $1
448
- break
449
- end
450
- rescue => bang
451
- puts "! could not parse content_type !"
452
- puts bang
453
- puts cl
454
- # puts cl.gsub(/[^[:print:]]/, '.')
576
+ def has_body?
577
+ self.body.nil? ? false : true
578
+ end
455
579
 
580
+ def __connection_close?
581
+ headers("Connection") do |h|
582
+ return true if h =~ /close/i
456
583
  end
584
+ return false
457
585
  end
458
- return ct.strip
459
- end
460
-
461
- def content_type_ex(default_ct='undefined')
462
- ct = default_ct
463
- self.each do |line|
464
- break if line.strip.empty?
465
- # cl = line.encode('ASCII', :invalid => :replace, :undef => :replace)
466
- cl = line.force_encoding('ASCII-8BIT')
467
- if cl =~ /^Content-Type:(.*)/i then
468
- ct = $1.strip
469
- break
470
- end
471
- end
472
- return ct.strip
473
- end
474
586
 
475
- def content_length
476
- # Note: Calculate Chunk-Encoded Content-Length
477
- # this is only possible if the whole body is loaded???
478
- ct = -1
479
- self.each do |line|
480
- break if line.strip.empty?
481
- if line =~ /^Content-Length:(.*)/i then
482
- ct = $1.strip.to_i
483
- break
587
+ def connection_close?
588
+ headers("Connection") do |h|
589
+ return false if h =~ /keep\-alive/i
484
590
  end
591
+ return true
485
592
  end
486
- return ct
487
- end
488
593
 
489
- def content_encoding
490
- te = TE_NONE
491
- self.each do |line|
492
- break if line.strip.empty?
493
- if line =~ /^Content-Encoding:(.*)/i then
494
- dummy = $1.strip
495
- # puts "Content-Encoding => #{dummy}"
496
- te = case dummy
497
- when /chunked/i
498
- TE_CHUNKED
499
- when /compress/i
500
- TE_COMPRESS
501
- when /zip/i
502
- TE_GZIP
503
- when /deflate/i
504
- TE_DEFLATE
505
- when /identity/i
506
- TE_IDENTITY
507
- else
508
- TE_NONE
509
- end
510
- break
594
+ def has_header?(name)
595
+ self.each do |l|
596
+ return false if l.strip.empty?
597
+ return true if l =~ /^#{name}:/i
511
598
  end
599
+ return false
512
600
  end
513
- return te
514
- end
515
-
516
- def transferEncoding
517
- te = TE_NONE
518
- self.each do |line|
519
- break if line.strip.empty?
520
- if line =~ /^Transfer-Encoding:(.*)/i then
521
- dummy = $1.strip
522
- # puts dummy
523
- te = case dummy
524
- when 'chunked'
525
- TE_CHUNKED
526
- when 'compress'
527
- TE_COMPRESS
528
- when 'zip'
529
- TE_GZIP
530
- when 'deflate'
531
- TE_DEFLATE
532
- when 'identity'
533
- TE_IDENTITY
534
- else
535
- TE_NONE
536
- end
537
- break
601
+
602
+ def body
603
+ begin
604
+ return nil if self.nil? or self.length < 3
605
+ return "#{self.last}" if self[-2].strip.empty?
606
+ rescue
607
+ return nil
538
608
  end
609
+ nil
539
610
  end
540
- return te
541
- end
542
-
543
- alias :transfer_encoding :transferEncoding
544
611
 
545
- def contentMD5
546
- b = self.body.nil? ? "" : self.body
547
- hash = Digest::MD5.hexdigest(b)
548
- return hash
549
- end
550
-
551
- # def get_parm_value(parm_name)
552
- # parm_value = ""
553
- # self.get_parms.each do |parm|
554
- # if parm =~ /^#{Regexp.quote(parm_name)}=/i then
555
- # dummy = parm.split(/=/)
556
- # if dummy.length > 1 then
557
- # # parm_value=dummy[1].gsub(/^[ ]*/,"")
558
- # parm_value=dummy[1].strip
559
- # end
560
- # end
561
- # end
562
- # return parm_value
563
- # end
564
-
565
- def post_parm_value(parm_name)
566
- parm_value=""
567
- self.post_parms.each do |parm|
568
- if parm =~ /#{Regexp.quote(parm_name)}/i then
569
- dummy = parm.split(/=/)
570
- if dummy.length > 1 then
571
- parm_value = dummy[1].strip
572
- else
573
- # puts "Uhhhh ... need parameter value from '#{parm}''"
574
- end
612
+ def is_text?
613
+ ct = self.content_type(nil)
614
+ if ct.nil?
615
+ return true if self.body_encoded.ascii_only?
616
+ return false
617
+ else
618
+ return true if ct =~ /text/i
619
+ return false
575
620
  end
576
621
  end
577
- return parm_value
578
- end
579
622
 
580
- def has_body?
581
- self.body.nil? ? false : true
582
- end
583
-
584
- def __connection_close?
585
- headers("Connection") do |h|
586
- return true if h =~ /close/i
587
- end
588
- return false
589
- end
590
-
591
- def connection_close?
592
- headers("Connection") do |h|
593
- return false if h =~ /keep\-alive/i
623
+ def is_wwwform?
624
+ ct = self.content_type
625
+ return true if ct =~ /form/i
626
+ return false
594
627
  end
595
- return true
596
- end
597
628
 
598
- def has_header?(name)
599
- self.each do |l|
600
- return false if l.strip.empty?
601
- return true if l =~ /^#{name}:/i
629
+ def is_json?
630
+ ct = self.content_type
631
+ return true if ct =~ /\/json/i
632
+ return false
602
633
  end
603
- return false
604
- end
605
634
 
606
- def body
607
- begin
608
- return nil if self.nil? or self.length < 3
609
- return "#{self.last}" if self[-2].strip.empty?
610
- rescue
611
- return nil
612
- end
613
- nil
614
- end
615
-
616
- def is_text?
617
- ct = self.content_type(nil)
618
- if ct.nil?
619
- return true if self.body_encoded.ascii_only?
620
- return false
621
- else
622
- return true if ct =~ /text/i
635
+ def is_xml?
636
+ ct = self.content_type
637
+ return true if ct =~ /xml/i
623
638
  return false
624
639
  end
625
- end
626
-
627
- def is_wwwform?
628
- ct = self.content_type
629
- return true if ct =~ /form/i
630
- return false
631
- end
632
-
633
- def is_json?
634
- ct = self.content_type
635
- return true if ct =~ /\/json/i
636
- return false
637
- end
638
-
639
- def is_xml?
640
- ct = self.content_type
641
- return true if ct =~ /xml/i
642
- return false
643
- end
644
-
645
- def is_multipart?
646
- ct = self.content_type
647
- return true if ct =~ /^multipart/i
648
- return false
649
- end
650
-
651
- def body_encoded
652
- b = self.body
653
- return nil if b.nil?
654
-
655
- cs = self.charset
656
- return b.unpack("C*").pack("C*") if cs.nil?
657
-
658
- begin
659
- # not sure if this is a good idea???
660
- #return b.encode(cs, :invalid => :replace, :undef => :replace, :replace => '').unpack("C*").pack("C*")
661
- rescue => bang
662
- if $DEBUG
663
- puts bang
664
- puts bang.backtrace
665
- end
666
- end
667
- return b.unpack("C*").pack("C*")
668
- end
669
640
 
670
- def status_code
671
- if self.first =~ /^HTTP\/... (\d+) /
672
- return $1
673
- else
674
- return nil
641
+ def is_multipart?
642
+ ct = self.content_type
643
+ return true if ct =~ /^multipart/i
644
+ return false
675
645
  end
676
- end
677
-
678
- alias :responseCode :status_code
679
-
680
- # returns array of new cookies
681
- # Set-Cookie: mycookie=b41dc9e55d6163f78321996b10c940edcec1b4e55a76464c4e9d25e160ac0ec5b769806b; Path=/
682
- def new_cookies(&b)
683
- nc = []
684
- headers("Set-Cookie") do |h|
685
- cookie = Watobo::Cookie.new(h)
686
- yield cookie if block_given?
687
- nc << cookie
688
- end
689
- nc
690
- end
691
646
 
692
- def status
693
- begin
694
- # Filter bad utf-8 chars
695
- dummy = self.first.unpack("C*").pack("C*")
647
+ def body_encoded
648
+ b = self.body
649
+ return nil if b.nil?
696
650
 
697
- if dummy =~ /^HTTP\/1\.\d{1,2} (.*)/i then
698
- return $1.chomp
699
- else
700
- return ''
651
+ cs = self.charset
652
+ return b.unpack("C*").pack("C*") if cs.nil?
653
+
654
+ begin
655
+ # not sure if this is a good idea???
656
+ #return b.encode(cs, :invalid => :replace, :undef => :replace, :replace => '').unpack("C*").pack("C*")
657
+ rescue => bang
658
+ if $DEBUG
659
+ puts bang
660
+ puts bang.backtrace
661
+ end
662
+ end
663
+ return b.unpack("C*").pack("C*")
701
664
  end
702
- rescue => bang
703
- if $DEBUG
704
- puts "! No Status Available !".upcase
705
- puts bang
706
- puts bang.backtrace
707
- end
708
- return nil
665
+
666
+ def status_code
667
+ if self.first =~ /^HTTP\/... (\d+) /
668
+ return $1
669
+ else
670
+ return nil
671
+ end
709
672
  end
710
- end
711
-
712
- def charset
713
- cs = nil
714
- self.each do |line|
715
- break if line.strip.empty?
716
- if line =~ /^Content-Type: .*charset=([^;]*)/i then
717
- cs = $1.strip
718
- break
673
+
674
+ alias :responseCode :status_code
675
+
676
+ # returns array of new cookies
677
+ # Set-Cookie: mycookie=b41dc9e55d6163f78321996b10c940edcec1b4e55a76464c4e9d25e160ac0ec5b769806b; Path=/
678
+ def new_cookies(&b)
679
+ nc = []
680
+ headers("Set-Cookie") do |h|
681
+ cookie = Watobo::Cookie.new(h)
682
+ yield cookie if block_given?
683
+ nc << cookie
719
684
  end
685
+ nc
720
686
  end
721
- return cs
722
- end
723
687
 
724
- def headers(filter=nil, &b)
725
- begin
726
- filter = '.*' if filter.nil?
727
- header_list=[]
728
- self.each do |line|
729
- cl = line.force_encoding('ASCII-8BIT')
730
- return header_list if cl.strip.empty?
731
- if cl =~ /#{filter}/
732
- yield line if block_given?
733
- header_list.push line
734
- end
735
- end
736
- return header_list
737
- rescue => bang
738
- puts bang
739
- puts bang.backtrace
740
- if $DEBUG
741
- puts bang.backtrace
742
- puts self.to_yaml
688
+ def status
689
+ begin
690
+ # Filter bad utf-8 chars
691
+ dummy = self.first.nil? ? '' : self.first.unpack("C*").pack("C*")
692
+
693
+ if dummy =~ /^HTTP\/1\.\d{1,2} (.*)/i then
694
+ return $1.chomp
695
+ else
696
+ return ''
697
+ end
698
+ rescue => bang
699
+ if $DEBUG
700
+ puts "! No Status Available !".upcase
701
+ puts bang
702
+ puts bang.backtrace
703
+ end
704
+ return nil
743
705
  end
744
- return nil
745
706
  end
746
- end
747
707
 
748
- def cookies_UNUSED
749
- cookie_list=[]
750
- self.headers.each do |line|
751
- if line =~ /Cookie2?: (.*)/i then
752
- clist = $1.split(";")
753
- clist.each do |c|
754
- # c.gsub!(/^[ ]+/,"")
755
- # c.chomp!
756
- cookie_list.push c.strip
708
+ def charset
709
+ cs = nil
710
+ self.each do |line|
711
+ break if line.strip.empty?
712
+ if line =~ /^Content-Type: .*charset=([^;]*)/i then
713
+ cs = $1.strip
714
+ break
757
715
  end
758
716
  end
717
+ return cs
718
+ end
719
+
720
+ def headers(filter=nil, &b)
721
+ begin
722
+ filter = '.*' if filter.nil?
723
+ header_list=[]
724
+ self.each do |line|
725
+ cl = line.force_encoding('ASCII-8BIT')
726
+ return header_list if cl.strip.empty?
727
+ if cl =~ /#{filter}/
728
+ yield line if block_given?
729
+ header_list.push line
730
+ end
731
+ end
732
+ return header_list
733
+ rescue => bang
734
+ puts bang
735
+ puts bang.backtrace
736
+ if $DEBUG
737
+ puts bang.backtrace
738
+ puts self.to_yaml
739
+ end
740
+ return nil
741
+ end
759
742
  end
760
- return cookie_list
761
- end
762
743
 
763
- def data_UNUSED
764
- return self.last.strip if self.last =~ /\=.*\&?/i
765
- return ""
766
744
  end
767
745
 
768
- end
769
746
 
770
-
771
747
  end
772
748
  end
773
749
  end