Sipper 1.1.3

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 (326) hide show
  1. data/sipper/README.rb +26 -0
  2. data/sipper/b2bua_controller.rb +163 -0
  3. data/sipper/b2bua_session_mixin.rb +24 -0
  4. data/sipper/base_controller.rb +425 -0
  5. data/sipper/bin/common.rb +42 -0
  6. data/sipper/bin/generate.rb +70 -0
  7. data/sipper/bin/project.rb +44 -0
  8. data/sipper/bin/run.rb +85 -0
  9. data/sipper/bin/run_smoke.rb +8 -0
  10. data/sipper/config/log4r.xml +71 -0
  11. data/sipper/controller_class_loader.rb +29 -0
  12. data/sipper/controller_selector.rb +119 -0
  13. data/sipper/controllers/invite_controller.rb +30 -0
  14. data/sipper/controllers/order.yaml +3 -0
  15. data/sipper/custom_message.rb +4 -0
  16. data/sipper/detached_session.rb +11 -0
  17. data/sipper/docs/manual.txt +1621 -0
  18. data/sipper/generators/README +12 -0
  19. data/sipper/generators/gen_controller.rb +228 -0
  20. data/sipper/generators/gen_project.rb +45 -0
  21. data/sipper/generators/gen_test.rb +72 -0
  22. data/sipper/generators/project_template_dir/Rakefile +56 -0
  23. data/sipper/generators/project_template_dir/config/sipper.cfg +31 -0
  24. data/sipper/generators/project_template_dir/controllers/README.txt +2 -0
  25. data/sipper/generators/project_template_dir/dot_sipper.proj +2 -0
  26. data/sipper/generators/project_template_dir/logs/README.txt +2 -0
  27. data/sipper/generators/project_template_dir/tests/README.txt +2 -0
  28. data/sipper/lib/smc/statemap.rb +194 -0
  29. data/sipper/logs/dialog_info_store +0 -0
  30. data/sipper/logs/r.cmd +6 -0
  31. data/sipper/logs/r.sh +6 -0
  32. data/sipper/media/sipper_media_client.rb +268 -0
  33. data/sipper/media/sipper_media_event.rb +43 -0
  34. data/sipper/media/sipper_media_manager.rb +145 -0
  35. data/sipper/media/sipper_media_proxy.rb +60 -0
  36. data/sipper/media/sipper_offer_answer.rb +285 -0
  37. data/sipper/message.rb +512 -0
  38. data/sipper/modified_pattern_formatter.rb +119 -0
  39. data/sipper/proxy_controller.rb +143 -0
  40. data/sipper/registration.rb +52 -0
  41. data/sipper/request.rb +109 -0
  42. data/sipper/response.rb +123 -0
  43. data/sipper/ruby_ext/module.rb +27 -0
  44. data/sipper/ruby_ext/mutable_class.rb +17 -0
  45. data/sipper/ruby_ext/object.rb +38 -0
  46. data/sipper/ruby_ext/pqueue.rb +190 -0
  47. data/sipper/ruby_ext/snapshot.rb +201 -0
  48. data/sipper/ruby_ext/string.rb +18 -0
  49. data/sipper/ruby_ext/time.rb +9 -0
  50. data/sipper/run/run_sipper1.rb +28 -0
  51. data/sipper/run/run_sipper2.rb +56 -0
  52. data/sipper/sdp/sdp.rb +257 -0
  53. data/sipper/sdp/sdp_generator.rb +131 -0
  54. data/sipper/sdp/sdp_parser.rb +136 -0
  55. data/sipper/session.rb +1952 -0
  56. data/sipper/session_manager.rb +170 -0
  57. data/sipper/session_recorder.rb +190 -0
  58. data/sipper/session_state/DialogState.sm +54 -0
  59. data/sipper/session_state/DialogState_sm.rb +337 -0
  60. data/sipper/session_state/dialog_routes.rb +141 -0
  61. data/sipper/sip_headers/header.rb +632 -0
  62. data/sipper/sip_headers/sipuri.rb +352 -0
  63. data/sipper/sip_logger.rb +65 -0
  64. data/sipper/sip_message_router.rb +231 -0
  65. data/sipper/sip_test_driver_controller.rb +10 -0
  66. data/sipper/sipper.rb +329 -0
  67. data/sipper/sipper_assertions.rb +21 -0
  68. data/sipper/sipper_configurator.rb +376 -0
  69. data/sipper/sipper_http/sipper_http_request_dispatcher.rb +71 -0
  70. data/sipper/sipper_http/sipper_http_response.rb +25 -0
  71. data/sipper/stray_message_manager.rb +40 -0
  72. data/sipper/test_completion_signaling_helper.rb +77 -0
  73. data/sipper/transaction/Ict.sm +59 -0
  74. data/sipper/transaction/Ict_sm.rb +430 -0
  75. data/sipper/transaction/Ist.sm +74 -0
  76. data/sipper/transaction/Ist_sm.rb +460 -0
  77. data/sipper/transaction/Nict.sm +51 -0
  78. data/sipper/transaction/Nict_sm.rb +325 -0
  79. data/sipper/transaction/Nist.sm +59 -0
  80. data/sipper/transaction/Nist_sm.rb +356 -0
  81. data/sipper/transaction/invite_client_transaction.rb +274 -0
  82. data/sipper/transaction/invite_server_transaction.rb +319 -0
  83. data/sipper/transaction/non_invite_client_transaction.rb +230 -0
  84. data/sipper/transaction/non_invite_server_transaction.rb +263 -0
  85. data/sipper/transaction/state_machine_wrapper.rb +58 -0
  86. data/sipper/transaction/transaction.rb +212 -0
  87. data/sipper/transport/base_transport.rb +84 -0
  88. data/sipper/transport/rel_unrel.rb +19 -0
  89. data/sipper/transport/transport_and_route_resolver.rb +67 -0
  90. data/sipper/transport/udp_transport.rb +156 -0
  91. data/sipper/transport_manager.rb +33 -0
  92. data/sipper/udp_session.rb +17 -0
  93. data/sipper/util/command_element.rb +62 -0
  94. data/sipper/util/compact_converter.rb +50 -0
  95. data/sipper/util/counter.rb +26 -0
  96. data/sipper/util/digest/digest_authorizer.rb +204 -0
  97. data/sipper/util/expectation_parser.rb +164 -0
  98. data/sipper/util/locator.rb +31 -0
  99. data/sipper/util/message_fill.rb +58 -0
  100. data/sipper/util/persistence/ps_sipper_map.rb +63 -0
  101. data/sipper/util/persistence/sipper_map.rb +41 -0
  102. data/sipper/util/sipper_util.rb +305 -0
  103. data/sipper/util/timer/sip_timer_helper.rb +26 -0
  104. data/sipper/util/timer/timer_manager.rb +80 -0
  105. data/sipper/util/timer/timer_task.rb +56 -0
  106. data/sipper/util/validations.rb +44 -0
  107. data/sipper/version.rb +10 -0
  108. data/sipper_test/_test_media_uas.rb +79 -0
  109. data/sipper_test/base_test_case.rb +31 -0
  110. data/sipper_test/c_134.txt +7 -0
  111. data/sipper_test/driven_sip_test_case.rb +96 -0
  112. data/sipper_test/gold.txt +10 -0
  113. data/sipper_test/gold_res.txt +8 -0
  114. data/sipper_test/gold_sub.txt +9 -0
  115. data/sipper_test/hello_sipper.au +0 -0
  116. data/sipper_test/in_sipper.au +0 -0
  117. data/sipper_test/nonrr_proxy.rb +17 -0
  118. data/sipper_test/order_tests.yaml +4 -0
  119. data/sipper_test/rake_res.txt +399 -0
  120. data/sipper_test/rr_proxy.rb +17 -0
  121. data/sipper_test/run_test.cmd +94 -0
  122. data/sipper_test/sip_test_case.rb +104 -0
  123. data/sipper_test/test2xx_retransmission.rb +80 -0
  124. data/sipper_test/test2xx_retransmission_with_limit.rb +81 -0
  125. data/sipper_test/test2xx_retransmission_with_nist.rb +91 -0
  126. data/sipper_test/test2xx_retransmission_with_txns.rb +94 -0
  127. data/sipper_test/test_address_header.rb +66 -0
  128. data/sipper_test/test_b2bua1.rb +130 -0
  129. data/sipper_test/test_b2bua2.rb +120 -0
  130. data/sipper_test/test_b2bua3.rb +160 -0
  131. data/sipper_test/test_b2bua4.rb +130 -0
  132. data/sipper_test/test_base_controller.rb +110 -0
  133. data/sipper_test/test_base_transport.rb +37 -0
  134. data/sipper_test/test_cancel.rb +21 -0
  135. data/sipper_test/test_cancel_after2xx.rb +81 -0
  136. data/sipper_test/test_cancel_retransmission.rb +105 -0
  137. data/sipper_test/test_cancel_with481.rb +83 -0
  138. data/sipper_test/test_cancel_with487.rb +70 -0
  139. data/sipper_test/test_cancel_with_ist_without_nist.rb +99 -0
  140. data/sipper_test/test_cancel_with_nist.rb +84 -0
  141. data/sipper_test/test_cancel_without487.rb +77 -0
  142. data/sipper_test/test_command_element.rb +38 -0
  143. data/sipper_test/test_compact_converter.rb +33 -0
  144. data/sipper_test/test_controller_class_loader.rb +37 -0
  145. data/sipper_test/test_controller_selector.rb +53 -0
  146. data/sipper_test/test_controller_using_compact_headers.rb +74 -0
  147. data/sipper_test/test_controller_using_header_order.rb +85 -0
  148. data/sipper_test/test_controller_using_ict.rb +64 -0
  149. data/sipper_test/test_controller_using_ict_with_non_success.rb +72 -0
  150. data/sipper_test/test_controller_using_ict_with_tcbh.rb +24 -0
  151. data/sipper_test/test_controller_using_ict_with_tcbh_no_action.rb +24 -0
  152. data/sipper_test/test_controller_using_ist.rb +70 -0
  153. data/sipper_test/test_controller_using_ist_with_tcbh.rb +24 -0
  154. data/sipper_test/test_controller_using_nict.rb +115 -0
  155. data/sipper_test/test_controller_using_nict_with_tcbh.rb +24 -0
  156. data/sipper_test/test_controller_using_nist.rb +63 -0
  157. data/sipper_test/test_controller_using_pre_existing_rs0.rb +73 -0
  158. data/sipper_test/test_controller_using_pre_existing_rs1.rb +75 -0
  159. data/sipper_test/test_controller_using_pre_existing_rs2.rb +71 -0
  160. data/sipper_test/test_controller_using_route_set.rb +86 -0
  161. data/sipper_test/test_controller_with_sdp.rb +80 -0
  162. data/sipper_test/test_controllers/cancel/order.yaml +2 -0
  163. data/sipper_test/test_controllers/cancel/uac_cancel_controller.rb +35 -0
  164. data/sipper_test/test_controllers/cancel/uas_cancel_controller.rb +25 -0
  165. data/sipper_test/test_controllers/class_loading/ordered/first_ordered_controller.rb +5 -0
  166. data/sipper_test/test_controllers/class_loading/ordered/order.yaml +3 -0
  167. data/sipper_test/test_controllers/class_loading/ordered/recond_ordered_controller.rb +6 -0
  168. data/sipper_test/test_controllers/class_loading/ordered/second_ordered_controller.rb +6 -0
  169. data/sipper_test/test_controllers/class_loading/unordered/first_unordered_controller.rb +7 -0
  170. data/sipper_test/test_controllers/class_loading/unordered/second_unordered_controller.rb +6 -0
  171. data/sipper_test/test_controllers/ctrl_trhandler/lib/transport_filters/my_transport_handler.rb +22 -0
  172. data/sipper_test/test_controllers/ctrl_trhandler/uac_tr_handler_controller.rb +27 -0
  173. data/sipper_test/test_controllers/ctrl_trhandler/uas_tr_handler_controller.rb +21 -0
  174. data/sipper_test/test_controllers/ete/order.yaml +1 -0
  175. data/sipper_test/test_controllers/ete/uac_controller.rb +39 -0
  176. data/sipper_test/test_controllers/ete/uas_controller.rb +34 -0
  177. data/sipper_test/test_controllers/extensions/extension_uac_controller.rb +24 -0
  178. data/sipper_test/test_controllers/extensions/extension_uas_controller.rb +35 -0
  179. data/sipper_test/test_controllers/extensions/lib/sipper_extensions/my_from_extension.rb +16 -0
  180. data/sipper_test/test_controllers/ict_tcbh/lib/transaction_handlers/app_ict_handler.rb +23 -0
  181. data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_controller.rb +27 -0
  182. data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_no_action_controller.rb +28 -0
  183. data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_controller.rb +29 -0
  184. data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_no_action_controller.rb +31 -0
  185. data/sipper_test/test_controllers/ist_tcbh/lib/app_ist_handler.rb +13 -0
  186. data/sipper_test/test_controllers/ist_tcbh/uac_ist_tcbh_controller.rb +22 -0
  187. data/sipper_test/test_controllers/ist_tcbh/uas_ist_tcbh_controller.rb +31 -0
  188. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/in_order.yaml +2 -0
  189. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler1.rb +21 -0
  190. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler2.rb +21 -0
  191. data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/out_order.yaml +2 -0
  192. data/sipper_test/test_controllers/multi_trhandlers/uac_multi_tr_handler_controller.rb +27 -0
  193. data/sipper_test/test_controllers/multi_trhandlers/uas_multi_tr_handler_controller.rb +29 -0
  194. data/sipper_test/test_controllers/multiple/lib/blank_test.rb +2 -0
  195. data/sipper_test/test_controllers/multiple/uac_info_controller.rb +21 -0
  196. data/sipper_test/test_controllers/multiple/uac_msg_controller.rb +20 -0
  197. data/sipper_test/test_controllers/multiple/uas_info_controller.rb +15 -0
  198. data/sipper_test/test_controllers/multiple/uas_msg_controller.rb +14 -0
  199. data/sipper_test/test_controllers/nict_tcbh/lib/transaction_handlers/app_nict_handler.rb +13 -0
  200. data/sipper_test/test_controllers/nict_tcbh/uac_nict_tcbh_controller.rb +26 -0
  201. data/sipper_test/test_controllers/nict_tcbh/uas_nict_tcbh_controller.rb +20 -0
  202. data/sipper_test/test_controllers/state_machine_based/lib/CreditControl.sm +43 -0
  203. data/sipper_test/test_controllers/state_machine_based/lib/CreditControl_sm.rb +194 -0
  204. data/sipper_test/test_controllers/state_machine_based/order.yaml +1 -0
  205. data/sipper_test/test_controllers/state_machine_based/uac_message_controller.rb +34 -0
  206. data/sipper_test/test_controllers/state_machine_based/uas_message_controller.rb +44 -0
  207. data/sipper_test/test_controllers/stray_message/lib/sipper_extensions/my_stray_handler.rb +9 -0
  208. data/sipper_test/test_controllers/stray_message/stray_uac_controller.rb +24 -0
  209. data/sipper_test/test_controllers/stray_message/stray_uas_controller.rb +31 -0
  210. data/sipper_test/test_controllers/string/order.yaml +1 -0
  211. data/sipper_test/test_controllers/string/uac_controller.rb +29 -0
  212. data/sipper_test/test_controllers/string/uas_controller.rb +22 -0
  213. data/sipper_test/test_controllers/test_controller.rb +24 -0
  214. data/sipper_test/test_detached_session1.rb +78 -0
  215. data/sipper_test/test_dialog_routes.rb +139 -0
  216. data/sipper_test/test_digest_challenge1.rb +89 -0
  217. data/sipper_test/test_digest_challenge2.rb +90 -0
  218. data/sipper_test/test_dynamic_parse.rb +249 -0
  219. data/sipper_test/test_empty_sdp.rb +89 -0
  220. data/sipper_test/test_ete.rb +37 -0
  221. data/sipper_test/test_expectation_parser.rb +76 -0
  222. data/sipper_test/test_extensions.rb +28 -0
  223. data/sipper_test/test_freeze.rb +81 -0
  224. data/sipper_test/test_generated.rb +90 -0
  225. data/sipper_test/test_header_parameters.rb +75 -0
  226. data/sipper_test/test_header_parse.rb +141 -0
  227. data/sipper_test/test_http_client1.rb +84 -0
  228. data/sipper_test/test_http_client2.rb +90 -0
  229. data/sipper_test/test_ict_with_timeout.rb +62 -0
  230. data/sipper_test/test_in_dialog_request.rb +61 -0
  231. data/sipper_test/test_inline_controller.rb +67 -0
  232. data/sipper_test/test_invite_client_transaction.rb +272 -0
  233. data/sipper_test/test_invite_replace.rb +147 -0
  234. data/sipper_test/test_invite_retransmission.rb +90 -0
  235. data/sipper_test/test_invite_server_transaction.rb +208 -0
  236. data/sipper_test/test_lower_cseq.rb +79 -0
  237. data/sipper_test/test_media.rb +52 -0
  238. data/sipper_test/test_message.rb +392 -0
  239. data/sipper_test/test_method_specific_response_handling.rb +81 -0
  240. data/sipper_test/test_multi_homed1.rb +127 -0
  241. data/sipper_test/test_multi_homed2.rb +109 -0
  242. data/sipper_test/test_multi_homed_duplicate.rb +87 -0
  243. data/sipper_test/test_multi_homed_with_detached.rb +88 -0
  244. data/sipper_test/test_multiple.rb +49 -0
  245. data/sipper_test/test_multiple_contacts.rb +89 -0
  246. data/sipper_test/test_non2xx_retransmission_with_ist.rb +87 -0
  247. data/sipper_test/test_non_invite_client_transaction.rb +210 -0
  248. data/sipper_test/test_non_invite_retransmission.rb +91 -0
  249. data/sipper_test/test_non_invite_server_transaction.rb +202 -0
  250. data/sipper_test/test_offer_answer_prack.rb +103 -0
  251. data/sipper_test/test_pickup.rb +258 -0
  252. data/sipper_test/test_prack.rb +105 -0
  253. data/sipper_test/test_prack_store_and_dispatch.rb +101 -0
  254. data/sipper_test/test_prack_timer.rb +105 -0
  255. data/sipper_test/test_ps_sipper_map.rb +56 -0
  256. data/sipper_test/test_re_invite_uas_ongoing_ict.rb +81 -0
  257. data/sipper_test/test_re_invite_uas_ongoing_ist.rb +84 -0
  258. data/sipper_test/test_re_invite_with_ongoing_ict.rb +101 -0
  259. data/sipper_test/test_re_invite_with_ongoing_ist.rb +89 -0
  260. data/sipper_test/test_recorder_swap.rb +157 -0
  261. data/sipper_test/test_refer.rb +121 -0
  262. data/sipper_test/test_registeration_clearing.rb +97 -0
  263. data/sipper_test/test_registrar.rb +109 -0
  264. data/sipper_test/test_registration_controller.rb +73 -0
  265. data/sipper_test/test_registration_timeout.rb +90 -0
  266. data/sipper_test/test_remote_controller.rb +39 -0
  267. data/sipper_test/test_remote_target_update_on2xx.rb +140 -0
  268. data/sipper_test/test_request.rb +106 -0
  269. data/sipper_test/test_response.rb +40 -0
  270. data/sipper_test/test_response_without_to_tag.rb +92 -0
  271. data/sipper_test/test_rport.rb +88 -0
  272. data/sipper_test/test_sdp.rb +91 -0
  273. data/sipper_test/test_sdp_parser.rb +145 -0
  274. data/sipper_test/test_session.rb +276 -0
  275. data/sipper_test/test_session_callback_handler.rb +68 -0
  276. data/sipper_test/test_session_lifetime.rb +66 -0
  277. data/sipper_test/test_session_manager.rb +141 -0
  278. data/sipper_test/test_session_recorder.rb +145 -0
  279. data/sipper_test/test_session_state_user_defined.rb +84 -0
  280. data/sipper_test/test_session_states.rb +91 -0
  281. data/sipper_test/test_simple_dialog_state.rb +86 -0
  282. data/sipper_test/test_simple_re_invite.rb +86 -0
  283. data/sipper_test/test_sip_uri.rb +234 -0
  284. data/sipper_test/test_sipper_util.rb +45 -0
  285. data/sipper_test/test_smc_controller.rb +17 -0
  286. data/sipper_test/test_smoke.rb +80 -0
  287. data/sipper_test/test_stray.rb +28 -0
  288. data/sipper_test/test_stray_inline.rb +89 -0
  289. data/sipper_test/test_stray_res_acked.rb +103 -0
  290. data/sipper_test/test_stray_respond.rb +104 -0
  291. data/sipper_test/test_stray_retry.rb +92 -0
  292. data/sipper_test/test_stray_retry_failure.rb +93 -0
  293. data/sipper_test/test_stray_retry_initial.rb +100 -0
  294. data/sipper_test/test_strict_router_with_angled.rb +84 -0
  295. data/sipper_test/test_string_record.rb +31 -0
  296. data/sipper_test/test_subscribe_notify.rb +141 -0
  297. data/sipper_test/test_subscribe_notify_client_timeout.rb +158 -0
  298. data/sipper_test/test_subscribe_notify_dialog.rb +146 -0
  299. data/sipper_test/test_subscribe_notify_expires.rb +155 -0
  300. data/sipper_test/test_subscribe_notify_multiple_subscription.rb +157 -0
  301. data/sipper_test/test_subscribe_notify_server_timeout.rb +144 -0
  302. data/sipper_test/test_subsequent_unsent.rb +88 -0
  303. data/sipper_test/test_target_refresh_proxy_detached.rb +128 -0
  304. data/sipper_test/test_target_refresh_proxy_udp.rb +130 -0
  305. data/sipper_test/test_target_refresh_rr_proxy_udp.rb +133 -0
  306. data/sipper_test/test_target_refresh_with_new_port.rb +158 -0
  307. data/sipper_test/test_target_refresh_with_proxy1.rb +113 -0
  308. data/sipper_test/test_target_refresh_with_rr_update_proxy.rb +145 -0
  309. data/sipper_test/test_target_refresh_with_update_proxy.rb +144 -0
  310. data/sipper_test/test_target_refresh_with_update_proxy2.rb +139 -0
  311. data/sipper_test/test_timer_manager.rb +71 -0
  312. data/sipper_test/test_timer_task.rb +60 -0
  313. data/sipper_test/test_transport_handler.rb +19 -0
  314. data/sipper_test/test_transport_multi_handler.rb +18 -0
  315. data/sipper_test/test_udp_transport.rb +119 -0
  316. data/sipper_test/test_unparsed.rb +70 -0
  317. data/sipper_test/test_validations.rb +69 -0
  318. data/sipper_test/test_with_rr_proxy.rb +111 -0
  319. data/sipper_test/testmediacontroller.rb +71 -0
  320. data/sipper_test/tracing.rb +23 -0
  321. data/sipper_test/transaction_test_helper.rb +176 -0
  322. data/sipper_test/transport_filters.rb +26 -0
  323. data/sipper_test/ts_sipper.rb +91 -0
  324. data/sipper_test/ts_smoke.rb +3 -0
  325. data/sipper_test/tt.cmd +20 -0
  326. metadata +455 -0
@@ -0,0 +1,31 @@
1
+ # Holds references for -
2
+ # :Tm => Transport Manager
3
+ # :Cs => Controller Selector
4
+ # :Sipper => Main class
5
+ # :Tlocks => A hash of locks structure for tests signaling. If not found locally then this is
6
+ # additionally searched in the remote TestServer if present in the configuration.
7
+ # This is for the cases where the UAS is running on a separate node
8
+ # :Sth => SIP Timer helper, which is the central class to schedule the SIP timers including
9
+ # app level timers.
10
+ #
11
+
12
+ require 'sipper_configurator'
13
+
14
+ module SIP
15
+
16
+ class Locator
17
+
18
+ @@services_hash = {}
19
+ @@ro = nil
20
+
21
+ def Locator.[](k)
22
+ @@services_hash[k]
23
+ end
24
+
25
+ def Locator.[]=(k,v)
26
+ @@services_hash[k] = v
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,58 @@
1
+ require 'sip_logger'
2
+
3
+ module SipperUtil
4
+ class MessageFill
5
+
6
+ include SipLogger
7
+
8
+ SUBS = {
9
+ :lip => /_PH_LIP_/,
10
+ :lp => /_PH_LP_/,
11
+ :rip => /_PH_RIP_/,
12
+ :rp => /_PH_RP_/,
13
+ :gcnt => /_PH_GCNT_/, #global accross process
14
+ :lcnts => /_PH_LCNTS_/, #local seq maintained for session for sent msg
15
+ :lcntr => /_PH_LCNTR_/, #local maintained for session for recvd msg
16
+ :lctg => /_PH_LCTG_/, #local tag
17
+ :trans => /_PH_TRANS_/, #transport UDP/TCP/TLS/SCTP
18
+ :cl => /_PH_CL_/, #content length
19
+ :rnd => /_PH_RND_/ # random string
20
+ }
21
+
22
+ # just plain strings
23
+ def MessageFill.sub(str, h)
24
+ h.each do |k,v|
25
+ str.gsub!(SUBS[k], v)
26
+ end
27
+ str
28
+ end
29
+
30
+ def MessageFill.fill(msg, h)
31
+ SipLogger['siplog::messagefill'].debug("msg is a #{msg.class}")
32
+ return MessageFill.sub(msg, h) if msg.is_a?(String)
33
+ msg.each do |k, v|
34
+ #SipLogger['siplog::messagefill'].debug("Processing for #{k} the value is #{v}")
35
+ unless v.nil?
36
+ msg[k] = v.map do |e|
37
+ case e
38
+ when String
39
+ MessageFill.sub(e, h)
40
+ when ::SipHeaders::Header
41
+ str = e.to_s
42
+ if str =~ /_PH_/
43
+ e.assign(MessageFill.sub(str, h))
44
+ else
45
+ e
46
+ end
47
+ else
48
+ raise TypeError, "#{e.class} is not an acceptable type for message fill"
49
+ end # case
50
+ end # map
51
+ end # v.nil?
52
+ SipLogger['siplog::messagefill'].debug("Processed for #{k} the value is #{msg[k]}")
53
+ end # each
54
+ end
55
+
56
+
57
+ end
58
+ end
@@ -0,0 +1,63 @@
1
+ require 'sipper_configurator'
2
+ require 'pstore'
3
+ require 'util/persistence/sipper_map'
4
+
5
+ module SipperUtil
6
+ module Persistence
7
+
8
+ # Uses the pstore data store
9
+ # Data access to the map is transactional.
10
+ class PsSipperMap < SipperMap
11
+ def initialize(name)
12
+ super
13
+ path = SipperConfigurator[:PStorePath]||SipperConfigurator[:LogPath]
14
+ @ps = PStore.new(File.join(path, name))
15
+ end
16
+
17
+ def put(k,v)
18
+ @ps.transaction do
19
+ @ps[k] = v
20
+ end
21
+ end
22
+
23
+ def get(k)
24
+ @ps.transaction(true) do
25
+ return @ps[k]
26
+ end
27
+ end
28
+
29
+ def get_all_keys
30
+ @ps.transaction(true) do
31
+ @ps.roots
32
+ end
33
+ end
34
+
35
+
36
+ def put_all(h)
37
+ @ps.transaction do
38
+ h.each_pair {|k,v| @ps[k] = v}
39
+ end
40
+ end
41
+
42
+ def delete(k)
43
+ @ps.transaction do
44
+ @ps.delete(k)
45
+ end
46
+ end
47
+
48
+ def delete_all
49
+ @ps.transaction do
50
+ @ps.roots.each do |k|
51
+ @ps.delete(k)
52
+ end
53
+ end
54
+ end
55
+
56
+ def destroy
57
+ self.delete_all
58
+ File.delete @ps.path
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,41 @@
1
+ module SipperUtil
2
+ module Persistence
3
+
4
+ # A simple map like data structure that is persisted based on several
5
+ # persistence choices.
6
+ # Data access to the map is transactional.
7
+ class SipperMap
8
+
9
+ # The name identifies the underlying data structure, in case of
10
+ # file based persistence it is the file name, in case of database
11
+ # it is the name of db table.
12
+ def initialize(name)
13
+ @name = name
14
+ end
15
+
16
+ def put(k,v)
17
+ end
18
+
19
+ def get(k)
20
+ end
21
+
22
+ def get_all_keys
23
+ end
24
+
25
+ def put_all(h)
26
+ end
27
+
28
+ def delete(k)
29
+ end
30
+
31
+ def delete_all
32
+ end
33
+
34
+ # Deletes all data and removes the underlying data
35
+ # structure
36
+ def destroy
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,305 @@
1
+ require 'sip_headers/header'
2
+ require 'sip_logger'
3
+ require 'strscan'
4
+ require 'facets/core/string/underscore'
5
+
6
+ module SipperUtil
7
+ include SipLogger
8
+
9
+ RCOLON = /: /
10
+ SCOLON = /;/
11
+ NUMERIC_CSEQ = /\d+\s?/
12
+ SUCC_RANGE = 200..299
13
+ RPROV_RANGE = 101..199
14
+ BOOL_MAP = { :true=>true, :false=>false }
15
+
16
+ def log_and_raise(err_msg, ex=RuntimeError)
17
+ loge(err_msg)
18
+ raise ex, err_msg
19
+ end
20
+
21
+ def SipperUtil.trand
22
+ ((Time.now.usec)/1000).to_s + rand(10000).to_s
23
+ end
24
+
25
+ # Converts the given file name into a well formed
26
+ # classname. Assumes that file names are underscore
27
+ # separated and class names are camel case
28
+ # -4 to remove .rb
29
+ #
30
+ def SipperUtil.classify(fname)
31
+ if fname =~ /\.rb$/
32
+ fname[0..-4].split("_").map{|x| x.capitalize}.join
33
+ else
34
+ fname.split("_").map{|x| x.capitalize}.join
35
+ end
36
+ end
37
+
38
+ # does reverse of classify, i.e generates a filename compliant with
39
+ # Ruby conventions from a class name.
40
+ def SipperUtil.filify(cname)
41
+ cname.underscore + ".rb" # from facets
42
+ end
43
+
44
+
45
+ # Taken from Rails. This converts a fqcname string to a class constant.
46
+ def SipperUtil.constantize(camel_cased_word)
47
+ unless /^(::)?([A-Z]\w*)(::[A-Z]\w*)*$/ =~ camel_cased_word
48
+ raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!"
49
+ end
50
+ camel_cased_word = "::#{camel_cased_word}" unless $1
51
+ Object.module_eval(camel_cased_word, __FILE__, __LINE__)
52
+ end
53
+
54
+
55
+ # converts the header names like p_asserted_identity to
56
+ # P-Asserted_Identity.
57
+ # -- Here is an ugly handling for WWW-Authenticate header todo fix this
58
+ # and also Call-ID handling, as Call-Id is valid yet some tools such
59
+ # as sipp does not handle it.
60
+ # ++
61
+ def SipperUtil.headerize(hname)
62
+ return nil if hname.nil?
63
+ arr = hname.to_s.split('_')
64
+ arr.each do |i|
65
+ if i.downcase === "www"
66
+ i.upcase!
67
+ else
68
+ i.capitalize!
69
+ end
70
+ end
71
+ hdr = arr.join('-')
72
+ hdr = "Call-ID" if hdr == "Call-Id"
73
+ hdr
74
+ end
75
+
76
+ # Reverse of headerize.
77
+ # P-Asserted_Identity => p_asserted_identity
78
+ def SipperUtil.methodize(hdr)
79
+ return nil if hdr.nil?
80
+ arr = hdr.to_s.downcase.split('-')
81
+ arr.join('_')
82
+ end
83
+
84
+ # Simply takes the "Header: xxx" and returns "xxx"
85
+ def SipperUtil.header_value(hdr_string)
86
+ m = RCOLON.match(hdr_string)
87
+ m ? m.post_match.strip : hdr_string
88
+ end
89
+
90
+ # Separates the header and params and returns them in
91
+ # an array.
92
+ def SipperUtil.header_value_separate_parameters(hdr_string)
93
+ hdr = SipperUtil.header_value(hdr_string)
94
+ m = SCOLON.match(hdr)
95
+ m ? [m.pre_match.strip, m.post_match.strip] : [hdr, nil]
96
+ end
97
+
98
+ # If there are parameters then returns them in a hash with header value.
99
+ # Takes full header and also just separated params and returns
100
+ # the array with header value and params hash.
101
+ # with "My-Header: myvalue" returns ["myvalue", {}]
102
+ # with "My-Header: myvalue;a=1;b=2" returns ["myvalue", {"a"=>"1", "b"=>"2"}]
103
+ # with "a=1;b=2" returns [nil, {"a"=>"1", "b"=>"2"}]
104
+ def SipperUtil.parameterize_header(hdr_string)
105
+ p_hash = {}
106
+ p = SipperUtil.header_value_separate_parameters(hdr_string)
107
+ params = p[1]
108
+
109
+ if params
110
+ params.split(";").each do |x|
111
+ a = x.split("=")
112
+ key = a.shift
113
+ val = a.shift
114
+ if key
115
+ val = "" unless val
116
+ p_hash[key] = val
117
+ end
118
+ end
119
+ end
120
+ return [p[0], p_hash]
121
+ end
122
+
123
+
124
+ def SipperUtil.find_parser_and_parse(hname, val, parse_option)
125
+ if val.class <= SipHeaders::Header
126
+ return val.dup
127
+ else
128
+ val = val.dup.to_s
129
+ end
130
+ # val = val.to_s
131
+ if hname
132
+ klass = SipHeaders.const_get(SipperUtil.classify(hname.to_s))
133
+ else
134
+ str = "Not a header, cannot parse"
135
+ SipLogger['siplog::message'].warn(str)
136
+ raise TypeError, str
137
+ end
138
+ obj = klass.new
139
+ obj.name = SipperUtil.headerize(hname.to_s) unless obj.name
140
+ obj.assign(val, parse_option)
141
+ return obj
142
+ rescue NameError => e
143
+ #SipLogger['siplog::message'].warn("No parser for header #{hname} using default parser")
144
+ SipperUtil.find_parser_and_parse("Header", val, parse_option)
145
+ end
146
+
147
+
148
+
149
+ # Returns the parameter value if the parameter is available.
150
+ def SipperUtil.get_parameter(hdr_string, param_name)
151
+ SipperUtil.parameterize_header(hdr_string)[1][param_name.to_s]
152
+ end
153
+
154
+ # Returns true of the named parameter is present, false otherwise.
155
+ # Can be used for valueless parameter like "lr" matching a string
156
+ # not a header. For a Header object we can check using the hash access
157
+ # Header.has_key?
158
+ def SipperUtil.has_parameter_in_string?(hdr_string, param_name)
159
+ SipperUtil.parameterize_header(hdr_string)[1].has_key?(param_name.to_s)
160
+ end
161
+
162
+ def SipperUtil.add_parameter(hdr, param, value)
163
+ hdr << ";" << param << "=" << value
164
+ return hdr
165
+ end
166
+
167
+
168
+ def SipperUtil.cseq_number(cseq_header)
169
+ val = cseq_header.to_s
170
+ val = SipperUtil.header_value(cseq_header) if cseq_header =~ /:/
171
+ m = NUMERIC_CSEQ.match(val)
172
+ m ? m[0].strip.to_i : nil
173
+ end
174
+
175
+
176
+ def SipperUtil.cseq_method(cseq_header)
177
+ val = cseq_header.to_s
178
+ val = SipperUtil.header_value(cseq_header) if cseq_header =~ /:/
179
+ m = val.split(/\s+/)
180
+ if m[1] && m[1] =~ /[A-Za-z]/
181
+ return m[1].upcase
182
+ else
183
+ return nil
184
+ end
185
+ end
186
+
187
+ def SipperUtil.recordify(msg)
188
+ unless msg.class <= Message
189
+ msg = msg.to_s
190
+ msg = msg.split(" ").join("_")
191
+ msg.extend(SipperUtil::Recordable)
192
+ end
193
+ return msg
194
+ end
195
+
196
+ # arg can be a symbol or a boolean value true/false
197
+ def SipperUtil.boolify(arg)
198
+ v = nil
199
+ if arg.is_a? Symbol
200
+ v = SipperUtil::BOOL_MAP[arg]
201
+ else
202
+ v = arg
203
+ end
204
+ end
205
+
206
+
207
+ # Takes a hash and populates the
208
+ # instance variables of the name as keys and value as hash values
209
+ # eg. hash = {:b=>2, :a=>1} results in the population of the
210
+ # instance variables "b" and "a" to 2 and 1 respectively in the
211
+ # object obj.
212
+ def SipperUtil.hash_to_iv(h, obj)
213
+ h.each_pair {|k,v| obj.send("#{k}=", v) }
214
+ end
215
+
216
+ # take the expectaion string like "< INVITE, > 100 {2,}, > 200" and
217
+ # returns "< INVITE% > 100 {2,}% > 200". Such that it can be split
218
+ # without any ambiguity.
219
+ def SipperUtil.make_expectation_parsable(str)
220
+ ss = StringScanner.new(str)
221
+ ns = ""
222
+ while (c = ss.getch)
223
+ if c == "{"
224
+ in_angle = true
225
+ elsif c == "}"
226
+ in_angle = false
227
+ elsif c == ","
228
+ c = "%" unless in_angle
229
+ end
230
+ ns << c
231
+ end
232
+ return ns
233
+ end
234
+
235
+ # Takes a string or a primitive array and prints it in the standard array
236
+ # form and returns a string that is properly formatted ruby style array code
237
+ # eg. ["a", "b", "c"], with elements as strings.
238
+ def SipperUtil.print_arr arr
239
+ s = "["
240
+ arr.each_with_index do |x,i|
241
+ s += "'" + x.to_s + "'"
242
+ s += "," unless i == arr.length-1
243
+ end
244
+ s += "]"
245
+ return s
246
+ end
247
+
248
+
249
+ def SipperUtil.load_yaml(path)
250
+ File.open(path) {|yf| YAML::load(yf)}
251
+ end
252
+
253
+ # Formats a SipperMedia command according to the SM protocol
254
+ def SipperUtil.formatted_media_command(str)
255
+ sprintf("%s%s", [str.length+1].pack("N"), str)
256
+ end
257
+
258
+ def SipperUtil.print_stack_trace
259
+ begin; raise; rescue => e; puts e.backtrace.join("\n"); end;
260
+ end
261
+
262
+ module Recordable
263
+ def p_session_record
264
+ 'msg-info'
265
+ end
266
+
267
+ def call_id
268
+ 'precallid'
269
+ end
270
+ end # module Recordable
271
+
272
+
273
+
274
+
275
+ # Wraps every method, except "name" because that is used to verify
276
+ # where the method is actually invoked.
277
+ module WrapExtender
278
+
279
+ def WrapExtender.extended(xtendee)
280
+ xtendee.class.instance_methods(false).each do |m|
281
+ WrapExtender.wrap_method(xtendee.class, m) unless m.to_s == "name"
282
+ end
283
+ end
284
+
285
+ def WrapExtender.wrap_method(klass, meth)
286
+ klass.class_eval do
287
+ alias_method "old_#{meth}", "#{meth}"
288
+ define_method(meth) do |*args|
289
+ ["#{klass.name}", self.send("old_#{meth}",*args)]
290
+ end
291
+ end
292
+ end
293
+
294
+ def WrapExtender.last_class ret_val
295
+ if ret_val[1].is_a? Array
296
+ WrapExtender.last_class ret_val[1]
297
+ else
298
+ ret_val[0]
299
+ end
300
+ end
301
+
302
+ end #WrapExtender
303
+
304
+
305
+ end