OverSIP::Modules::OutboundMangling provides a “hack” for the scenario in which OverSIP behaves as an Outbound Edge Proxy but the SIP registrar behind it does not support the Path mechanism (i.e. Asterisk PBX).
A common scenario is the following:
[ Asterisk ] | [ OverSIP ] / \ Alice Bob
- Alice sends a REGISTER.
- OverSIP applies Outbound for the request (maybe because Alice indicates supports for it in the REGISTER or because
fix_nat()method was called to force it).
- OverSIP inspects the Contact header of the REGISTER. If it contains a single SIP URI value then it adds a custom
;ov-obparameter to the Contact URI whose value is the Outbound flow token identifier of the connection.
- After proper authentication Asterisk replies
- OverSIP reacts on the received
200and removes the custom
;ov-obparameter from the list of SIP URIs in the Contact header.
- Alice receives the
200response and can find her own binding (untouched) in the Contact header (the mechanism provided by this feature is transparent for peers).
- Later Asterisk sends an INVITE to the registration binding of Alice and arrives to OverSIP. Such an INVITE does not contain a top Route header(s) with the mirrored value of the Path header(s) added by OverSIP (since Asterisk does not support “Path”) so it would be difficult to route such an Outbound incoming request to Alice. But fortunately, the INVITE Request-URI contains the
;ov-obparameter so OverSIP removes such a parameter and extracts the Outbound token identifier from its value.
- Then OverSIP routes the INVITE to Alice through the Outbound connection associated to the retrieved Outbound token identifier.
Module class methods
If Outbound is being used for the connection from which the REGISTER has been received and it contains a single Contact header with a single SIP URI value, then this methods adds a custom
;ov-ob parameter to the Contact URI and returns
true. Otherwise returns
if request.sip_method == :REGISTER proxy = OverSIP::SIP::Proxy.new :asterisk # Contact mangling for the case in which the registrar does not support Path. OverSIP::Modules::OutboundMangling.add_outbound_to_contact request proxy.route request end
Inspect the Request-URI of the given request and retrieve the
;ov-ob parameter value.
If the Route headers of the request indicate Outbound support (so the registrar does support Path) then this method does nothing (but just removing the
;ov-ob parameter from the Request-URI) and returns
Otherwise the method returns
true if the parameter is found in the Request-URI (and thus also removed),
# Requests comming from the registrar. if request.source_ip == ASTERISK_IP # Extract the Outbound flow token from the RURI (if present) to enforce incoming # Outbound usage. OverSIP::Modules::OutboundMangling.extract_outbound_from_ruri request OverSIP::SIP::Proxy.new.route request end
Inspect the Contact headers of the given SIP request or response and removes the custom
;ov-ob parameter from the SIP URI in which the method
add_outbound_to_contact() inserted it previously. It returns
false if no Contact header is found.
This method is useful for reverting the “hack” performed in the Contact URI before the
200 “OK” response for a REGISTER is forwarded to the client.
# Requests comming from the registrar. if request.source_ip == ASTERISK_IP # Extract the Outbound flow token from the RURI (if present) to enforce incoming # Outbound usage. OverSIP::Modules::OutboundMangling.extract_outbound_from_ruri request proxy = OverSIP::SIP::Proxy.new :asterisk proxy.on_success_response do |response| OverSIP::Modules::OutboundMangling.remove_outbound_from_contact response end proxy.route request end