diff --git a/cachedb/cachedb_id.c b/cachedb/cachedb_id.c index b509d1a51e2..1ca05af3ed1 100644 --- a/cachedb/cachedb_id.c +++ b/cachedb/cachedb_id.c @@ -89,7 +89,7 @@ static int parse_cachedb_url(struct cachedb_id* id, const str* url) enum state st; unsigned int len, i, ipv6_flag=0, multi_hosts=0; - char* begin, *last_at; + char* begin, *last_at, *last_slash, *last_qm; char* prev_token,*start_host=NULL,*start_prev=NULL,*ptr; prev_token = 0; @@ -112,7 +112,15 @@ static int parse_cachedb_url(struct cachedb_id* id, const str* url) if (dupl_string(&id->initial_url,url->s,url->s+url->len) < 0) goto err; - last_at = q_memrchr(url->s, '@', url->len); + last_slash = q_memrchr(url->s, '/', url->len); + last_qm = q_memrchr(url->s, '?', url->len); + + /* ignore any '@' characters inside the "params" part */ + if (last_qm || last_slash) + last_at = q_memrchr(url->s, '@', + last_slash ? (last_slash-url->s) : (last_qm-url->s)); + else + last_at = q_memrchr(url->s, '@', url->len); for(i = 0; i < len; i++) { switch(st) { diff --git a/cachedb/test/test_cachedb.c b/cachedb/test/test_cachedb.c index 3d640793e58..da0eaf961bd 100644 --- a/cachedb/test/test_cachedb.c +++ b/cachedb/test/test_cachedb.c @@ -927,4 +927,17 @@ static void test_cachedb_url(void) ok(!strcmp(db->host, "h1,h2,h3:6379")); ok(!strcmp(db->database, "d")); ok(db->port == 0); + + CDB_PARSE("mongodb://opensips-voip-cosmosdb:" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "@opensips-voip-cosmosdb.mongo.cosmos.azure.com:10255" + "/?ssl=true&replicaSet=opensipsdb&retrywrites=false" + "&maxIdleTimeMS=120000&appName=@opensips-voip-cosmosdb@"); + ok(db->flags == 0); + ok(!strcmp(db->username, "opensips-voip-cosmosdb")); + ok(!strcmp(db->password, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")); + ok(!strcmp(db->host, "opensips-voip-cosmosdb.mongo.cosmos.azure.com")); + ok(db->port == 10255); + ok(!strcmp(db->extra_options, "ssl=true&replicaSet=opensipsdb&retrywrites=false&maxIdleTimeMS=120000&appName=@opensips-voip-cosmosdb@")); + ok(!db->database); }