[asterisk-dev] reset/remove SipAddHeader() headers
Klaus Darilion
klaus.mailinglists at pernau.at
Thu Jan 15 03:44:46 CST 2009
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
More information about the asterisk-dev
mailing list