[Serusers] SER Proxy with Redirect

Greger V. Teigre greger at teigre.com
Wed Aug 15 08:34:30 CEST 2007


I believe you can do this a lot easier in ser.cfg 2.x using selects to 
pick the Contact.
g-)

Fernando Schmitt wrote:
>
> Juha,
>
>  
>
> I'm new into C programming... Could you kindly let me know where this 
> code should be inserted?
>
>  
>
> yes, i implemented a function called move that turned 302 to invite, but
> that code relied on a patch to tm module that gave me access to contact
> header of reply in reply route.
>  
> i found the function and it is below.  someone who needs this
> functionality has to check if same kind of access to the contact header
> of the reply is still possible or if the access method is now different
> and modify the code accordingly.
>  
> also, all contacts would need to be taken from 302, not just the first.
>  
> contact_re was compiled during module initialization:
>  
>         regcomp(&contact_re, "^Contact:(.*)$", REG_EXTENDED|REG_NEWLINE);
>  
> needless to say, i'm not proud of this code, but it gives an idea on how
> it can be done.
>  
> -- juha
>  
> /*
>  * Appends a new branch to request using the first Contact URI of the (302)
>  * reply (if any) as the Request URI.  Returns 1 if appending succeeded and -1
>  * if it failed.
>  */
> int move(struct sip_msg* _m, char* _s1, char* _s2)
> {
>         struct sip_msg* reply;
>         regmatch_t pmatch[2];
>         struct hdr_field hf;
>         contact_t* first;
>  
>         reply = _m->final_reply;
>  
>         if (!reply) {
>                LOG(L_ERR, "move(): No reply found\n");
>                return -1;
>         }
>  
>         LOG(L_ERR, "move(): unparsed part of reply: %s\n", reply->unparsed);
>  
>         if ((regexec(&contact_re, reply->unparsed, 2, &(pmatch[0]), 0) != 0) ||
>             (pmatch[1].rm_so == -1)) {
>                LOG(L_ERR, "move(): No Contact header found\n");
>                return -1;
>         }
>  
>         hf.type = HDR_CONTACT;
>         hf.name.len = 0;
>         hf.body.len = pmatch[1].rm_eo - pmatch[1].rm_so - 1;
>         hf.body.s = &(reply->unparsed[pmatch[1].rm_so]);
>         hf.len = hf.body.len + 2;
>         hf.parsed = NULL;
>         hf.next = NULL;
>         
>         LOG(L_ERR, "hf.body: '%.*s'\n", hf.body.len, hf.body.s);
>  
>         if (parse_contact(&hf) < 0) {
>                LOG(L_ERR, "move(): Error while parsing Contact\n");
>                goto failure;
>         }
>         
>         if (((contact_body_t*)hf.parsed)->star == 1) {
>                LOG(L_ERR, "move(): Contact is *\n");
>                goto failure;
>         }
>  
>         first = ((contact_body_t*)hf.parsed)->contacts;
>         if (first) {
>                if (append_branch(_m, first->uri.s, first->uri.len) == 1) {
>                        goto success;
>                } else {
>                        LOG(L_ERR, "move(): Appending branch failed\n");
>                }
>         } else {
>                LOG(L_ERR, "move(): No contacts in Contact header\n");
>         }
>  
> failure:
>         if (hf.parsed) {
>                free_contact((contact_body_t**)(&(hf.parsed)));
>         }
>         return -1;
>  
> success:
>         free_contact((contact_body_t**)(&(hf.parsed)));
>         return 1;
> }
>
>  
>
> Fernando Schmitt
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Serusers mailing list
> Serusers at lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers
>   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20070815/0e2be6eb/attachment.htm>


More information about the sr-users mailing list