Best way to iterate over headers

MR
Mike Roberts
Wed, Mar 23, 2016 5:46 PM

I want to copy the headers I receive in an INVITE (or other message) into a
key value store. Is there an easy way to iterate over the headers in a
message? Or at least the headers that can be represented as a
pjsip_generic_string_hdr? The best method I can find so far would be to
loop over the body of the message and manually parse the headers myself.

I want to copy the headers I receive in an INVITE (or other message) into a key value store. Is there an easy way to iterate over the headers in a message? Or at least the headers that can be represented as a pjsip_generic_string_hdr? The best method I can find so far would be to loop over the body of the message and manually parse the headers myself.
AW
Andreas Wehrmann
Thu, Mar 24, 2016 6:41 AM

On 03/23/2016 06:46 PM, Mike Roberts wrote:

I want to copy the headers I receive in an INVITE (or other message) into a
key value store. Is there an easy way to iterate over the headers in a
message? Or at least the headers that can be represented as a
pjsip_generic_string_hdr? The best method I can find so far would be to
loop over the body of the message and manually parse the headers myself.

I didn't test it, but...
In the on_incoming_call you can get the message object:

void on_incoming_call( ..., ..., pjsip_rx_data rdata )
{
pjsip_msg
msg = rdata->msg_info.msg;
char value[ 512 ] = { 0 };
const pjsip_hdr hdr=(const pjsip_hdr)msg->hdr.next, *end=&msg->hdr;

 for (; hdr!=end; hdr = hdr->next)
 {
     /* write header value to buffer */
     hdr->vptr->print_on( hdr, value, 512 );

     /* store header in database or whatever... */
     store_header( hdr->name, value );
 }

}

Like I said, I didn't test it but merely wrote this looking at the code
in functions like pjsip_msg_find_hdr*
If somebody else has a better way of doing this, please share it here.

Regards,
Andreas

On 03/23/2016 06:46 PM, Mike Roberts wrote: > I want to copy the headers I receive in an INVITE (or other message) into a > key value store. Is there an easy way to iterate over the headers in a > message? Or at least the headers that can be represented as a > pjsip_generic_string_hdr? The best method I can find so far would be to > loop over the body of the message and manually parse the headers myself. > I didn't test it, but... In the on_incoming_call you can get the message object: void on_incoming_call( ..., ..., pjsip_rx_data *rdata ) { pjsip_msg* msg = rdata->msg_info.msg; char value[ 512 ] = { 0 }; const pjsip_hdr *hdr=(const pjsip_hdr*)msg->hdr.next, *end=&msg->hdr; for (; hdr!=end; hdr = hdr->next) { /* write header value to buffer */ hdr->vptr->print_on( hdr, value, 512 ); /* store header in database or whatever... */ store_header( hdr->name, value ); } } Like I said, I didn't test it but merely wrote this looking at the code in functions like pjsip_msg_find_hdr* If somebody else has a better way of doing this, please share it here. Regards, Andreas