mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-09 11:28:25 +00:00
How many attempts does it take to make a SIP URI parser that works well? I'm up to 5 personally. On to the good stuff - parse the domain first, user second, and get rid of port & options/params last. (issue #7616 reported by andrew)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@38501 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -6633,7 +6633,7 @@ static int get_rdnis(struct sip_pvt *p, struct sip_request *oreq)
|
||||
/*! \brief get_destination: Find out who the call is for --*/
|
||||
static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
|
||||
{
|
||||
char tmp[256] = "", *uri, *a, *b;
|
||||
char tmp[256] = "", *uri, *a, *user, *domain, *opts;
|
||||
char tmpf[256], *from;
|
||||
struct sip_request *req;
|
||||
char *colon;
|
||||
@@ -6668,26 +6668,27 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
|
||||
ast_uri_decode(from);
|
||||
}
|
||||
|
||||
/* Skip any options */
|
||||
if ((a = strchr(uri, ';'))) {
|
||||
*a++ = '\0';
|
||||
b = a;
|
||||
/* Get the target domain first and user */
|
||||
if ((domain = strchr(uri, '@'))) {
|
||||
*domain++ = '\0';
|
||||
user = uri;
|
||||
} else {
|
||||
b = uri;
|
||||
/* No user portion present */
|
||||
domain = uri;
|
||||
user = "s";
|
||||
}
|
||||
|
||||
/* Get the target domain */
|
||||
if ((a = strchr(b, '@'))) {
|
||||
*a++ = '\0';
|
||||
} else { /* No username part */
|
||||
a = b;
|
||||
uri = "s"; /* Set extension to "s" */
|
||||
}
|
||||
colon = strchr(a, ':'); /* Remove :port */
|
||||
if (colon)
|
||||
/* Strip port from domain if present */
|
||||
if ((colon = strchr(domain, ':'))) {
|
||||
*colon = '\0';
|
||||
}
|
||||
|
||||
ast_copy_string(p->domain, a, sizeof(p->domain));
|
||||
/* Strip any params or options from user */
|
||||
if ((opts = strchr(user, ';'))) {
|
||||
*opts = '\0';
|
||||
}
|
||||
|
||||
ast_copy_string(p->domain, domain, sizeof(p->domain));
|
||||
|
||||
if (!AST_LIST_EMPTY(&domain_list)) {
|
||||
char domain_context[AST_MAX_EXTENSION];
|
||||
@@ -6714,19 +6715,19 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
|
||||
ast_copy_string(p->fromdomain, from, sizeof(p->fromdomain));
|
||||
}
|
||||
if (sip_debug_test_pvt(p))
|
||||
ast_verbose("Looking for %s in %s (domain %s)\n", uri, p->context, p->domain);
|
||||
ast_verbose("Looking for %s in %s (domain %s)\n", user, p->context, p->domain);
|
||||
|
||||
/* Return 0 if we have a matching extension */
|
||||
if (ast_exists_extension(NULL, p->context, uri, 1, from) ||
|
||||
if (ast_exists_extension(NULL, p->context, user, 1, from) ||
|
||||
!strcmp(uri, ast_pickup_ext())) {
|
||||
if (!oreq)
|
||||
ast_copy_string(p->exten, uri, sizeof(p->exten));
|
||||
ast_copy_string(p->exten, user, sizeof(p->exten));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return 1 for overlap dialling support */
|
||||
if (ast_canmatch_extension(NULL, p->context, uri, 1, from) ||
|
||||
!strncmp(uri, ast_pickup_ext(),strlen(uri))) {
|
||||
if (ast_canmatch_extension(NULL, p->context, user, 1, from) ||
|
||||
!strncmp(user, ast_pickup_ext(),strlen(user))) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user