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.
- data/sipper/README.rb +26 -0
- data/sipper/b2bua_controller.rb +163 -0
- data/sipper/b2bua_session_mixin.rb +24 -0
- data/sipper/base_controller.rb +425 -0
- data/sipper/bin/common.rb +42 -0
- data/sipper/bin/generate.rb +70 -0
- data/sipper/bin/project.rb +44 -0
- data/sipper/bin/run.rb +85 -0
- data/sipper/bin/run_smoke.rb +8 -0
- data/sipper/config/log4r.xml +71 -0
- data/sipper/controller_class_loader.rb +29 -0
- data/sipper/controller_selector.rb +119 -0
- data/sipper/controllers/invite_controller.rb +30 -0
- data/sipper/controllers/order.yaml +3 -0
- data/sipper/custom_message.rb +4 -0
- data/sipper/detached_session.rb +11 -0
- data/sipper/docs/manual.txt +1621 -0
- data/sipper/generators/README +12 -0
- data/sipper/generators/gen_controller.rb +228 -0
- data/sipper/generators/gen_project.rb +45 -0
- data/sipper/generators/gen_test.rb +72 -0
- data/sipper/generators/project_template_dir/Rakefile +56 -0
- data/sipper/generators/project_template_dir/config/sipper.cfg +31 -0
- data/sipper/generators/project_template_dir/controllers/README.txt +2 -0
- data/sipper/generators/project_template_dir/dot_sipper.proj +2 -0
- data/sipper/generators/project_template_dir/logs/README.txt +2 -0
- data/sipper/generators/project_template_dir/tests/README.txt +2 -0
- data/sipper/lib/smc/statemap.rb +194 -0
- data/sipper/logs/dialog_info_store +0 -0
- data/sipper/logs/r.cmd +6 -0
- data/sipper/logs/r.sh +6 -0
- data/sipper/media/sipper_media_client.rb +268 -0
- data/sipper/media/sipper_media_event.rb +43 -0
- data/sipper/media/sipper_media_manager.rb +145 -0
- data/sipper/media/sipper_media_proxy.rb +60 -0
- data/sipper/media/sipper_offer_answer.rb +285 -0
- data/sipper/message.rb +512 -0
- data/sipper/modified_pattern_formatter.rb +119 -0
- data/sipper/proxy_controller.rb +143 -0
- data/sipper/registration.rb +52 -0
- data/sipper/request.rb +109 -0
- data/sipper/response.rb +123 -0
- data/sipper/ruby_ext/module.rb +27 -0
- data/sipper/ruby_ext/mutable_class.rb +17 -0
- data/sipper/ruby_ext/object.rb +38 -0
- data/sipper/ruby_ext/pqueue.rb +190 -0
- data/sipper/ruby_ext/snapshot.rb +201 -0
- data/sipper/ruby_ext/string.rb +18 -0
- data/sipper/ruby_ext/time.rb +9 -0
- data/sipper/run/run_sipper1.rb +28 -0
- data/sipper/run/run_sipper2.rb +56 -0
- data/sipper/sdp/sdp.rb +257 -0
- data/sipper/sdp/sdp_generator.rb +131 -0
- data/sipper/sdp/sdp_parser.rb +136 -0
- data/sipper/session.rb +1952 -0
- data/sipper/session_manager.rb +170 -0
- data/sipper/session_recorder.rb +190 -0
- data/sipper/session_state/DialogState.sm +54 -0
- data/sipper/session_state/DialogState_sm.rb +337 -0
- data/sipper/session_state/dialog_routes.rb +141 -0
- data/sipper/sip_headers/header.rb +632 -0
- data/sipper/sip_headers/sipuri.rb +352 -0
- data/sipper/sip_logger.rb +65 -0
- data/sipper/sip_message_router.rb +231 -0
- data/sipper/sip_test_driver_controller.rb +10 -0
- data/sipper/sipper.rb +329 -0
- data/sipper/sipper_assertions.rb +21 -0
- data/sipper/sipper_configurator.rb +376 -0
- data/sipper/sipper_http/sipper_http_request_dispatcher.rb +71 -0
- data/sipper/sipper_http/sipper_http_response.rb +25 -0
- data/sipper/stray_message_manager.rb +40 -0
- data/sipper/test_completion_signaling_helper.rb +77 -0
- data/sipper/transaction/Ict.sm +59 -0
- data/sipper/transaction/Ict_sm.rb +430 -0
- data/sipper/transaction/Ist.sm +74 -0
- data/sipper/transaction/Ist_sm.rb +460 -0
- data/sipper/transaction/Nict.sm +51 -0
- data/sipper/transaction/Nict_sm.rb +325 -0
- data/sipper/transaction/Nist.sm +59 -0
- data/sipper/transaction/Nist_sm.rb +356 -0
- data/sipper/transaction/invite_client_transaction.rb +274 -0
- data/sipper/transaction/invite_server_transaction.rb +319 -0
- data/sipper/transaction/non_invite_client_transaction.rb +230 -0
- data/sipper/transaction/non_invite_server_transaction.rb +263 -0
- data/sipper/transaction/state_machine_wrapper.rb +58 -0
- data/sipper/transaction/transaction.rb +212 -0
- data/sipper/transport/base_transport.rb +84 -0
- data/sipper/transport/rel_unrel.rb +19 -0
- data/sipper/transport/transport_and_route_resolver.rb +67 -0
- data/sipper/transport/udp_transport.rb +156 -0
- data/sipper/transport_manager.rb +33 -0
- data/sipper/udp_session.rb +17 -0
- data/sipper/util/command_element.rb +62 -0
- data/sipper/util/compact_converter.rb +50 -0
- data/sipper/util/counter.rb +26 -0
- data/sipper/util/digest/digest_authorizer.rb +204 -0
- data/sipper/util/expectation_parser.rb +164 -0
- data/sipper/util/locator.rb +31 -0
- data/sipper/util/message_fill.rb +58 -0
- data/sipper/util/persistence/ps_sipper_map.rb +63 -0
- data/sipper/util/persistence/sipper_map.rb +41 -0
- data/sipper/util/sipper_util.rb +305 -0
- data/sipper/util/timer/sip_timer_helper.rb +26 -0
- data/sipper/util/timer/timer_manager.rb +80 -0
- data/sipper/util/timer/timer_task.rb +56 -0
- data/sipper/util/validations.rb +44 -0
- data/sipper/version.rb +10 -0
- data/sipper_test/_test_media_uas.rb +79 -0
- data/sipper_test/base_test_case.rb +31 -0
- data/sipper_test/c_134.txt +7 -0
- data/sipper_test/driven_sip_test_case.rb +96 -0
- data/sipper_test/gold.txt +10 -0
- data/sipper_test/gold_res.txt +8 -0
- data/sipper_test/gold_sub.txt +9 -0
- data/sipper_test/hello_sipper.au +0 -0
- data/sipper_test/in_sipper.au +0 -0
- data/sipper_test/nonrr_proxy.rb +17 -0
- data/sipper_test/order_tests.yaml +4 -0
- data/sipper_test/rake_res.txt +399 -0
- data/sipper_test/rr_proxy.rb +17 -0
- data/sipper_test/run_test.cmd +94 -0
- data/sipper_test/sip_test_case.rb +104 -0
- data/sipper_test/test2xx_retransmission.rb +80 -0
- data/sipper_test/test2xx_retransmission_with_limit.rb +81 -0
- data/sipper_test/test2xx_retransmission_with_nist.rb +91 -0
- data/sipper_test/test2xx_retransmission_with_txns.rb +94 -0
- data/sipper_test/test_address_header.rb +66 -0
- data/sipper_test/test_b2bua1.rb +130 -0
- data/sipper_test/test_b2bua2.rb +120 -0
- data/sipper_test/test_b2bua3.rb +160 -0
- data/sipper_test/test_b2bua4.rb +130 -0
- data/sipper_test/test_base_controller.rb +110 -0
- data/sipper_test/test_base_transport.rb +37 -0
- data/sipper_test/test_cancel.rb +21 -0
- data/sipper_test/test_cancel_after2xx.rb +81 -0
- data/sipper_test/test_cancel_retransmission.rb +105 -0
- data/sipper_test/test_cancel_with481.rb +83 -0
- data/sipper_test/test_cancel_with487.rb +70 -0
- data/sipper_test/test_cancel_with_ist_without_nist.rb +99 -0
- data/sipper_test/test_cancel_with_nist.rb +84 -0
- data/sipper_test/test_cancel_without487.rb +77 -0
- data/sipper_test/test_command_element.rb +38 -0
- data/sipper_test/test_compact_converter.rb +33 -0
- data/sipper_test/test_controller_class_loader.rb +37 -0
- data/sipper_test/test_controller_selector.rb +53 -0
- data/sipper_test/test_controller_using_compact_headers.rb +74 -0
- data/sipper_test/test_controller_using_header_order.rb +85 -0
- data/sipper_test/test_controller_using_ict.rb +64 -0
- data/sipper_test/test_controller_using_ict_with_non_success.rb +72 -0
- data/sipper_test/test_controller_using_ict_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_ict_with_tcbh_no_action.rb +24 -0
- data/sipper_test/test_controller_using_ist.rb +70 -0
- data/sipper_test/test_controller_using_ist_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_nict.rb +115 -0
- data/sipper_test/test_controller_using_nict_with_tcbh.rb +24 -0
- data/sipper_test/test_controller_using_nist.rb +63 -0
- data/sipper_test/test_controller_using_pre_existing_rs0.rb +73 -0
- data/sipper_test/test_controller_using_pre_existing_rs1.rb +75 -0
- data/sipper_test/test_controller_using_pre_existing_rs2.rb +71 -0
- data/sipper_test/test_controller_using_route_set.rb +86 -0
- data/sipper_test/test_controller_with_sdp.rb +80 -0
- data/sipper_test/test_controllers/cancel/order.yaml +2 -0
- data/sipper_test/test_controllers/cancel/uac_cancel_controller.rb +35 -0
- data/sipper_test/test_controllers/cancel/uas_cancel_controller.rb +25 -0
- data/sipper_test/test_controllers/class_loading/ordered/first_ordered_controller.rb +5 -0
- data/sipper_test/test_controllers/class_loading/ordered/order.yaml +3 -0
- data/sipper_test/test_controllers/class_loading/ordered/recond_ordered_controller.rb +6 -0
- data/sipper_test/test_controllers/class_loading/ordered/second_ordered_controller.rb +6 -0
- data/sipper_test/test_controllers/class_loading/unordered/first_unordered_controller.rb +7 -0
- data/sipper_test/test_controllers/class_loading/unordered/second_unordered_controller.rb +6 -0
- data/sipper_test/test_controllers/ctrl_trhandler/lib/transport_filters/my_transport_handler.rb +22 -0
- data/sipper_test/test_controllers/ctrl_trhandler/uac_tr_handler_controller.rb +27 -0
- data/sipper_test/test_controllers/ctrl_trhandler/uas_tr_handler_controller.rb +21 -0
- data/sipper_test/test_controllers/ete/order.yaml +1 -0
- data/sipper_test/test_controllers/ete/uac_controller.rb +39 -0
- data/sipper_test/test_controllers/ete/uas_controller.rb +34 -0
- data/sipper_test/test_controllers/extensions/extension_uac_controller.rb +24 -0
- data/sipper_test/test_controllers/extensions/extension_uas_controller.rb +35 -0
- data/sipper_test/test_controllers/extensions/lib/sipper_extensions/my_from_extension.rb +16 -0
- data/sipper_test/test_controllers/ict_tcbh/lib/transaction_handlers/app_ict_handler.rb +23 -0
- data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_controller.rb +27 -0
- data/sipper_test/test_controllers/ict_tcbh/uac_ict_tcbh_no_action_controller.rb +28 -0
- data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_controller.rb +29 -0
- data/sipper_test/test_controllers/ict_tcbh/uas_ict_tcbh_no_action_controller.rb +31 -0
- data/sipper_test/test_controllers/ist_tcbh/lib/app_ist_handler.rb +13 -0
- data/sipper_test/test_controllers/ist_tcbh/uac_ist_tcbh_controller.rb +22 -0
- data/sipper_test/test_controllers/ist_tcbh/uas_ist_tcbh_controller.rb +31 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/in_order.yaml +2 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler1.rb +21 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/my_transport_handler2.rb +21 -0
- data/sipper_test/test_controllers/multi_trhandlers/lib/transport_filters/out_order.yaml +2 -0
- data/sipper_test/test_controllers/multi_trhandlers/uac_multi_tr_handler_controller.rb +27 -0
- data/sipper_test/test_controllers/multi_trhandlers/uas_multi_tr_handler_controller.rb +29 -0
- data/sipper_test/test_controllers/multiple/lib/blank_test.rb +2 -0
- data/sipper_test/test_controllers/multiple/uac_info_controller.rb +21 -0
- data/sipper_test/test_controllers/multiple/uac_msg_controller.rb +20 -0
- data/sipper_test/test_controllers/multiple/uas_info_controller.rb +15 -0
- data/sipper_test/test_controllers/multiple/uas_msg_controller.rb +14 -0
- data/sipper_test/test_controllers/nict_tcbh/lib/transaction_handlers/app_nict_handler.rb +13 -0
- data/sipper_test/test_controllers/nict_tcbh/uac_nict_tcbh_controller.rb +26 -0
- data/sipper_test/test_controllers/nict_tcbh/uas_nict_tcbh_controller.rb +20 -0
- data/sipper_test/test_controllers/state_machine_based/lib/CreditControl.sm +43 -0
- data/sipper_test/test_controllers/state_machine_based/lib/CreditControl_sm.rb +194 -0
- data/sipper_test/test_controllers/state_machine_based/order.yaml +1 -0
- data/sipper_test/test_controllers/state_machine_based/uac_message_controller.rb +34 -0
- data/sipper_test/test_controllers/state_machine_based/uas_message_controller.rb +44 -0
- data/sipper_test/test_controllers/stray_message/lib/sipper_extensions/my_stray_handler.rb +9 -0
- data/sipper_test/test_controllers/stray_message/stray_uac_controller.rb +24 -0
- data/sipper_test/test_controllers/stray_message/stray_uas_controller.rb +31 -0
- data/sipper_test/test_controllers/string/order.yaml +1 -0
- data/sipper_test/test_controllers/string/uac_controller.rb +29 -0
- data/sipper_test/test_controllers/string/uas_controller.rb +22 -0
- data/sipper_test/test_controllers/test_controller.rb +24 -0
- data/sipper_test/test_detached_session1.rb +78 -0
- data/sipper_test/test_dialog_routes.rb +139 -0
- data/sipper_test/test_digest_challenge1.rb +89 -0
- data/sipper_test/test_digest_challenge2.rb +90 -0
- data/sipper_test/test_dynamic_parse.rb +249 -0
- data/sipper_test/test_empty_sdp.rb +89 -0
- data/sipper_test/test_ete.rb +37 -0
- data/sipper_test/test_expectation_parser.rb +76 -0
- data/sipper_test/test_extensions.rb +28 -0
- data/sipper_test/test_freeze.rb +81 -0
- data/sipper_test/test_generated.rb +90 -0
- data/sipper_test/test_header_parameters.rb +75 -0
- data/sipper_test/test_header_parse.rb +141 -0
- data/sipper_test/test_http_client1.rb +84 -0
- data/sipper_test/test_http_client2.rb +90 -0
- data/sipper_test/test_ict_with_timeout.rb +62 -0
- data/sipper_test/test_in_dialog_request.rb +61 -0
- data/sipper_test/test_inline_controller.rb +67 -0
- data/sipper_test/test_invite_client_transaction.rb +272 -0
- data/sipper_test/test_invite_replace.rb +147 -0
- data/sipper_test/test_invite_retransmission.rb +90 -0
- data/sipper_test/test_invite_server_transaction.rb +208 -0
- data/sipper_test/test_lower_cseq.rb +79 -0
- data/sipper_test/test_media.rb +52 -0
- data/sipper_test/test_message.rb +392 -0
- data/sipper_test/test_method_specific_response_handling.rb +81 -0
- data/sipper_test/test_multi_homed1.rb +127 -0
- data/sipper_test/test_multi_homed2.rb +109 -0
- data/sipper_test/test_multi_homed_duplicate.rb +87 -0
- data/sipper_test/test_multi_homed_with_detached.rb +88 -0
- data/sipper_test/test_multiple.rb +49 -0
- data/sipper_test/test_multiple_contacts.rb +89 -0
- data/sipper_test/test_non2xx_retransmission_with_ist.rb +87 -0
- data/sipper_test/test_non_invite_client_transaction.rb +210 -0
- data/sipper_test/test_non_invite_retransmission.rb +91 -0
- data/sipper_test/test_non_invite_server_transaction.rb +202 -0
- data/sipper_test/test_offer_answer_prack.rb +103 -0
- data/sipper_test/test_pickup.rb +258 -0
- data/sipper_test/test_prack.rb +105 -0
- data/sipper_test/test_prack_store_and_dispatch.rb +101 -0
- data/sipper_test/test_prack_timer.rb +105 -0
- data/sipper_test/test_ps_sipper_map.rb +56 -0
- data/sipper_test/test_re_invite_uas_ongoing_ict.rb +81 -0
- data/sipper_test/test_re_invite_uas_ongoing_ist.rb +84 -0
- data/sipper_test/test_re_invite_with_ongoing_ict.rb +101 -0
- data/sipper_test/test_re_invite_with_ongoing_ist.rb +89 -0
- data/sipper_test/test_recorder_swap.rb +157 -0
- data/sipper_test/test_refer.rb +121 -0
- data/sipper_test/test_registeration_clearing.rb +97 -0
- data/sipper_test/test_registrar.rb +109 -0
- data/sipper_test/test_registration_controller.rb +73 -0
- data/sipper_test/test_registration_timeout.rb +90 -0
- data/sipper_test/test_remote_controller.rb +39 -0
- data/sipper_test/test_remote_target_update_on2xx.rb +140 -0
- data/sipper_test/test_request.rb +106 -0
- data/sipper_test/test_response.rb +40 -0
- data/sipper_test/test_response_without_to_tag.rb +92 -0
- data/sipper_test/test_rport.rb +88 -0
- data/sipper_test/test_sdp.rb +91 -0
- data/sipper_test/test_sdp_parser.rb +145 -0
- data/sipper_test/test_session.rb +276 -0
- data/sipper_test/test_session_callback_handler.rb +68 -0
- data/sipper_test/test_session_lifetime.rb +66 -0
- data/sipper_test/test_session_manager.rb +141 -0
- data/sipper_test/test_session_recorder.rb +145 -0
- data/sipper_test/test_session_state_user_defined.rb +84 -0
- data/sipper_test/test_session_states.rb +91 -0
- data/sipper_test/test_simple_dialog_state.rb +86 -0
- data/sipper_test/test_simple_re_invite.rb +86 -0
- data/sipper_test/test_sip_uri.rb +234 -0
- data/sipper_test/test_sipper_util.rb +45 -0
- data/sipper_test/test_smc_controller.rb +17 -0
- data/sipper_test/test_smoke.rb +80 -0
- data/sipper_test/test_stray.rb +28 -0
- data/sipper_test/test_stray_inline.rb +89 -0
- data/sipper_test/test_stray_res_acked.rb +103 -0
- data/sipper_test/test_stray_respond.rb +104 -0
- data/sipper_test/test_stray_retry.rb +92 -0
- data/sipper_test/test_stray_retry_failure.rb +93 -0
- data/sipper_test/test_stray_retry_initial.rb +100 -0
- data/sipper_test/test_strict_router_with_angled.rb +84 -0
- data/sipper_test/test_string_record.rb +31 -0
- data/sipper_test/test_subscribe_notify.rb +141 -0
- data/sipper_test/test_subscribe_notify_client_timeout.rb +158 -0
- data/sipper_test/test_subscribe_notify_dialog.rb +146 -0
- data/sipper_test/test_subscribe_notify_expires.rb +155 -0
- data/sipper_test/test_subscribe_notify_multiple_subscription.rb +157 -0
- data/sipper_test/test_subscribe_notify_server_timeout.rb +144 -0
- data/sipper_test/test_subsequent_unsent.rb +88 -0
- data/sipper_test/test_target_refresh_proxy_detached.rb +128 -0
- data/sipper_test/test_target_refresh_proxy_udp.rb +130 -0
- data/sipper_test/test_target_refresh_rr_proxy_udp.rb +133 -0
- data/sipper_test/test_target_refresh_with_new_port.rb +158 -0
- data/sipper_test/test_target_refresh_with_proxy1.rb +113 -0
- data/sipper_test/test_target_refresh_with_rr_update_proxy.rb +145 -0
- data/sipper_test/test_target_refresh_with_update_proxy.rb +144 -0
- data/sipper_test/test_target_refresh_with_update_proxy2.rb +139 -0
- data/sipper_test/test_timer_manager.rb +71 -0
- data/sipper_test/test_timer_task.rb +60 -0
- data/sipper_test/test_transport_handler.rb +19 -0
- data/sipper_test/test_transport_multi_handler.rb +18 -0
- data/sipper_test/test_udp_transport.rb +119 -0
- data/sipper_test/test_unparsed.rb +70 -0
- data/sipper_test/test_validations.rb +69 -0
- data/sipper_test/test_with_rr_proxy.rb +111 -0
- data/sipper_test/testmediacontroller.rb +71 -0
- data/sipper_test/tracing.rb +23 -0
- data/sipper_test/transaction_test_helper.rb +176 -0
- data/sipper_test/transport_filters.rb +26 -0
- data/sipper_test/ts_sipper.rb +91 -0
- data/sipper_test/ts_smoke.rb +3 -0
- data/sipper_test/tt.cmd +20 -0
- metadata +455 -0
data/sipper/README.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# == Sipper API documentation
|
|
2
|
+
# ----
|
|
3
|
+
# = What is Sipper?
|
|
4
|
+
#
|
|
5
|
+
# SIPr pronounced as Sipper is a SIP application testing framework that enables the developer
|
|
6
|
+
# and tester write new and complex test cases with extreme ease.
|
|
7
|
+
# While SIP applications are becoming more and more complex and feature rich the test tools have
|
|
8
|
+
# not been able to keep pace with them.
|
|
9
|
+
# Sipper was developed out of the necessity to test ever evolving SIP protocol and
|
|
10
|
+
# multi-faceted applications spanning SIP and Web.
|
|
11
|
+
# As new APIs for SIP application development made writing SIP applications accessible, we felt that
|
|
12
|
+
# writing tests for them, which are the cornerstone of agile development processes, should be even
|
|
13
|
+
# simpler. Sipper is our solution to that problem.
|
|
14
|
+
# Sipper is ideally suited for for feature, interop, regression, acceptance and field simulation.
|
|
15
|
+
# It has Servlet style API that ranges from extremely simple to very feature
|
|
16
|
+
# rich and powerful.
|
|
17
|
+
# While on one hand you can write simple test cases and controllers with very few lines of scripts,
|
|
18
|
+
# you can go further down the API depth and progressively control any aspect of SIP stack.
|
|
19
|
+
#
|
|
20
|
+
# == Getting started
|
|
21
|
+
# The best place to get started on Sipper is to read the first few chapters of the Sipper book,
|
|
22
|
+
# freely available from the Sipper website, also refer to FAQs when in doubt, if you need help
|
|
23
|
+
# with a test case of Sipper syntax then join the community at Sipper mailing list. All of these
|
|
24
|
+
# are accesible from http://sipper.agnity.com
|
|
25
|
+
#
|
|
26
|
+
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
require 'base_controller'
|
|
2
|
+
|
|
3
|
+
module SIP
|
|
4
|
+
|
|
5
|
+
class B2buaController < SIP::BaseController
|
|
6
|
+
|
|
7
|
+
# Gets or creates a peer b2bua leg (session). The session passed in as the
|
|
8
|
+
# argument becomes the anchor leg which is the main leg.
|
|
9
|
+
def get_or_create_peer_session(session, rip=SipperConfigurator[:DefaultRIP],
|
|
10
|
+
rp=SipperConfigurator[:DefaultRP] )
|
|
11
|
+
peer = get_peer_session(session)
|
|
12
|
+
peer = create_peer_session(session, rip, rp) unless peer
|
|
13
|
+
session.offer_answer = nil
|
|
14
|
+
peer.offer_answer = nil
|
|
15
|
+
peer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def create_peer_session(session, rip=SipperConfigurator[:DefaultRIP],
|
|
19
|
+
rp=SipperConfigurator[:DefaultRP] )
|
|
20
|
+
# todo take care of TCP
|
|
21
|
+
peer = create_udp_session(rip, rp)
|
|
22
|
+
session[:_sipper_b2b_peer] = peer
|
|
23
|
+
peer[:_sipper_b2b_peer] = session
|
|
24
|
+
peer.use_b2b_session_lock_from(session)
|
|
25
|
+
peer
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def get_peer_session(session)
|
|
29
|
+
session[:_sipper_b2b_peer]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# While linking the two sessions to create a b2bua the first
|
|
34
|
+
# argument is treated as the main or anchor leg.
|
|
35
|
+
def link_sessions(session1, session2)
|
|
36
|
+
unlink_session(session1, session1[:_sipper_b2b_peer]) if session1[:_sipper_b2b_peer]
|
|
37
|
+
session1[:_sipper_b2b_peer] = session2
|
|
38
|
+
session2[:_sipper_b2b_peer] = session1
|
|
39
|
+
session2.use_b2b_session_lock_from(session1)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Unlinking removes the b2bua association.
|
|
43
|
+
def unlink_sessions(session1, session2)
|
|
44
|
+
if session1.b2b_anchor_leg?
|
|
45
|
+
anchor_leg = session1
|
|
46
|
+
peer_leg = session2
|
|
47
|
+
else
|
|
48
|
+
anchor_leg = session2
|
|
49
|
+
peer_leg = session1
|
|
50
|
+
end
|
|
51
|
+
anchor_leg[:_sipper_b2b_peer] = nil
|
|
52
|
+
peer_leg[:_sipper_b2b_peer] = nil
|
|
53
|
+
peer_leg.revert_to_local_session_lock
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# Creates the b2bua request based on the original request. Also creates the
|
|
58
|
+
# peer session if it does not already exist.
|
|
59
|
+
def create_b2bua_request(session, orig_request=session.irequest, rip=SipperConfigurator[:DefaultRIP],
|
|
60
|
+
rp=SipperConfigurator[:DefaultRP])
|
|
61
|
+
peer_session = get_or_create_peer_session(session, rip, rp)
|
|
62
|
+
if peer_session.initial_state?
|
|
63
|
+
r = peer_session.create_initial_request(orig_request.method, orig_request.uri)
|
|
64
|
+
r.copy_from(orig_request, :from, :to, :route, :content, :content_type)
|
|
65
|
+
r.from.tag = "3"
|
|
66
|
+
else
|
|
67
|
+
if(orig_request.method == "CANCEL")
|
|
68
|
+
r = peer_session.create_cancel
|
|
69
|
+
elsif(orig_request.method == "ACK")
|
|
70
|
+
r = peer_session.create_ack
|
|
71
|
+
else
|
|
72
|
+
r = peer_session.create_subsequent_request(orig_request.method)
|
|
73
|
+
end
|
|
74
|
+
r.copy_from(orig_request, :content, :content_type)
|
|
75
|
+
end
|
|
76
|
+
return r
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# Creates a b2bua response based on an original response.
|
|
81
|
+
# If there is no peer session then this fails.
|
|
82
|
+
def create_b2bua_response(session, orig_response=session.iresponse)
|
|
83
|
+
peer_session = get_peer_session(session)
|
|
84
|
+
if peer_session
|
|
85
|
+
r = peer_session.create_response(orig_response.code)
|
|
86
|
+
r.copy_from(orig_response, :content, :content_type)
|
|
87
|
+
return r
|
|
88
|
+
else
|
|
89
|
+
logw("No peer session found, cannot create the response")
|
|
90
|
+
raise "Unable to create response"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Invalidates this b2bua sessions.
|
|
95
|
+
def invalidate_sessions(session, flag=true)
|
|
96
|
+
peer_session = get_peer_session(session)
|
|
97
|
+
peer_session.invalidate(flag) if peer_session
|
|
98
|
+
session.invalidate(flag)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# Transparently passes / relays the request given a peer session
|
|
103
|
+
# exists.
|
|
104
|
+
def relay_request(session)
|
|
105
|
+
peer_session = get_peer_session(session)
|
|
106
|
+
if peer_session
|
|
107
|
+
r = create_b2bua_request(session)
|
|
108
|
+
peer_session.send(r)
|
|
109
|
+
else
|
|
110
|
+
logw("No peer session found, cannot relay the request")
|
|
111
|
+
raise "Unable to relay the request"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Transparently passes / relays the response given a peer session
|
|
116
|
+
# exists.
|
|
117
|
+
def relay_response(session)
|
|
118
|
+
peer_session = get_peer_session(session)
|
|
119
|
+
if peer_session
|
|
120
|
+
r = create_b2bua_response(session)
|
|
121
|
+
peer_session.send(r)
|
|
122
|
+
else
|
|
123
|
+
logw("No peer session found, cannot relay the response")
|
|
124
|
+
raise "Unable to relay the response"
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# Marks this b2bua as transparent which allows the relaying of requests and
|
|
130
|
+
# responses between legs without any controller involvement.
|
|
131
|
+
def go_transparent(session, state=true)
|
|
132
|
+
session[:_sipper_b2b_transparent] = state
|
|
133
|
+
peer_session = get_peer_session(session)
|
|
134
|
+
peer_session[:_sipper_b2b_transparent] = state if peer_session
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# if there exists a peer session then we transparently send the request as a b2bua
|
|
139
|
+
# if transparent flag is on.
|
|
140
|
+
def on_request(session)
|
|
141
|
+
peer_session = get_peer_session(session)
|
|
142
|
+
if peer_session && session[:_sipper_b2b_transparent]
|
|
143
|
+
peer_session.request_with(session.irequest.method)
|
|
144
|
+
else
|
|
145
|
+
super
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# if there exists a peer session then we transparently pass the response as a b2bua
|
|
151
|
+
# if transparent flag is true
|
|
152
|
+
def on_response(session)
|
|
153
|
+
peer_session = get_peer_session(session)
|
|
154
|
+
if peer_session && session[:_sipper_b2b_transparent]
|
|
155
|
+
peer_session.respond_with(session.iresponse.code)
|
|
156
|
+
else
|
|
157
|
+
super
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module B2buaSessionMixin
|
|
2
|
+
# Used exclusively for setting of a common b2bua lock to avoid deadlocks.
|
|
3
|
+
def use_b2b_session_lock_from(orig_session)
|
|
4
|
+
@sq_lock = orig_session._get_sq_lock
|
|
5
|
+
@non_anchor_leg = true
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def revert_to_local_session_lock
|
|
9
|
+
if @non_anchor_leg
|
|
10
|
+
@sq_lock = ["free"]
|
|
11
|
+
@sq_lock.extend(MonitorMixin)
|
|
12
|
+
@non_anchor_leg = false
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def b2b_anchor_leg?
|
|
17
|
+
if @non_anchor_leg
|
|
18
|
+
false
|
|
19
|
+
else
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
# Here is where a lot of magic will happen, this will enable a lot of
|
|
2
|
+
# controller functionality
|
|
3
|
+
|
|
4
|
+
require 'sip_logger'
|
|
5
|
+
require 'util/sipper_util'
|
|
6
|
+
require 'response'
|
|
7
|
+
require 'request'
|
|
8
|
+
require 'session'
|
|
9
|
+
require 'detached_session'
|
|
10
|
+
require 'util/locator'
|
|
11
|
+
|
|
12
|
+
module SIP
|
|
13
|
+
class BaseController
|
|
14
|
+
include SipLogger
|
|
15
|
+
|
|
16
|
+
# civ set for each individual controllers
|
|
17
|
+
@sol = false
|
|
18
|
+
@tr_usage = nil
|
|
19
|
+
@tr_timers = nil
|
|
20
|
+
@sess_timer = nil
|
|
21
|
+
@tr_handlers = nil
|
|
22
|
+
@sess_timer = nil
|
|
23
|
+
@sess_limit = nil
|
|
24
|
+
@t2xx_usage = nil
|
|
25
|
+
@t1xx_retran_usage = nil
|
|
26
|
+
@t2xx_timers = nil
|
|
27
|
+
@t1xx_timers = nil
|
|
28
|
+
@header_order = nil
|
|
29
|
+
@pre_existing_rs = nil
|
|
30
|
+
@compact_headers = nil
|
|
31
|
+
@session_record = nil
|
|
32
|
+
|
|
33
|
+
def self.start_on_load(val)
|
|
34
|
+
@sol = SipperUtil.boolify(val)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.start_on_load?
|
|
38
|
+
@sol
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# The transaction usage hash setting is like a modifier in the
|
|
42
|
+
# controller. The setting is exactly same as the configuration setting
|
|
43
|
+
# eg transaction_usage :use_transactions=>true, :use_ict=>false, :use_nict=>true
|
|
44
|
+
#
|
|
45
|
+
def self.transaction_usage(hash)
|
|
46
|
+
@tr_usage = hash
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.get_transaction_usage
|
|
50
|
+
@tr_usage
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# The transaction timers can be set at the controller level which override the
|
|
54
|
+
# default timer configuration. Eg. usage
|
|
55
|
+
# transaction_timers :t1=>100, :ta=200
|
|
56
|
+
# Here the modifier is setting the T1 timer value to 100 msec and TimerA to 200 msec.
|
|
57
|
+
def self.transaction_timers(hash)
|
|
58
|
+
@tr_timers = hash
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.get_transaction_timers
|
|
62
|
+
@tr_timers
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# value can be msg-info or msg-debug
|
|
66
|
+
def self.session_record(val)
|
|
67
|
+
@session_record = val.to_s
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.get_session_record
|
|
71
|
+
@session_record
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# transaction_handlers :Ict=>MyIctHandler, :Nict=>MyNictHandler, :Base=>CatchAllHandler
|
|
75
|
+
def self.transaction_handlers(hash)
|
|
76
|
+
@tr_handlers = hash
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.get_transaction_handlers
|
|
80
|
+
@tr_handlers
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# The session timer for session invalidation, the default is taken from the configuration
|
|
85
|
+
# :SessionTimer
|
|
86
|
+
def self.session_timer(val)
|
|
87
|
+
@sess_timer = val
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def self.get_session_timer
|
|
91
|
+
@sess_timer
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# the upper limit of session lifetime, defaults to :SessionLimit from configuration.
|
|
95
|
+
def self.session_limit(val)
|
|
96
|
+
@sess_limit = val
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def self.get_session_limit
|
|
100
|
+
@sess_limit
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def self.t2xx_usage(val)
|
|
104
|
+
@t2xx_usage = val
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def self.get_t2xx_usage
|
|
108
|
+
@t2xx_usage
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def self.t1xx_retran_usage(val)
|
|
112
|
+
@t1xx_retran_usage = val
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def self.get_t1xx_retran_usage
|
|
116
|
+
@t1xx_retran_usage
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# the hash of 3 timer values that affect 2xx retransmissions for UAS
|
|
120
|
+
# i.e {:Start=>100, :Cap=>400, :Limit=>1600} that roughly
|
|
121
|
+
# correspond with T1, T2 and 64*T1 respectively, which are also the
|
|
122
|
+
# defaults. The argument hash doesnt have to be all the three values
|
|
123
|
+
# but any that are required to be overridden.
|
|
124
|
+
def self.t2xx_timers(hash)
|
|
125
|
+
@t2xx_timers = hash
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def self.get_t2xx_timers
|
|
129
|
+
@t2xx_timers
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def self.t1xx_timers(hash)
|
|
133
|
+
@t1xx_timers = hash
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def self.get_t1xx_timers
|
|
137
|
+
@t1xx_timers
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def self.header_order(*arr)
|
|
142
|
+
if arr[0].is_a?(Array)
|
|
143
|
+
@header_order = arr[0]
|
|
144
|
+
else
|
|
145
|
+
@header_order = arr
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def self.get_header_order
|
|
150
|
+
@header_order
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Directive for setting compact headers for outgoing requests for
|
|
154
|
+
# this controller. The headers can be defined by their sipper symbols
|
|
155
|
+
# like :call_id and :via or you can chose to have :all_possible in which
|
|
156
|
+
# Sipper use compact form for all headers that have a compact form.
|
|
157
|
+
def self.use_compact_headers(*arr)
|
|
158
|
+
if arr[0].is_a?(Array)
|
|
159
|
+
@compact_headers = arr[0]
|
|
160
|
+
else
|
|
161
|
+
@compact_headers = arr
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def self.get_compact_headers
|
|
166
|
+
@compact_headers
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Directive for setting the prexisting route set at the controller level.
|
|
170
|
+
def self.pre_existing_route_set(*arr)
|
|
171
|
+
if arr[0].is_a?(Array)
|
|
172
|
+
@pre_existing_rs = arr[0]
|
|
173
|
+
else
|
|
174
|
+
@pre_existing_rs = arr
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def self.get_pre_existing_route_set
|
|
179
|
+
@pre_existing_rs
|
|
180
|
+
end
|
|
181
|
+
#---------------------------------------------------------------------------
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def name
|
|
185
|
+
self.class.name
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def logi(m)
|
|
189
|
+
SipLogger['siplog::sip_basecontroller'].info("[#{name}] "+m)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def logd(m)
|
|
193
|
+
SipLogger['siplog::sip_basecontroller'].debug("[#{name}] "+m)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def logw(m)
|
|
197
|
+
SipLogger['siplog::sip_basecontroller'].warn("[#{name}] "+m)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def loge(m)
|
|
201
|
+
SipLogger['siplog::sip_basecontroller'].error("[#{name}] "+m)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def logf(m)
|
|
205
|
+
SipLogger['siplog::sip_basecontroller'].fatal("[#{name}] "+m)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# start method
|
|
209
|
+
|
|
210
|
+
def start
|
|
211
|
+
logd("Nothing to start")
|
|
212
|
+
return false
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Response handling
|
|
216
|
+
|
|
217
|
+
def on_response(session)
|
|
218
|
+
case session.iresponse.code
|
|
219
|
+
when 100
|
|
220
|
+
on_trying_res(session)
|
|
221
|
+
when 101..199
|
|
222
|
+
on_provisional_res(session)
|
|
223
|
+
when 200..299
|
|
224
|
+
on_success_res(session)
|
|
225
|
+
when 300..399
|
|
226
|
+
on_redirect_res(session)
|
|
227
|
+
when 400..699
|
|
228
|
+
on_failure_res(session)
|
|
229
|
+
else
|
|
230
|
+
unknown_response(code)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def on_trying_res(session)
|
|
236
|
+
request_specific_response_dispatch(session, "on_trying_res")
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def on_provisional_res(session)
|
|
240
|
+
request_specific_response_dispatch(session, "on_provisional_res")
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def on_success_res(session)
|
|
244
|
+
request_specific_response_dispatch(session, "on_success_res")
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def on_failure_res(session)
|
|
248
|
+
request_specific_response_dispatch(session, "on_failure_res")
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def on_redirect_res(session)
|
|
252
|
+
request_specific_response_dispatch(session, "on_redirect_res")
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def on_custom_msg(session, custom_msg)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def unknown_response(code)
|
|
259
|
+
loge("I do not handle response with code #{code}")
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# response_method is the string "on_success_res" etc.
|
|
263
|
+
def request_specific_response_dispatch(session, response_method)
|
|
264
|
+
request_m = session.iresponse.get_request_method.downcase
|
|
265
|
+
handler = (sprintf("%s_for_%s", response_method, request_m)).to_sym
|
|
266
|
+
|
|
267
|
+
self.send(handler, session) if self.respond_to?(handler)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Request handling
|
|
271
|
+
#
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
#- Interestingly the benchmark for direct call, m.call and send are
|
|
275
|
+
# user system total real
|
|
276
|
+
# 4.726000 0.000000 4.726000 ( 4.757000)
|
|
277
|
+
# 6.810000 0.030000 6.840000 ( 6.870000)
|
|
278
|
+
# 5.027000 0.000000 5.027000 ( 5.027000)
|
|
279
|
+
# So I am continuing with send mechanism
|
|
280
|
+
# But perhaps it is still OK to return a boolean from here as we may use it
|
|
281
|
+
# for some other purposes.
|
|
282
|
+
def on_request(session)
|
|
283
|
+
logd("In base_controller on_request for call #{session.call_id}")
|
|
284
|
+
m = ("on_" + session.irequest.method.downcase).to_sym
|
|
285
|
+
return self.send(m, session)
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def on_media_event(session)
|
|
290
|
+
if session.imedia_event.class == Media::SmReply
|
|
291
|
+
self.on_media_reply(session)
|
|
292
|
+
else
|
|
293
|
+
case session.imedia_event.event
|
|
294
|
+
when 'AUDIOSTARTED'
|
|
295
|
+
self.on_media_audio_started(session)
|
|
296
|
+
when 'AUDIOSTOPPED'
|
|
297
|
+
self.on_media_audio_stopped(session)
|
|
298
|
+
when 'DTMFRECEIVED'
|
|
299
|
+
self.on_media_dtmf_received(session)
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def on_http_res(session)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def on_media_audio_started(session)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def on_media_audio_stopped(session)
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def on_media_dtmf_received(session)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def unknown_request(m)
|
|
318
|
+
logw("I do not handle request with method #{m}")
|
|
319
|
+
return false
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def method_missing(m, *a)
|
|
323
|
+
unknown_request( m )
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def on_timer(session, task)
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
# --- Session callbacks -----
|
|
330
|
+
def no_ack_received(session)
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def no_prack_received(session)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def session_being_invalidated_ok_to_proceed?(session)
|
|
337
|
+
true
|
|
338
|
+
end
|
|
339
|
+
# -------------------------
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def create_session
|
|
343
|
+
_create_session(DetachedSession, nil, nil, nil)
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def create_udp_session(rip=nil, rp=nil, rs=nil)
|
|
347
|
+
_create_session(UdpSession, rip, rp, rs)
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
def create_tcp_session(rip, rp)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
def create_tls_session(rip, rp)
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def create_sctp_session
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def _create_session(type, rip, rp, rs)
|
|
360
|
+
rs ||= self.class.get_pre_existing_route_set
|
|
361
|
+
s = type.new(rip, rp, rs, self.class.get_session_limit, self.specified_transport)
|
|
362
|
+
s.controller = self
|
|
363
|
+
s.set_transaction_usage self.class.get_transaction_usage #set controller wide usage
|
|
364
|
+
s.set_transaction_timers(:Base, self.class.get_transaction_timers) #set controller wide timers
|
|
365
|
+
s.set_session_timer(self.class.get_session_timer)
|
|
366
|
+
s.set_session_limit(self.class.get_session_limit) # redundant as already set in init
|
|
367
|
+
s.set_transaction_handlers(self.class.get_transaction_handlers)
|
|
368
|
+
s.set_t2xx_retrans_usage(self.class.get_t2xx_usage)
|
|
369
|
+
s.set_t1xx_retrans_usage(self.class.get_t1xx_retran_usage)
|
|
370
|
+
s.set_t2xx_retrans_timers(self.class.get_t2xx_timers)
|
|
371
|
+
s.set_t1xx_retrans_timers(self.class.get_t1xx_timers)
|
|
372
|
+
s.set_header_order(self.class.get_header_order)
|
|
373
|
+
s.set_compact_headers(self.class.get_compact_headers)
|
|
374
|
+
s.set_session_record(self.class.get_session_record)
|
|
375
|
+
return s
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
# enables chaining by detecting interest early
|
|
380
|
+
def interested?(initial_request)
|
|
381
|
+
if self.respond_to?(("on_" + initial_request.method.downcase).to_sym)
|
|
382
|
+
logd("Yes I #{name} is interested")
|
|
383
|
+
return true
|
|
384
|
+
else
|
|
385
|
+
logd("No I #{name} is not interested")
|
|
386
|
+
return false
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# Returns a transport specified for the controller in the form
|
|
391
|
+
# [ip, port, transport] where transport is optional and if
|
|
392
|
+
# present can be "UDP" or "TCP".
|
|
393
|
+
# While sending the message, this preferred transport will be used
|
|
394
|
+
# and on receiving the controller will be invoked only if the message
|
|
395
|
+
# is received on this transport.
|
|
396
|
+
# Defining controllers can thus control which transport they are bound
|
|
397
|
+
# to. If not present a default transport, based upon the transport
|
|
398
|
+
# selection procedure is assigned to the controller.
|
|
399
|
+
def specified_transport
|
|
400
|
+
nil
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
# returns an integer indicating the position in order array as used in
|
|
404
|
+
# controller selection. -1 indicates to disregard this value. This if present
|
|
405
|
+
# supercedes the order.yaml. This allows for ordering inline controllers.
|
|
406
|
+
def order
|
|
407
|
+
-1
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
def registration_store
|
|
411
|
+
SIP::Locator[:RegistrationStore]
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
# The dialog info store, keeps track of AOR => ["call_id;local_tag;remote_tag",..]
|
|
416
|
+
# for the AOR belonging to the UA.
|
|
417
|
+
def dialog_store
|
|
418
|
+
SIP::Locator[:DialogInfoStore]
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
private :_create_session
|
|
422
|
+
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
end
|