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,119 @@
1
+ # :include: ../rdoc/patternformatter
2
+ #
3
+ # == Other Info
4
+ #
5
+ # Version:: $Id: modified_pattern_formatter.rb,v 1.2 2007/06/23 07:26:56 rnakhan Exp $
6
+ # Author:: Leon Torres <leon@ugcs.caltech.edu>
7
+
8
+ require "log4r/formatter/formatter"
9
+
10
+ module Log4r
11
+ # See log4r/formatter/patternformatter.rb
12
+ class PatternFormatter < BasicFormatter
13
+
14
+ # to get rid of warnings
15
+ remove_const :DirectiveTable
16
+ remove_const :DirectiveRegexp
17
+ remove_const :ISO8601
18
+
19
+ # Arguments to sprintf keyed to directive letters
20
+ DirectiveTable = {
21
+ "c" => 'event.name',
22
+ "C" => 'event.fullname',
23
+ "d" => 'format_date',
24
+ "t" => 'event.tracer[0]',
25
+ "m" => 'event.data',
26
+ "h" => 'thread_name',
27
+ "M" => 'format_object(event.data)',
28
+ "l" => 'LNAMES[event.level]',
29
+ "%" => '"%"'
30
+ }
31
+
32
+ # Matches the first directive encountered and the stuff around it.
33
+ #
34
+ # * $1 is the stuff before directive or "" if not applicable
35
+ # * $2 is the directive group or nil if there's none
36
+ # * $3 is the %#.# match within directive group
37
+ # * $4 is the .# match which we don't use (it's there to match properly)
38
+ # * $5 is the directive letter
39
+ # * $6 is the stuff after the directive or "" if not applicable
40
+
41
+ DirectiveRegexp = /([^%]*)((%-?\d*(\.\d+)?)([cCdtmhMl%]))?(.*)/
42
+
43
+ # default date format
44
+ ISO8601 = "%Y-%m-%d %H:%M:%S"
45
+
46
+ attr_reader :pattern, :date_pattern, :date_method
47
+
48
+ # Accepts the following hash arguments (either a string or a symbol):
49
+ #
50
+ # [<tt>pattern</tt>] A pattern format string.
51
+ # [<tt>date_pattern</tt>] A Time#strftime format string. See the
52
+ # Ruby Time class for details.
53
+ # [+date_method+]
54
+ # As an option to date_pattern, specify which
55
+ # Time.now method to call. For
56
+ # example, +usec+ or +to_s+.
57
+ # Specify it as a String or Symbol.
58
+ #
59
+ # The default date format is ISO8601, which looks like this:
60
+ #
61
+ # yyyy-mm-dd hh:mm:ss => 2001-01-12 13:15:50
62
+
63
+ def initialize(hash={})
64
+ super(hash)
65
+ @pattern = (hash['pattern'] or hash[:pattern] or nil)
66
+ @date_pattern = (hash['date_pattern'] or hash[:date_pattern] or nil)
67
+ @date_method = (hash['date_method'] or hash[:date_method] or nil)
68
+ @date_pattern = ISO8601 if @date_pattern.nil? and @date_method.nil?
69
+ PatternFormatter.create_format_methods(self)
70
+ end
71
+
72
+ def thread_name
73
+ Thread.current[:name] || Thread.current.to_s
74
+ end
75
+
76
+ # PatternFormatter works by dynamically defining a <tt>format</tt> method
77
+ # based on the supplied pattern format. This method contains a call to
78
+ # Kernel#sptrintf with arguments containing the data requested in
79
+ # the pattern format.
80
+ #
81
+ # How is this magic accomplished? First, we visit each directive
82
+ # and change the %#.# component to %#.#s. The directive letter is then
83
+ # used to cull an appropriate entry from the DirectiveTable for the
84
+ # sprintf argument list. After assembling the method definition, we
85
+ # run module_eval on it, and voila.
86
+
87
+ def PatternFormatter.create_format_methods(pf) #:nodoc:
88
+ # first, define the format_date method
89
+ if pf.date_method
90
+ module_eval "def pf.format_date; Time.now.#{pf.date_method}; end"
91
+ else
92
+ module_eval <<-EOS
93
+ def pf.format_date
94
+ Time.now.strftime "#{pf.date_pattern}"
95
+ end
96
+ EOS
97
+ end
98
+ # and now the main format method
99
+ ebuff = "def pf.format(event)\n sprintf(\""
100
+ _pattern = pf.pattern.dup
101
+ args = [] # the args to sprintf which we'll append to ebuff lastly
102
+ while true # work on each match in turn
103
+ match = DirectiveRegexp.match _pattern
104
+ ebuff += match[1] unless match[1].empty?
105
+ break if match[2].nil?
106
+ # deal with the directive by inserting a %#.#s where %#.# is copied
107
+ # directy from the match
108
+ ebuff += match[3] + "s"
109
+ args << DirectiveTable[match[5]] # cull the data for our argument list
110
+ break if match[6].empty?
111
+ _pattern = match[6]
112
+ end
113
+ ebuff += '\n", ' + args.join(', ') + ")\n"
114
+ ebuff += "end\n"
115
+ module_eval ebuff
116
+ end
117
+ end
118
+ end
119
+
@@ -0,0 +1,143 @@
1
+ # WARNING: This is an experimental proxy controller, to be used for internal Sipper
2
+ # UA testing functionality.
3
+ # This is not fully compliant yet.
4
+
5
+ require 'b2bua_controller'
6
+
7
+ module SIP
8
+ class ProxyController < SIP::B2buaController
9
+
10
+ t2xx_usage false
11
+
12
+ def self.record_route(val)
13
+ @record_route = val
14
+ end
15
+
16
+ def self.get_record_route
17
+ @record_route
18
+ end
19
+
20
+ # Creates the proxy request based on the original request. Also creates the
21
+ # peer session if it does not already exist.
22
+ def create_proxy_request(session, orig_request=session.irequest, rip=SipperConfigurator[:DefaultRIP],
23
+ rp=SipperConfigurator[:DefaultRP])
24
+ peer_session = get_or_create_peer_session(session, rip, rp)
25
+ if peer_session.initial_state?
26
+ r = peer_session.create_initial_request(orig_request.method, orig_request.uri)
27
+ if self.class.get_record_route
28
+ r.record_route = "<sip:" + SipperConfigurator[:LocalSipperIP]+":"+ SipperConfigurator[:LocalSipperPort].to_s+";lr>"
29
+ end
30
+ else
31
+ if(orig_request.method == "CANCEL")
32
+ r = peer_session.create_cancel
33
+ elsif(orig_request.method == "ACK")
34
+ r = peer_session.create_ack
35
+ else
36
+ r = peer_session.create_subsequent_request(orig_request.method)
37
+ end
38
+ end
39
+
40
+ my_via = r.via
41
+
42
+ unless (orig_request.method == "CANCEL" ||
43
+ (orig_request.method == "ACK" && peer_session.iresponse.code >= 400))
44
+ r.copy_from(orig_request, :_sipper_all)
45
+ r.push_via(my_via)
46
+ r.format_as_separate_headers_for_mv(:via)
47
+ if (mf_hdr = r[:max_forwards])
48
+ mf = Integer(mf_hdr.to_s)
49
+ mf -= 1
50
+ r.max_forwards = mf.to_s
51
+ else
52
+ r.max_forwards = "70"
53
+ end
54
+ end
55
+ if r[:route]
56
+ rt = r.route
57
+ if rt.uri.host = SipperConfigurator[:LocalSipperIP] &&
58
+ rt.uri.port == SipperConfigurator[:LocalSipperPort].to_s
59
+ r.pop_route
60
+ end
61
+ end
62
+ return r
63
+ end
64
+
65
+ def create_proxy_response(session, orig_response=session.iresponse)
66
+ peer_session = get_peer_session(session)
67
+ if peer_session
68
+ r = peer_session.create_response(orig_response.code)
69
+ r.copy_from(orig_response, :_sipper_all)
70
+ r.pop_via
71
+ return r
72
+ else
73
+ raise "Unable to create response"
74
+ end
75
+ end
76
+
77
+ def proxy_to(session, host, port)
78
+ get_or_create_peer_session(session, host, port)
79
+ relay_request(session)
80
+ end
81
+
82
+ # Transparently passes / relays the request given a peer session
83
+ # exists.
84
+ def relay_request(session)
85
+ peer_session = get_peer_session(session)
86
+ if peer_session
87
+ r = create_proxy_request(session)
88
+ peer_session.send(r)
89
+ else
90
+ raise "Unable to relay the request"
91
+ end
92
+ end
93
+
94
+ # Transparently passes / relays the response given a peer session
95
+ # exists.
96
+ def relay_response(session)
97
+ peer_session = get_peer_session(session)
98
+ if peer_session
99
+ r = create_proxy_response(session)
100
+ peer_session.send(r)
101
+ else
102
+ raise "Unable to relay the response"
103
+ end
104
+ end
105
+
106
+ # Marks this b2bua as transparent which allows the relaying of requests and
107
+ # responses between legs without any controller involvement.
108
+ def go_transparent(session, state=true)
109
+ session[:_sipper_proxy_transparent] = state
110
+ peer_session = get_peer_session(session)
111
+ peer_session[:_sipper_proxy_transparent] = state if peer_session
112
+ end
113
+
114
+
115
+ # if there exists a peer session then we transparently send the request as a b2bua
116
+ # if transparent flag is on.
117
+ def on_request(session)
118
+ peer_session = get_peer_session(session)
119
+ if peer_session && session[:_sipper_proxy_transparent]
120
+ relay_request(session)
121
+ else
122
+ super
123
+ end
124
+ end
125
+
126
+
127
+ # if there exists a peer session then we transparently pass the response as a b2bua
128
+ # if transparent flag is true
129
+ def on_response(session)
130
+ peer_session = get_peer_session(session)
131
+ if peer_session && session[:_sipper_proxy_transparent]
132
+ if session.iresponse.code == 100
133
+ tr_hash = self.class.get_transaction_usage
134
+ return if tr_hash[:use_transactions] || tr_hash[:use_ict]
135
+ end
136
+ relay_response(session)
137
+ else
138
+ super
139
+ end
140
+ end
141
+
142
+ end
143
+ end
@@ -0,0 +1,52 @@
1
+ require 'session'
2
+ require 'sip_logger'
3
+
4
+ class Registration
5
+ include SipLogger
6
+
7
+ class RegistrationData
8
+ attr_accessor :contact_uri, :expires, :q, :timestamp, :contact
9
+ def initialize(contact)
10
+ @contact = contact
11
+ end
12
+ end
13
+
14
+ def Registration.add_registration_data(contact, request)
15
+ reg_data = RegistrationData.new(contact.to_s)
16
+ reg_data.contact_uri = contact.uri
17
+
18
+ if contact[:expires] : reg_data.expires = contact.expires
19
+ elsif request[:expires] : reg_data.expires = request.expires.header_value
20
+ else reg_data.expires = "3600"
21
+ end
22
+
23
+ reg_data.q = contact[:q] ? contact.q : 0
24
+ reg_data.timestamp = Time.now
25
+ return reg_data
26
+ end
27
+
28
+ def Registration.update_registration_data(contact, reg_list, request)
29
+ updated = false
30
+ reg_list.each do |registration|
31
+ if registration.contact_uri == contact.uri
32
+ index = reg_list.index(registration)
33
+ if contact[:expires] : registration.expires = contact.expires
34
+ elsif request[:expires] : registration.expires = request.expires.header_value
35
+ else registration.expires = "3600"
36
+ end
37
+ registration.q = contact[:q] ? contact.q : 0
38
+ registration.timestamp = Time.now
39
+ if registration.expires.to_i == 0
40
+ reg_list.delete_at(index)
41
+ else
42
+ reg_list[index] = registration
43
+ end
44
+ updated =true
45
+ end
46
+ end
47
+ return updated
48
+ end
49
+
50
+
51
+
52
+ end
@@ -0,0 +1,109 @@
1
+ require 'util/counter'
2
+ require 'message'
3
+ require 'sip_logger'
4
+ require 'util/sipper_util'
5
+ require 'sip_headers/sipuri'
6
+
7
+ class Request < Message
8
+
9
+ include SipLogger
10
+
11
+ # Headers can be added by an argument hash :to=>"mytoheader"
12
+ # any "-" in the header replaced by a "_". The other way is to directly
13
+ # set the header like invite.contact = "blah" in this case also you must also replace
14
+ # any "-" in header with "_".
15
+
16
+ attr_accessor :method, :uri, :initial, :session_state_snapshot, :local_cseq_before_send
17
+
18
+ # system headers
19
+ @str = %q{ @h = {
20
+ :call_id => sprintf("_PH_GCNT_-%d@_PH_LIP_", Process.pid),
21
+ :from => "Sipper <sip:sipper@_PH_LIP_:_PH_LP_>;tag=_PH_LCTG_",
22
+ :to => "Sut <sip:sut@_PH_RIP_:_PH_RP_>",
23
+ :cseq => sprintf("_PH_LCNTS_ %s", @method),
24
+ :via => "SIP/2.0/_PH_TRANS_ _PH_LIP_:_PH_LP_;branch=z9hG4bK-_PH_LCNTS_-_PH_LCNTR_-_PH_GCNT_-_PH_RND_",
25
+ :contact => "<sip:_PH_LIP_:_PH_LP_;transport=_PH_TRANS_>",
26
+ :max_forwards => "70"
27
+ } }
28
+
29
+
30
+ class <<self
31
+ attr_reader :str
32
+ end
33
+
34
+ Request.class_eval Request.str
35
+
36
+
37
+ def Request.sys_hdrs
38
+ @h.keys
39
+ end
40
+
41
+
42
+ def initialize(method, uri, *hh)
43
+ super(*hh)
44
+ @method = method.to_s.upcase
45
+ if uri.class == URI::SipUri
46
+ @uri = uri.dup
47
+ else
48
+ @uri = URI::SipUri.new.assign(uri.to_s)
49
+ end
50
+ logi("Creating a new #{method} request for #{uri}")
51
+ end
52
+
53
+ # This is a low level method and allows the caller to custom
54
+ # create the initial requests. If you do not want to create
55
+ # (and manage) all individual headers then you should use
56
+ # Session#create_initial_request.
57
+ def Request.create_initial *args
58
+ r = new(*args)
59
+ r.initial = true
60
+ r.incoming = false
61
+ r.create_system_headers
62
+ r.define_from_hash(args[2]) if args[2]
63
+ return r
64
+ end
65
+
66
+ # This method should not be used if all you want is to create
67
+ # a subsequent request from a controller. This is a low level
68
+ # method and allows the caller to custom create the subsequent
69
+ # requests. If you do not want to manipulate (and manage) all
70
+ # individual headers then you should use Session#create_subsequent_request.
71
+ def Request.create_subsequent *args
72
+ r = new(*args)
73
+ r.initial = false
74
+ r.incoming = false
75
+ return r
76
+ end
77
+
78
+
79
+ def Request.parse(req_arr, recvd_options)
80
+ str = req_arr[0].split # INVITE sip:sut@202.17.31.207:5060 SIP/2.0
81
+ r = new(str[0].strip, str[1].strip)
82
+ r.parse_headers req_arr[1..-1]
83
+ r.incoming = true
84
+ # According to 3581
85
+ # In fact, the server MUST insert a "received" parameter
86
+ # containing the source IP address that the request came from, even if
87
+ # it is identical to the value of the "sent-by" component. Note that
88
+ # this processing takes place independent of the transport protocol.
89
+ if r.via
90
+ r.via.received = recvd_options[:received_ip]
91
+ if r.via.has_param?(:rport)
92
+ r.via.rport = recvd_options[:received_port].to_s
93
+ end
94
+ end
95
+ return r
96
+ end
97
+
98
+
99
+ def to_s
100
+ msg = sprintf("%s %s SIP/2.0\r\n", @method, @uri.to_s)
101
+ msg = _format_message(msg)
102
+ end
103
+
104
+ def create_system_headers
105
+ instance_eval Request.str
106
+ define_from_hash @h
107
+ end
108
+
109
+ end
@@ -0,0 +1,123 @@
1
+ require 'util/counter'
2
+ require 'message'
3
+ require 'sip_logger'
4
+
5
+ class Response < Message
6
+
7
+ include SipLogger
8
+
9
+ attr_accessor :code, :status
10
+ attr_writer :local
11
+ STATUS_MESSAGES = {
12
+ 100 => "Trying",
13
+ 180 => "Ringing",
14
+ 182 => "Queued",
15
+ 183 => "Session Progress",
16
+ 200 => "OK",
17
+ 202 => "Accepted",
18
+ 300 => "Multiple Choices",
19
+ 301 => "Moved Permanently",
20
+ 302 => "Moved Temporarily",
21
+ 305 => "Use Proxy",
22
+ 380 => "Alternative Service",
23
+ 400 => "Bad Request",
24
+ 401 => "Unauthorized",
25
+ 402 => "Payment Required",
26
+ 403 => "Forbidden",
27
+ 404 => "Not Found",
28
+ 405 => "Method Not Allowed",
29
+ 406 => "Not Acceptable",
30
+ 407 => "Proxy Authentication Required",
31
+ 408 => "Request Timeout",
32
+ 409 => "Conflict",
33
+ 410 => "Gone",
34
+ 413 => "Request Entity Too Large",
35
+ 414 => "Request-URI Too Long",
36
+ 415 => "Unsupported Media Type",
37
+ 416 => "Unsupported URI Scheme",
38
+ 420 => "Bad Extension",
39
+ 421 => "Extension Required",
40
+ 423 => "Interval Too Brief",
41
+ 480 => "Temporarily Unavailable",
42
+ 481 => "Call/Transaction Does Not Exist",
43
+ 482 => "Loop Detected",
44
+ 483 => "Too Many Hops",
45
+ 484 => "Address Incomplete",
46
+ 485 => "Ambiguous",
47
+ 486 => "Busy Here",
48
+ 487 => "Transaction Canceled",
49
+ 488 => "Not Acceptable Here",
50
+ 491 => "Request Pending",
51
+ 493 => "Undecipherable",
52
+ 500 => "Server Error",
53
+ 501 => "Not Implemented",
54
+ 502 => "Bad Gateway",
55
+ 503 => "Service Unavailable",
56
+ 504 => "Server Time-out",
57
+ 505 => "Version Not Supported",
58
+ 513 => "Message Too Large",
59
+ 503 => "Service Unavailable",
60
+ 600 => "Busy Everywhere",
61
+ 603 => "Decline",
62
+ 604 => "Does Not Exist Anywhere",
63
+ 606 => "Not Acceptable"
64
+ }
65
+
66
+ def initialize(code, status=nil, *hh)
67
+ super(*hh)
68
+ @code = code
69
+ if status && status != "SELECT"
70
+ @status = status
71
+ else
72
+ @status = STATUS_MESSAGES[code]
73
+ unless @status
74
+ @status = STATUS_MESSAGES[(code/100)*100]
75
+ end
76
+ end
77
+ logi("Creating a new #{code} response")
78
+ end
79
+
80
+ # A low level method that allows to custom create the responses.
81
+ def Response.create *args
82
+ r = new(*args)
83
+ r.incoming = false
84
+ return r
85
+ end
86
+
87
+
88
+ def Response.parse(res_arr)
89
+ md = SIP_VER_PATT.match(res_arr[0]) #SIP/2.0 180 Ringing
90
+ str = md.post_match.strip # 180 Ringing
91
+ md = /\d+/.match(str)
92
+ r = new(md[0].to_i, md.post_match.strip)
93
+ r.parse_headers res_arr[1..-1]
94
+ r.incoming = true
95
+ return r
96
+ end
97
+
98
+ def locally_generated?
99
+ @local
100
+ end
101
+
102
+ def to_s
103
+ msg = sprintf("SIP/2.0 %s %s\r\n", @code, @status)
104
+ msg = _format_message(msg)
105
+ end
106
+
107
+ # The method is to find out the corresponding request method of the received response.
108
+ def get_request_method
109
+ SipperUtil.cseq_method(self.cseq)
110
+ end
111
+
112
+ def set_request(inRequest)
113
+ @request = inRequest
114
+ end
115
+
116
+ def get_request()
117
+ raise "No associated request." unless @request
118
+ return @request
119
+ end
120
+
121
+ end
122
+
123
+