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,274 @@
1
+ require 'transaction/Ict_sm'
2
+ require 'transaction/transaction'
3
+ require 'transaction/state_machine_wrapper'
4
+ require 'util/timer/sip_timer_helper'
5
+ require 'sip_logger'
6
+ require 'util/locator'
7
+ require 'ruby_ext/object'
8
+ require 'request'
9
+ require 'util/sipper_util'
10
+
11
+ module SIP
12
+ module Transaction
13
+ class InviteClientTransaction < SIP::Transaction::BaseTransaction
14
+ include SipLogger
15
+
16
+ # to be used for accessing msg for printing/recording
17
+ attr_accessor :msg_sent, :cancel_ctxn
18
+
19
+ # The transport to use, transport flags, remote ip and port
20
+ # the block is to be used to override the T1, T2, even TimerA etc. timer value.
21
+ # The block can for example have { self.t1 = 200; self.ta=100 } to override the
22
+ # T1, A on a transaction by transcation basis, otherwise the default is
23
+ # taken from SipperConfigurator or SIP::Transaction::BaseTransaction::T1
24
+ # in that order.
25
+ # Usage: TU creates transaction and starts invoking "Invocation Action"
26
+ # methods. Also for responses received, checks whether to consume them
27
+ # or not based on consume? method return value.
28
+ # There are four call backs into TU from ICT and they are notification on
29
+ # transport error and transaction timeout.
30
+ # There are 4 TU callbacks.
31
+ # (a) transaction_transport_err() gets called should ICT get a transport failure
32
+ # (b) transaction_timeout() gets called on timeout of transaction
33
+ # (c) transaction_transaction_cleanup() gets called on transaction termination.
34
+ # (d) transaction_wrong_state() if the transaction transition is tried in a wrong state
35
+ # i.e a message is either received or being tried to send out in a state where it is
36
+ # illegal to do so.
37
+ def initialize(tu, branch_id, txn_handler, transport, tp_flags, &block)
38
+ @transaction_name = :Ict # need to have this name defined for every transaction
39
+ @tu = tu
40
+ @branch_id = branch_id
41
+ @transport = transport
42
+ @txn_handler = txn_handler
43
+ @tp_flags = tp_flags
44
+ self.td = 0 if @transport.reliable? # one line later it can be overidden by arguments.
45
+ super(&block) # override timers
46
+ #@sm = Ict_sm.new(self)
47
+ SIP::Transaction::StateMachineWrapper.bootstrap_machine(self, Ict_sm)
48
+ @sm = SIP::Transaction::StateMachineWrapper.new(self, @txn_handler, Ict_sm)
49
+ logd("Created the Invite Client Transcation with #{@transport}")
50
+ end
51
+
52
+
53
+ def cancel_ctxn=(ctxn)
54
+ @cancel_ctxn = ctxn
55
+ @ok_to_run_timerY = true
56
+ @sm.cancel_sent
57
+ end
58
+
59
+
60
+ # Need to handle this after the transition has happened and not in the
61
+ # _send_to_transport exception handler because state transition from
62
+ # within a transition is not possible in smc
63
+ def _check_transport_err
64
+ @sm.transport_err if @transport_err
65
+ end
66
+
67
+
68
+ #--- SM Invocation Actions <start>---------
69
+
70
+ #------------------
71
+ # The two methods txn_send and txn_received are two general purpose methods
72
+ # that will be called by the TU as against the transcation type specific
73
+ # methods defined on each type of transaction.
74
+ #
75
+ # ICT sends only INVITEs from TU
76
+ def txn_send(msg)
77
+ @message = msg # the msg is accessed from transaction
78
+ raise "ICT can only send INVITEs" unless (msg.is_request? && msg.method=="INVITE")
79
+ self._send_invite(msg)
80
+ end
81
+
82
+ # The ICT receives responses (provisional, success final, non-succes final)
83
+ def txn_received(msg)
84
+ @message = msg
85
+ raise "ICT can only receive responses" unless msg.is_response?
86
+ msg.set_request(@invite)
87
+ case msg.code
88
+ when 100..199
89
+ _provisional_received
90
+ when 200..299
91
+ _success_final_received(msg)
92
+ when 300..699
93
+ _non_success_final_received(msg)
94
+ else
95
+ raise "ICT cannot deal with response #{msg}"
96
+ end
97
+ end
98
+ #------------------
99
+
100
+ # These method is to be invoked by the TU to send the invite
101
+ # The state machine drives the whole interaction by calling the
102
+ # callbacks.
103
+
104
+ def _send_invite(req)
105
+ @invite = req
106
+ @ok_to_run_timerA = true unless @transport.reliable?
107
+ @ok_to_run_timerB = true
108
+ @sm.invite
109
+ _check_transport_err
110
+ rescue Statemap::TransitionUndefinedException => e
111
+ loge "Cannot send invite in #{self.state} state for #{self}"
112
+ @tu.transaction_wrong_state(self) if @tu
113
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
114
+ end
115
+
116
+
117
+ def _provisional_received
118
+ @sm.provisional
119
+ _check_transport_err
120
+ rescue Statemap::TransitionUndefinedException => e
121
+ loge "Received a provisional in #{self.state} state for #{self}"
122
+ @tu.transaction_wrong_state(self) if @tu
123
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
124
+ end
125
+
126
+
127
+ # invoked by TU for a 300-699 class response
128
+ def _non_success_final_received(res)
129
+ @response = res
130
+ @sm.non_success_final
131
+ _check_transport_err
132
+ rescue Statemap::TransitionUndefinedException => e
133
+ loge "Received an non 2xx response in #{self.state} state for #{self}"
134
+ @tu.transaction_wrong_state(self) if @tu
135
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
136
+ end
137
+
138
+ def _success_final_received(res)
139
+ @response = res
140
+ @sm.success_final
141
+ _check_transport_err
142
+ rescue Statemap::TransitionUndefinedException => e
143
+ loge "Received a 2xx response in #{self.state} state for #{self}"
144
+ @tu.transaction_wrong_state(self) if @tu
145
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
146
+ end
147
+
148
+ #--- SM Invocation Actions <end>---------
149
+
150
+
151
+ #------ Timer callback------
152
+ def on_timer_expiration(timer_task)
153
+ super # check for invalidation
154
+ case timer_task.tid
155
+ when :ta
156
+ @sm.timer_A(timer_task.duration) if @ok_to_run_timerA
157
+ _check_transport_err
158
+ when :tb
159
+ @sm.timer_B if @ok_to_run_timerB
160
+ when :td
161
+ @sm.timer_D
162
+ when :ty
163
+ @sm.timer_Y if @ok_to_run_timerY
164
+ end
165
+ rescue Statemap::TransitionUndefinedException => e
166
+ loge "Timer #{timer_task.tid} got fired for #{self}"
167
+ @tu.transaction_wrong_state(self) if @tu
168
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
169
+ end
170
+ #----------------------------
171
+
172
+
173
+
174
+ #------SM Callbacks <start>--------
175
+
176
+ def __send_invite
177
+ logd "Sending INVITE from the Ict #{self}"
178
+ _send_to_transport(@invite)
179
+ end
180
+
181
+ def __start_A
182
+ return unless @ok_to_run_timerA
183
+ task = SIP::Locator[:Sth].schedule_for(self, :ta, nil, :transaction, self.ta)
184
+ logd("Starting Timer A #{task} from Ict #{self}")
185
+ end
186
+
187
+ def __start_B
188
+ return unless @ok_to_run_timerB
189
+ task = SIP::Locator[:Sth].schedule_for(self, :tb, nil, :transaction, self.tb)
190
+ logd("Starting Timer B #{task} from Ict #{self}")
191
+ end
192
+
193
+ def __start_D
194
+ task = SIP::Locator[:Sth].schedule_for(self, :td, nil, :transaction, self.td)
195
+ logd("Starting Timer D #{task} from Ict #{self}")
196
+ end
197
+
198
+ def __start_Y
199
+ return unless @ok_to_run_timerY
200
+ task = SIP::Locator[:Sth].schedule_for(self, :ty, nil, :transaction, self.ty)
201
+ logd("Starting Timer Y #{task} from Ict #{self}")
202
+ end
203
+
204
+ def __reset_A(t)
205
+ self.ta = 2*t
206
+ __start_A
207
+ end
208
+
209
+ def __timeout
210
+ logw("Transaction timeout happened")
211
+ @txn_handler.timeout(self) if @txn_handler && @txn_handler.respond_to?(:timeout)
212
+ @tu.transaction_timeout(self) if @tu
213
+ end
214
+
215
+ def __cancel_A
216
+ logd "canceling timer A"
217
+ @ok_to_run_timerA = false
218
+ end
219
+
220
+ def __cancel_B
221
+ logd "canceling timer B"
222
+ @ok_to_run_timerB = false
223
+ end
224
+
225
+ def __cancel_Y
226
+ logd "canceling timer Y"
227
+ @ok_to_run_timerY = false
228
+ end
229
+
230
+ def __consume_msg(b)
231
+ @consume = b
232
+ end
233
+
234
+ # see section 17.1.1.3 of RFC 3261
235
+ # this is ACK only for non 2xx final responses.
236
+ def __create_ack()
237
+ return if @ack
238
+ logd("Creating a ACK request for txn #{self}")
239
+ @ack = @tu.create_non_2xx_ack(@invite, @response) # tu is Session
240
+ logd "The ACK for the Txn #{self} is #{@ack}"
241
+ end
242
+
243
+ def __send_ack()
244
+ logd "Sending ACK from the Ict"
245
+ if @ack
246
+ _send_to_transport(@ack)
247
+ else
248
+ loge "Cannot send ACK from #{self} as no ACK is created so far"
249
+ end
250
+ end
251
+
252
+ def __transport_err
253
+ loge "A transport error was encountered for #{self} calling TU"
254
+ @txn_handler.transport_err(self) if @txn_handler && @txn_handler.respond_to?(:transport_err)
255
+ @tu.transaction_transport_err(self) if @tu
256
+ end
257
+
258
+ def __cleanup
259
+ logd "Cleanup called for #{self}"
260
+ @tu.transaction_cleanup(self) if @tu
261
+ @txn_handler.cleanup(self) if @txn_handler && @txn_handler.respond_to?(:cleanup)
262
+ end
263
+ #------SM Callbacks <end>--------
264
+
265
+ # mask callbacks defined for SM (see Transaction.rb)
266
+ mask_callbacks
267
+
268
+ private :_send_to_transport, :_check_transport_err
269
+ protected :_send_invite, :_provisional_received,
270
+ :_success_final_received, :_non_success_final_received
271
+
272
+ end
273
+ end
274
+ end
@@ -0,0 +1,319 @@
1
+ require 'transaction/Ist_sm'
2
+ require 'transaction/transaction'
3
+ require 'transaction/state_machine_wrapper'
4
+ require 'util/timer/sip_timer_helper'
5
+ require 'sip_logger'
6
+ require 'util/locator'
7
+ require 'ruby_ext/object'
8
+ require 'message'
9
+ require 'util/sipper_util'
10
+
11
+ module SIP
12
+ module Transaction
13
+ class InviteServerTransaction < SIP::Transaction::BaseTransaction
14
+ include SipLogger
15
+ include SipperUtil
16
+
17
+ # to be used for accessing msg for printing/recording
18
+ attr_accessor :msg_sent, :cancel_stxn
19
+
20
+ # The transport to use, transport flags, remote ip and port
21
+ # the block is to be used to override the T1, T2, even TimerG etc. timer value.
22
+ # The block can for example have { self.t1 = 200; self.tg=100 } to override the
23
+ # T1, A on a transaction by transcation basis, otherwise the default is
24
+ # taken from SipperConfigurator or SIP::Transaction::BaseTransaction::T1
25
+ # in that order.
26
+ # Usage: TU creates transaction and starts invoking "Invocation Action"
27
+ # methods. Also for requests received, checks whether to consume them
28
+ # or not based on consume? method return value.
29
+ # There are three call backs into TU from IST and they are notification on
30
+ # transport error and transaction timeout.
31
+ # There are 3 TU callbacks.
32
+ # (a) transaction_transport_err() gets called should IST get a transport failure
33
+ # (b) transaction_timeout() gets called on timeout of transaction
34
+ # (c) transaction_transaction_cleanup() gets called on transaction termination.
35
+ # (d) transaction_wrong_state() if the transaction transition is tried in a wrong state
36
+ # i.e a message is either received or being tried to send out in a state where it is
37
+ # illegal to do so.
38
+ #
39
+ def initialize(tu, branch_id, txn_handler, transport, tp_flags, &block)
40
+ @transaction_name = :Ist # need to have this name defined for every transaction
41
+ @tu = tu
42
+ @branch_id = branch_id
43
+ @transport = transport
44
+ @txn_handler = txn_handler
45
+ @tp_flags = tp_flags
46
+ self.ti = 0 if @transport.reliable? # one line later it can be overidden by arguments.
47
+ self.tz = 0 if @transport.reliable?
48
+ super(&block) # override timers
49
+ SIP::Transaction::StateMachineWrapper.bootstrap_machine(self, Ist_sm)
50
+ @sm = SIP::Transaction::StateMachineWrapper.new(self, @txn_handler, Ist_sm)
51
+ logd("Created the Invite Server Transcation with #{@transport}")
52
+ end
53
+
54
+
55
+ def cancel_received(cancel, cstxn)
56
+ @cancel_stxn = cstxn
57
+ _cancel_received(cancel)
58
+ end
59
+
60
+
61
+ # Need to handle this after the transition has happened and not in the
62
+ # _send_to_transport exception handler because state transition from
63
+ # within a transition is not possible in smc
64
+ def _check_transport_err
65
+ @sm.transport_err if @transport_err
66
+ end
67
+
68
+
69
+ #--- SM Invocation Actions <start>---------
70
+
71
+ #------------------
72
+ # The two methods txn_send and txn_received are two general purpose methods
73
+ # that will be called by the TU as against the transcation type specific
74
+ # methods defined on each type of transaction.
75
+ #
76
+ # IST sends only responses from TU
77
+ def txn_send(msg)
78
+ @message = msg # the msg is accessed from transaction
79
+ raise "IST can only send respones" unless msg.is_response?
80
+ case msg.code
81
+ when 100..199
82
+ _send_provisional(msg)
83
+ when 200..299
84
+ _send_success_final(msg)
85
+ when 300..699
86
+ _send_non_success_final(msg)
87
+ else
88
+ raise "IST cannot deal with this response #{msg}"
89
+ end
90
+ end
91
+
92
+ # The IST receives requests INVITE and ACK/3xx-6xx only
93
+ def txn_received(msg)
94
+ @message = msg
95
+ raise "IST can only receive requests" unless msg.is_request?
96
+ case msg.method
97
+ when "INVITE"
98
+ _invite_received(msg)
99
+ when "ACK"
100
+ _ack_received(msg)
101
+ else
102
+ raise "IST cannot deal with this request #{msg}"
103
+ end
104
+ end
105
+
106
+
107
+ #------------------
108
+
109
+ # These methods are to be invoked by the TU to send the responses
110
+ # The state machine drives the whole interaction by calling the
111
+ # callbacks.
112
+
113
+ def _send_provisional(msg)
114
+ @last_response_sent = msg
115
+ @sm.provisional(msg)
116
+ _check_transport_err
117
+ rescue Statemap::TransitionUndefinedException => e
118
+ loge "Cannot send provisional in #{self.state} state for #{self}"
119
+ @tu.transaction_wrong_state(self) if @tu
120
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
121
+ end
122
+
123
+ def _send_success_final(msg)
124
+ @last_response_sent = nil # we do not cache the 2xx response as TU deals with it
125
+ @sm.success_final(msg)
126
+ rescue Statemap::TransitionUndefinedException => e
127
+ loge "Cannot send 2xx in #{self.state} state for #{self}"
128
+ @tu.transaction_wrong_state(self) if @tu
129
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
130
+ end
131
+
132
+ def _send_non_success_final(msg)
133
+ @last_response_sent = msg
134
+ @ok_to_run_timerH = true unless @transport.reliable?
135
+ @ok_to_run_timerG = true
136
+ @sm.non_success_final(msg)
137
+ _check_transport_err
138
+ rescue Statemap::TransitionUndefinedException => e
139
+ loge "Cannot send non-success-final in #{self.state} state for #{self}"
140
+ @tu.transaction_wrong_state(self) if @tu
141
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
142
+ end
143
+
144
+
145
+
146
+ def _invite_received(msg)
147
+ @invite = msg unless @invite
148
+ @sm.invite
149
+ _check_transport_err
150
+ rescue Statemap::TransitionUndefinedException => e
151
+ loge "Received an INVITE in #{self.state} state for #{self}"
152
+ @tu.transaction_wrong_state(self) if @tu
153
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
154
+ end
155
+
156
+ def _ack_received(msg)
157
+ @sm.ack
158
+ _check_transport_err
159
+ rescue Statemap::TransitionUndefinedException => e
160
+ loge "Received an ACK in #{self.state} state for #{self}"
161
+ @tu.transaction_wrong_state(self) if @tu
162
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
163
+ end
164
+
165
+ def _cancel_received(msg)
166
+ @sm.cancel
167
+ _check_transport_err
168
+ rescue Statemap::TransitionUndefinedException => e
169
+ loge "Received a CANCEL in #{self.state} state for #{self}"
170
+ @tu.transaction_wrong_state(self) if @tu
171
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
172
+ end
173
+
174
+
175
+ #--- TU Invocation Actions <end>---------
176
+
177
+
178
+ #------ Timer callback------
179
+ def on_timer_expiration(timer_task)
180
+ super # check for invalidation
181
+ case timer_task.tid
182
+ when :th
183
+ @sm.timer_H if @ok_to_run_timerH
184
+ _check_transport_err
185
+ when :tg
186
+ @sm.timer_G(timer_task.duration) if @ok_to_run_timerG
187
+ when :ti
188
+ @sm.timer_I
189
+ when :tz
190
+ @sm.timer_Z
191
+ end
192
+ rescue Statemap::TransitionUndefinedException => e
193
+ loge "Timer #{timer_task.tid} got fired for #{self}"
194
+ @tu.transaction_wrong_state(self) if @tu
195
+ @txn_handler.wrong_state(self) if @txn_handler && @txn_handler.respond_to?(:wrong_state)
196
+ end
197
+ #----------------------------
198
+
199
+
200
+
201
+ #------SM Callbacks <start>--------
202
+ # in the order of appearance
203
+ def __send_trying
204
+ r = @tu.create_response(100, "Trying")
205
+ @last_sent_response = r
206
+ logd "Sending the 100 Trying response from Ist #{self}"
207
+ _send_to_transport(r)
208
+ end
209
+
210
+ def __consume_msg(b)
211
+ @consume = b
212
+ end
213
+
214
+ def __transport_err
215
+ loge "A transport error was encountered for #{self} calling TU"
216
+ @tu.transaction_transport_err(self) if @tu
217
+ @txn_handler.transport_err(self) if @txn_handler && @txn_handler.respond_to?(:transport_err)
218
+ end
219
+
220
+ def __send_provisional_response(r)
221
+ logd "Sending the provisional response #{r.code} from Ist #{self}"
222
+ @last_sent_response = r
223
+ _send_to_transport(r)
224
+ end
225
+
226
+
227
+ def __send_last_response
228
+ if @last_sent_response
229
+ logd "Sending the last response #{@last_sent_response.code} from Ist #{self}"
230
+ _send_to_transport(@last_sent_response)
231
+ else
232
+ logw("No last response available, not sending anything from #{self}")
233
+ end
234
+ end
235
+
236
+ def __send_success_response(r)
237
+ logd "Sending the 2xx response #{r.code} from Ist #{self}"
238
+ _send_to_transport(r)
239
+ end
240
+
241
+ def __send_non_success_final_response(r)
242
+ logd "Sending the non-sucess final response #{r.code} from Ist #{self}"
243
+ @last_sent_response = r
244
+ _send_to_transport(r)
245
+ end
246
+
247
+
248
+ def __create_and_send_487
249
+ r = @tu.rejection_response_with(487, @invite)
250
+ @last_sent_response = r
251
+ logd "Sending the 487 response from Ist #{self}"
252
+ _send_to_transport(r)
253
+ end
254
+
255
+ def __start_G
256
+ return unless @ok_to_run_timerG
257
+ task = SIP::Locator[:Sth].schedule_for(self, :tg, nil, :transaction, self.tg)
258
+ logd("Starting Timer G #{task} from Ist #{self}")
259
+ end
260
+
261
+ def __start_H
262
+ return unless @ok_to_run_timerH
263
+ task = SIP::Locator[:Sth].schedule_for(self, :th, nil, :transaction, self.th)
264
+ logd("Starting Timer H #{task} from Ist #{self}")
265
+ end
266
+
267
+ def __cancel_G
268
+ logd "canceling timer G"
269
+ @ok_to_run_timerG = false
270
+ end
271
+
272
+ def __cancel_H
273
+ logd "canceling timer H"
274
+ @ok_to_run_timerH = false
275
+ end
276
+
277
+ def __start_I
278
+ task = SIP::Locator[:Sth].schedule_for(self, :ti, nil, :transaction, self.ti)
279
+ logd("Starting Timer I #{task} from Ist #{self}")
280
+ end
281
+
282
+ def __start_Z
283
+ task = SIP::Locator[:Sth].schedule_for(self, :tz, nil, :transaction, self.tz)
284
+ logd("Starting Timer Z #{task} from Ist #{self}")
285
+ end
286
+
287
+ def __reset_G(t)
288
+ self.tg = [2*t, self.t2].min
289
+ __start_G
290
+ end
291
+
292
+ def __timeout
293
+ logw("Transaction timeout happened")
294
+ @tu.transaction_timeout(self) if @tu
295
+ @txn_handler.timeout(self) if @txn_handler && @txn_handler.respond_to?(:timeout)
296
+ end
297
+
298
+ def __wrong_state
299
+ log_and_raise "Cannot send response in wrong state #{self}"
300
+ end
301
+
302
+
303
+ def __cleanup
304
+ logd "Cleanup called for #{self}"
305
+ @tu.transaction_cleanup(self) if @tu
306
+ @txn_handler.cleanup(self) if @txn_handler && @txn_handler.respond_to?(:cleanup)
307
+ end
308
+ #------SM Callbacks <end>--------
309
+
310
+ # mask callbacks defined for SM (see Transaction.rb)
311
+ mask_callbacks
312
+
313
+ private :_send_to_transport, :_check_transport_err, :_send_non_success_final,
314
+ :_send_success_final, :_send_provisional, :_invite_received, :_ack_received
315
+
316
+ end
317
+ end
318
+ end
319
+