[asterisk-dev] reset/remove SipAddHeader() headers

Klaus Darilion klaus.mailinglists at pernau.at
Fri Jan 16 02:28:51 CST 2009


FYI: SipAddHeader() was added to trunk

klaus

Klaus Darilion schrieb:
> 
> John Todd schrieb:
>> On Jan 14, 2009, at 8:50 AM, Klaus Darilion wrote:
>>
>>> Hi!
>>>
>>> As far as I saw in chan_sip (at least 1.4.22) once SIP headers are  
>>> added
>>> with SipAddHeader() there is no way to remove them, which is bad if  
>>> the
>>> request is rerouted to another SIp destination, e.g:
>>>
>>> user      Asterisk      GW1        GW2
>>> ---INVITE-->
>>>          add certain
>>>          header for GW1:
>>>          SipAddHeader(..)
>>>
>>>               ---INVITE--->
>>>               (contains additional
>>>               header)
>>>
>>>
>>>               <--500-------
>>>
>>>          reroute request
>>>          to a different GW
>>>
>>>
>>>              ----------INVITE-------->
>>>              this request also contains
>>>              the added SIP header
>>>
>>> Headers added with SipAddHeader are added to the incoming channel as
>>> global channel variables SIPADDHEADER01, SIPADDHEADER02, ....
>>>
>>> Then on outgoing requests chan_sip will traverse the channel variables
>>> for SIPADDHEADERxx and add them.
>>>
>>> Thus, it would be useful to reset the channel variables somehow, e.g.
>>> with an application SipAddHeaderReset();
>>>
>>> I could not find any existing solution, thus what do you think about
>>> this new application?
>>>
>>> thanks
>>> klaus
>>
>>
>> There be dragons.
>>
>> I agree that there probably should be some way to do this, but a way  
>> to do this properly does not immediately come to mind.  For instance,  
>> in the event that GW2 sends a 302 redirect, how does one execute the  
>> SipAddHeaderReset() application or function?  That 302 redirect step  
>> never breaks out of Dial() - the redirect just magically happens.  The  
>> dialplan (or AGI, or whatever) never has a chance to execute any other  
>> commands such as adding headers or removing headers or whatever.  I  
>> don't have an answer on how this should be handled elegantly.
>>
>> Even in the instance where a 500 is received and somehow the dialplan  
>> is re-entered, it seems burdensome to remove ALL headers and start  
>> from scratch.  Wouldn't you just want to remove the specific header  
>> that is causing problems?  This would imply some sort of indexing, or  
>> at the minimum, regexp-style string matching so I could say:
>>
>>   exten => _X11.,SipRemoveHeader(X-PSAP-ID)
>>
>> which would remove both of these headers:
>>
>> X-PSAP-ID: 33-MONTCOPA-PRIMARY-9929312311AA
>> X-PSAP-ID: 33-MONTCOPA-BACK-99283122833CD
>>
>> Lastly, I wouldn't restrict header removal just to headers that have  
>> been added by prior steps in the dialplan of Asterisk.  Why not allow  
>> deletion of arbitrary headers?  This would permit more control over  
>> messaging.  (Though I will admit a glaring memory hole on my part - I  
>> assume Asterisk passes through headers unmodified from UA-to-UA... is  
>> that correct?  My first memory impression is "Yes" but the more I  
>> think about it the less certain I am, and I don't have time to test  
>> right now.)
>>
>> Or am I missing your concept?
> 
> Of course you are right and the SipAddHeader mechanism could be made 
> much more generic - my idea was just to start with an easy and doable 
> solution.
> 
> I submitted a patch which also takes at least some of your ideas - to 
> remove selectively too: http://bugs.digium.com/view.php?id=14246
> 
> 
> core show application SIPRemoveHeader
> gw*CLI>
>    -= Info about application 'SIPRemoveHeader' =-
> 
> [Synopsis]
> Remove SIP headers previously added with SIPAddHeader
> 
> [Description]
>    SIPRemoveHeader()
> SIPRemoveHeader() allows you to remove headers which were previously
> added with SIPAddHeader(). If no parameter is supplied, all previously
> added headers will be removed. If a parameter is supplied, only the matching
> headers will be removed.
> 
> For example you have added these 2 headers:
>    SIPAddHeader(P-Asserted-Identity: sip:foo at bar);
>    SIPAddHeader(P-Preferred-Identity: sip:bar at foo);
> 
>    // remove all headers
>    SIPRemoveHeader();
> 
>    // remove all P- headers
>    SIPRemoveHeader(P-);
> 
>    // remove one the PAI header (note the : at the end)
>    SIPRemoveHeader(P-Asserted-Identity:);
> 
> 
> 
> regards
> klaus
> 
> _______________________________________________
> --Bandwidth and Colocation Provided by http://www.api-digital.com--
> 
> asterisk-dev mailing list
> To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-dev



More information about the asterisk-dev mailing list