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,352 @@
1
+
2
+ =begin
3
+ SIP-URI = "sip:" [ userinfo ] hostport
4
+ uri-parameters [ headers ]
5
+ SIPS-URI = "sips:" [ userinfo ] hostport
6
+ uri-parameters [ headers ]
7
+ userinfo = ( user / telephone-subscriber ) [ ":" password ] "@"
8
+ user = 1*( unreserved / escaped / user-unreserved )
9
+ user-unreserved = "&" / "=" / "+" / "$" / "," / ";" / "?" / "/"
10
+ password = *( unreserved / escaped /
11
+ "&" / "=" / "+" / "$" / "," )
12
+ hostport = host [ ":" port ]
13
+ host = hostname / IPv4address / IPv6reference
14
+ hostname = *( domainlabel "." ) toplabel [ "." ]
15
+ domainlabel = alphanum
16
+ / alphanum *( alphanum / "-" ) alphanum
17
+ toplabel = ALPHA / ALPHA *( alphanum / "-" ) alphanum
18
+ IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
19
+ IPv6reference = "[" IPv6address "]"
20
+ IPv6address = hexpart [ ":" IPv4address ]
21
+ hexpart = hexseq / hexseq "::" [ hexseq ] / "::" [ hexseq ]
22
+ hexseq = hex4 *( ":" hex4)
23
+ hex4 = 1*4HEXDIG
24
+ port = 1*DIGIT
25
+
26
+ The BNF for telephone-subscriber can be found in RFC 2806 [9]. Note, however, that
27
+ any characters allowed there that are not allowed in the user part of the SIP URI MUST be escaped.
28
+
29
+ uri-parameters = *( ";" uri-parameter)
30
+ uri-parameter = transport-param / user-param / method-param
31
+ / ttl-param / maddr-param / lr-param / other-param
32
+ transport-param = "transport="
33
+ ( "udp" / "tcp" / "sctp" / "tls"
34
+ / other-transport)
35
+ other-transport = token
36
+ user-param = "user=" ( "phone" / "ip" / other-user)
37
+ other-user = token
38
+ method-param = "method=" Method
39
+ ttl-param = "ttl=" ttl
40
+ maddr-param = "maddr=" host
41
+ lr-param = "lr"
42
+ other-param = pname [ "=" pvalue ]
43
+ pname = 1*paramchar
44
+ pvalue = 1*paramchar
45
+ paramchar = param-unreserved / unreserved / escaped
46
+ param-unreserved = "[" / "]" / "/" / ":" / "&" / "+" / "$"
47
+
48
+ headers = "?" header *( "&" header )
49
+ header = hname "=" hvalue
50
+ hname = 1*( hnv-unreserved / unreserved / escaped )
51
+ hvalue = *( hnv-unreserved / unreserved / escaped )
52
+ hnv-unreserved = "[" / "]" / "/" / "?" / ":" / "+" / "$"
53
+
54
+ =end
55
+
56
+ # General form sip:user:password@host:port;uri-parameters?headers
57
+ # user:password = userinfo component
58
+ #
59
+
60
+ require 'uri'
61
+ require 'util/sipper_util'
62
+ require 'ruby_ext/object'
63
+ require 'facets/core/hash/reverse_merge'
64
+ require 'sip_logger'
65
+ require 'ruby_ext/mutable_class'
66
+ require 'cgi'
67
+
68
+ module URI
69
+
70
+ class SipUri
71
+ include SipLogger
72
+
73
+ attr_accessor :proto, :user, :password, :host, :port,
74
+ :uri_params, :headers, :frozen_str
75
+
76
+
77
+ alias_method :old_dup, :dup
78
+
79
+ ASSIGN = /=$/.freeze
80
+
81
+ COLON = /:/.freeze
82
+ SCOLON = /;/.freeze
83
+ AMP = /&/.freeze
84
+ QUES = /\?/.freeze
85
+ AT = /@/.freeze
86
+ EQL = /=/.freeze
87
+ DQ = /\"/.freeze
88
+
89
+ def dup
90
+ obj = self.old_dup
91
+ obj.frozen_str = self.frozen_str.dup
92
+ obj.proto = self.proto.dup
93
+ obj.user = self.user.dup
94
+ obj.password = self.password.dup
95
+ obj.host = self.host.dup
96
+ obj.port = self.port.dup
97
+ obj.uri_params = self.uri_params.dup
98
+ obj.headers = self.headers.dup
99
+ obj
100
+ end
101
+
102
+ def ==(other)
103
+ return true if self.object_id==other.object_id
104
+ self.to_s == other.to_s
105
+ end
106
+
107
+
108
+ def to_s
109
+ if @frozen_str
110
+ @frozen_str
111
+ else
112
+ _format
113
+ end
114
+ end
115
+
116
+ def to_str
117
+ to_s
118
+ end
119
+
120
+ def freeze
121
+ @frozen_str = _format unless @frozen_str
122
+ super
123
+ end
124
+
125
+ def ==(other)
126
+ self.to_s == other.to_s
127
+ end
128
+
129
+ # Returns the complete formatted URI
130
+ # this is the default format method.
131
+ # sip:user:password@host:port;uri-parameters?headers
132
+ def _format
133
+ return nil unless self.host
134
+ str = self.proto.dup
135
+ str << ":"
136
+ str << self.user if self.user
137
+ if self.user && self.password
138
+ str << ":"
139
+ str << self.password
140
+ end
141
+ str << "@" if self.user
142
+ str << self.host
143
+ if self.port
144
+ str << ":"
145
+ str << self.port.to_s
146
+ end
147
+ if self.uri_params
148
+ self.uri_params.each do |k,v|
149
+ if v
150
+ if v == ""
151
+ str << ";" << k
152
+ else
153
+ str << ";" << k << "=" << v
154
+ end
155
+ end
156
+ end
157
+ end
158
+
159
+ if self.headers
160
+ first = true
161
+ self.headers.each do |k,v|
162
+ if v
163
+ if v == ""
164
+ if first
165
+ str << "?" << k
166
+ first = false
167
+ else
168
+ str << "&" << k
169
+ end
170
+ else
171
+ if first
172
+ str << "?" << SipperUtil.headerize(k) << "=" << CGI.escape(v.to_s)
173
+ first = false
174
+ else
175
+ str << "&" << SipperUtil.headerize(k) << "=" << CGI.escape(v.to_s)
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ str
182
+ end
183
+ private :_format
184
+
185
+
186
+
187
+ def cache_and_clear(val_str, iv_arr)
188
+ @frozen_str = val_str
189
+ @headers = {}
190
+ @uri_params = {}
191
+ clear_ivs(iv_arr)
192
+ end
193
+ protected :cache_and_clear
194
+
195
+ # sip:user:password@host:port;uri-parameters?headers
196
+ def assign(val_str, parse=true)
197
+ if (!parse || val_str=="*")
198
+ cache_and_clear(val_str, [:@proto, :@user, :@password, :@host, :@port])
199
+ else
200
+ @frozen_str = nil
201
+ str = val_str
202
+ @headers = {}
203
+ @uri_params = {}
204
+ hsa = str.split(QUES) # done to avoid a COLON appearing in a header
205
+ _extract_headers(hsa[1]) if hsa.length > 1
206
+ csa = hsa[0].split(COLON) #colon separated array
207
+
208
+
209
+ case csa.length
210
+ # sip:host;uri-parameters
211
+ # sip:user@host;uri-parameters
212
+ when 2
213
+ @proto = csa[0]
214
+ if idx=csa[1].index(SCOLON)
215
+ if aidx=csa[1].index(AT)
216
+ @user = csa[1][0...aidx]
217
+ @host = csa[1][aidx+1...idx]
218
+ else
219
+ @host = csa[1][0...idx]
220
+ end
221
+ _extract_params(csa[1])
222
+ else
223
+ if aidx=csa[1].index(AT)
224
+ @user = csa[1][0...aidx]
225
+ @host = csa[1][aidx+1..-1]
226
+ else
227
+ @host = csa[1]
228
+ end
229
+ end
230
+
231
+ # <1> sip:user@host:port;uri-parameters
232
+ # or <2> sip:user:password@host;uri-parameters
233
+ # or <3> sip:host:port;uri-parameters
234
+ when 3
235
+ @proto = csa[0]
236
+ if idx=csa[1].index(AT) #first form
237
+ @user = csa[1][0...idx]
238
+ @host = csa[1][idx+1..-1]
239
+ if idx=csa[2].index(SCOLON)
240
+ @port = csa[2][0...idx]
241
+ _extract_params(csa[2])
242
+ else
243
+ @port = csa[2]
244
+ end
245
+ elsif idx=csa[2].index(AT) #second form
246
+ @user = csa[1]
247
+ asa = csa[2].split(AT)
248
+ @password = asa[0]
249
+ if idx=asa[1].index(SCOLON)
250
+ @host = asa[1][0...idx]
251
+ _extract_params(asa[1])
252
+ else
253
+ @host = asa[1]
254
+ end
255
+ else #third form
256
+ @host = csa[1]
257
+ if idx=csa[2].index(SCOLON)
258
+ @port = csa[2][0...idx]
259
+ _extract_params(csa[2])
260
+ else
261
+ @port = csa[2]
262
+ end
263
+ end
264
+
265
+ # sip:user:password@host:port;uri-parameters?headers
266
+ when 4
267
+ @proto = csa[0]
268
+ @user = csa[1]
269
+ asa = csa[2].split(AT)
270
+ @password = asa[0]
271
+ @host = asa[1]
272
+ if idx=csa[3].index(SCOLON)
273
+ @port = csa[3][0...idx]
274
+ _extract_params(csa[3])
275
+ end
276
+ end
277
+ end
278
+ self
279
+ end
280
+
281
+
282
+ # out of xyz;uri-parameters?headers
283
+ # takes xyz;uri-parameters
284
+ def _extract_params(str)
285
+ @uri_params = SipperUtil.parameterize_header(str)[1]
286
+ end
287
+ private :_extract_params
288
+
289
+ # out of xyz;uri-parameters?headers
290
+ # takes 'headers'
291
+ def _extract_headers(str)
292
+
293
+ asa = str.split(AMP)
294
+ @headers = {}
295
+ asa.each do |hdr|
296
+ esa = hdr.split(EQL)
297
+ hname = SipperUtil.methodize(esa[0])
298
+ if esa[1]
299
+
300
+ if esa[1] =~ DQ
301
+ hv = esa[1][1...-1]
302
+ else
303
+ hv = esa[1]
304
+ end
305
+ hv = CGI.unescape(hv)
306
+ @headers[hname] = SipperUtil.find_parser_and_parse(hname, hv, true)
307
+ end
308
+ end
309
+ end
310
+ private :_extract_headers
311
+
312
+
313
+
314
+ def get_param(param)
315
+ @uri_params[param.to_s]
316
+ end
317
+
318
+ def add_param(param, val)
319
+ @uri_params[param.to_s] = val
320
+ end
321
+
322
+ def has_param?(key)
323
+ @uri_params.has_key?(key.to_s)
324
+ end
325
+
326
+ def remove_param(param)
327
+ @uri_params.delete(param.to_s)
328
+ end
329
+
330
+
331
+
332
+ def get_header(hdr)
333
+ @headers[SipperUtil.methodize(hdr)]
334
+ end
335
+
336
+ def add_header(hdr, val)
337
+ hname = SipperUtil.methodize(hdr)
338
+ @headers[hname] = SipperUtil.find_parser_and_parse(hname, val, true)
339
+ end
340
+
341
+ def has_header?(key)
342
+ @headers.has_key?(SipperUtil.methodize(key))
343
+ end
344
+
345
+ def remove_header(hdr)
346
+ @headers.delete(SipperUtil.methodize(hdr))
347
+ end
348
+
349
+
350
+ end
351
+
352
+ end
@@ -0,0 +1,65 @@
1
+ require 'log4r'
2
+ require 'log4r/configurator'
3
+ require 'modified_pattern_formatter'
4
+ require 'sipper_configurator'
5
+ require 'bin/common'
6
+
7
+ module SipLogger
8
+ include Log4r
9
+ SipperUtil::Common.set_environment()
10
+ Configurator['logpath'] = SipperConfigurator[:LogPath]||(SipperConfigurator[:LogPath]= File.join(File.dirname(__FILE__), "logs"))
11
+ Configurator['pid'] = Process.pid.to_s
12
+ Configurator['udfname'] = $ULOGNAME || ""
13
+ if SipperConfigurator[:ConfigPath]
14
+ Configurator.load_xml_file File.join(SipperConfigurator[:ConfigPath],"log4r.xml")
15
+ else
16
+ Configurator.load_xml_file File.join(File.dirname(__FILE__), "config", "log4r.xml")
17
+ end
18
+
19
+ @@class_named_loggers = {} #configured loggers only
20
+
21
+ Logger.each_logger do |logger|
22
+ @@class_named_loggers[logger.name] = logger
23
+ end
24
+
25
+ # look up logger by full name eg. siplog::request
26
+ def SipLogger.[](arg)
27
+ Logger[arg]
28
+ end
29
+
30
+ def SipLogger.each &block
31
+ Logger.each_logger(&block)
32
+ end
33
+
34
+ # gets the class named logger
35
+ def logger
36
+ @@class_named_loggers[self.class_name.downcase]
37
+ end
38
+
39
+ # the log methods
40
+ def logd(arg)
41
+ logger.debug(arg) if logger.debug?
42
+ end
43
+
44
+ def logi(arg)
45
+ logger.info(arg) if logger.info?
46
+ end
47
+
48
+ def logw(arg)
49
+ logger.warn(arg) if logger.warn?
50
+ end
51
+
52
+ def loge(arg)
53
+ logger.error(arg) if logger.error?
54
+ end
55
+
56
+ def logf(arg)
57
+ logger.fatal(arg) if logger.fatal?
58
+ end
59
+ # Direction I/O (incoming/outgoing), remore ip, remote port, message
60
+ def logsip(direction, rip, rp, lip, lp, msg)
61
+ SipLogger['sipmsgtracelog'].debug("\nremote #{rip}:#{rp}\nlocal #{lip}:#{lp}\n----------#{direction}----------\n#{msg}\n---------------------\n")
62
+ end
63
+
64
+
65
+ end
@@ -0,0 +1,231 @@
1
+ require 'transport/udp_transport'
2
+ require 'sip_logger'
3
+ require 'util/sipper_util'
4
+ require 'message'
5
+ require 'request'
6
+ require 'response'
7
+ require 'session'
8
+ require 'udp_session'
9
+ require 'util/timer/timer_task'
10
+ require 'stray_message_manager'
11
+ require 'sipper_http/sipper_http_response'
12
+
13
+ class SipMessageRouter
14
+
15
+ include SipLogger
16
+ include SipperUtil
17
+
18
+ attr_reader :tg, :running
19
+
20
+ def initialize(queue, num_threads=5)
21
+ @q = queue
22
+ @num_threads = num_threads
23
+ @tg = ThreadGroup.new
24
+ @running = false
25
+ @run = false
26
+ # todo running and run is not thread safe
27
+ log_and_raise "Message Queue is not set", ArgumentError unless @q
28
+ end
29
+
30
+
31
+ def start
32
+ @run = true
33
+ 1.upto(@num_threads) do |i|
34
+ @tg.add(
35
+ Thread.new do
36
+ Thread.current[:name] = "WorkerThread-"+i.to_s
37
+ while @run
38
+ msg = @q.pop
39
+ #logd("Message #{msg} picked up from queue")
40
+ logi("Message picked from queue, now parsing")
41
+ r = Message.parse(msg)
42
+ 2.times do # one optional retry
43
+ case r
44
+ when Request
45
+ logd("REQUEST RECEIVED #{r}")
46
+ logsip("I", r.rcvd_from_info[3], r.rcvd_from_info[1], r.rcvd_at_info[0], r.rcvd_at_info[1], r)
47
+ if r.to_tag && !r.attributes[:_sipper_initial]
48
+ # call_id, local, remote
49
+ s = SessionManager.find_session(r.call_id, r.to_tag, r.from_tag)
50
+ if s
51
+ s.on_message r
52
+ break
53
+ else
54
+ if hndlr = SIP::StrayMessageManager.stray_message_handler
55
+ logd("Found a stray message handler for the request, invoking it")
56
+ ret = hndlr.handle(r)
57
+ case ret[0]
58
+ when SIP::StrayMessageHandler::SMH_DROP
59
+ logw("A stray request #{r.method} being dropped by SMH")
60
+ break
61
+ when SIP::StrayMessageHandler::SMH_HANDLED
62
+ logd("A stray request #{r.method} handled by SMH")
63
+ break
64
+ when SIP::StrayMessageHandler::SMH_RETRY
65
+ logd("A stray request #{r.method} received, SMH retries")
66
+ r = ret[1] if ret[1]
67
+ if r.attributes[:_sipper_retried]
68
+ logw("Already retried request now dropping")
69
+ break
70
+ else
71
+ r.attributes[:_sipper_retried] = true
72
+ next
73
+ end
74
+ when SIP::StrayMessageHandler::SMH_TREAT_INITIAL
75
+ logd("A stray request #{r.method} received, SMH treating as initial")
76
+ r = ret[1] if ret[1]
77
+ if r.attributes[:_sipper_initial]
78
+ logw("Already retried request now dropping")
79
+ break
80
+ else
81
+ r.attributes[:_sipper_initial] = true
82
+ next
83
+ end
84
+ else
85
+ logw("A stray request #{r.method} SMH response not understood, dropping")
86
+ break
87
+ end
88
+ else
89
+ logw("A stray request #{r.method} received, dropping as no handler")
90
+ break
91
+ end
92
+ end
93
+ else
94
+ # call_id, local, remote
95
+ s = SessionManager.find_session(r.call_id, r.to_tag, r.from_tag)
96
+ if s
97
+ logd("Matched session #{s}")
98
+ s.on_message r
99
+ break
100
+ else # create a new session
101
+ logd("No matching session found")
102
+ ctrs = SIP::Locator[:Cs].get_controllers(r)
103
+ logd("Initial request, total controllers returned are #{ctrs.size}")
104
+ ctrs.each do |c|
105
+ if c.interested?(r)
106
+ logd("Controller #{c.name} is interested in #{r.method}")
107
+ #["AF_INET", 33302, "localhost.localdomain", "127.0.0.1"]
108
+ # todo tcp support here
109
+ if stp = c.specified_transport
110
+ logd("Controller #{c.name} specified #{stp} transport")
111
+ unless (stp[0] == r.rcvd_at_info[0] &&
112
+ stp[1] == r.rcvd_at_info[1])
113
+ next
114
+ end
115
+ end
116
+ if(r.rcvd_from_info[0] == "AF_INET") # todo need to identify the transport
117
+ s = c.create_udp_session(r.rcvd_from_info[3], r.rcvd_from_info[1])
118
+ end
119
+ s.pre_set_dialog_id(r) # to facilitate addition in session manager
120
+ SessionManager.add_session(s, false)
121
+ s.on_message(r)
122
+ break
123
+ end
124
+ end # controller loop
125
+ # if no controller on initial request then respond with 502
126
+ unless s
127
+ if hndlr = SIP::StrayMessageManager.stray_message_handler
128
+ logd("Found a stray message handler for the init request, invoking it")
129
+ ret = hndlr.handle(r)
130
+ case ret[0]
131
+ when SIP::StrayMessageHandler::SMH_DROP
132
+ logw("A stray init request #{r.method} being dropped by SMH")
133
+ break
134
+ when SIP::StrayMessageHandler::SMH_HANDLED
135
+ logd("A stray init request #{r.method} handled by SMH")
136
+ break
137
+ when SIP::StrayMessageHandler::SMH_RETRY
138
+ logd("A stray init request #{r.method} received, SMH retries")
139
+ r = ret[1] if ret[1]
140
+ if r.attributes[:_sipper_retried]
141
+ logw("Already retried init request now dropping")
142
+ break
143
+ else
144
+ r.attributes[:_sipper_retried] = true
145
+ next
146
+ end
147
+ else
148
+ logw("A stray init request #{r.method} SMH response not understood, dropping")
149
+ break
150
+ end
151
+ else
152
+ # todo either send a 502 or cleanup the log
153
+ logw("A stray init request #{r.method} received, sending 502")
154
+ break
155
+ end
156
+ else
157
+ break
158
+ end
159
+ end # if session found
160
+ end # r.to-tag
161
+
162
+ when Response
163
+ logd("RESPONSE RECEIVED #{r}")
164
+ logsip("I", r.rcvd_from_info[3], r.rcvd_from_info[1], r.rcvd_at_info[0], r.rcvd_at_info[1], r)
165
+ # call_id, local, remote
166
+ s = SessionManager.find_session(r.call_id, r.from_tag, r.to_tag, (SipperUtil::SUCC_RANGE.include?r.code))
167
+ if s
168
+ logd("Session found, sending response to session")
169
+ s.on_message r
170
+ break
171
+ else
172
+ if hndlr = SIP::StrayMessageManager.stray_message_handler
173
+ logd("Found a stray message handler for the response, invoking it")
174
+ ret = hndlr.handle(r)
175
+ case ret[0]
176
+ when SIP::StrayMessageHandler::SMH_DROP
177
+ logw("A stray response #{r.code} being dropped by SMH")
178
+ break
179
+ when SIP::StrayMessageHandler::SMH_HANDLED
180
+ logd("A stray response #{r.code} handled by SMH")
181
+ break
182
+ when SIP::StrayMessageHandler::SMH_RETRY
183
+ logd("A stray response #{r.code} received, SMH retries")
184
+ r = ret[1] if ret[1]
185
+ if r.attributes[:_sipper_retried]
186
+ logw("Already retried response now dropping")
187
+ break
188
+ else
189
+ r.attributes[:_sipper_retried] = true
190
+ next
191
+ end
192
+ else
193
+ logw("A stray response #{r.code} SMH response not understood, dropping")
194
+ break
195
+ end
196
+ else
197
+ logw("A stray response #{r.code} received, dropping")
198
+ break
199
+ end
200
+ end
201
+
202
+ when SIP::TimerTask
203
+ logd("TIMER RECEIVED #{r}")
204
+ r.invoke
205
+ break
206
+ when Media::SipperMediaEvent
207
+ logd("Media Response/Event received")
208
+ r.session.on_message r
209
+ break
210
+ when SipperHttp::SipperHttpResponse
211
+ logd("Sipper HTTP response received")
212
+ r.dispatch
213
+ else
214
+ logw("DONT KNOW WHAT YOU SENT")
215
+ break
216
+ end
217
+ end
218
+ end
219
+ end
220
+ )
221
+ end
222
+ @running = true
223
+ end
224
+
225
+ def stop
226
+ @run = false
227
+ @running = false
228
+ @tg.list.each { |t| t.kill }
229
+ end
230
+
231
+ end