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