db_postgres: database URL supports IPv6 address as hostname
authorAlexey Vasilyev <alexei.vasilyev@gmail.com>
Wed, 4 Sep 2019 11:12:22 +0000 (14:12 +0300)
committerHenning Westerholt <hw@skalatan.de>
Mon, 9 Sep 2019 19:51:59 +0000 (21:51 +0200)
- changed parsing of db_url to accept IPv6 address for hostname

src/modules/db_postgres/pg_uri.c

index 89c12dc..50132c1 100644 (file)
@@ -110,12 +110,13 @@ static int parse_postgres_uri(struct pg_uri *res, str *uri)
                ST_USER_HOST, /* Username or hostname */
                ST_PASS_PORT, /* Password or port part */
                ST_HOST,          /* Hostname part */
+               ST_HOST6,         /* Hostname part IPv6 */
                ST_PORT,          /* Port part */
                ST_DB             /* Database part */
        };
 
        enum state st;
-       int i;
+       int i, ipv6_flag=0;
        const char *begin;
        char *prev_token;
 
@@ -173,6 +174,11 @@ static int parse_postgres_uri(struct pg_uri *res, str *uri)
                                                begin = uri->s + i + 1;
                                                break;
 
+                                       case '[':
+                                               st = ST_HOST6;
+                                               begin = uri->s + i + 1;
+                                               break;
+
                                        case '/':
                                                if(memchr(uri->s + i + 1, '/', uri->len - i - 1)
                                                                != NULL)
@@ -213,9 +219,14 @@ static int parse_postgres_uri(struct pg_uri *res, str *uri)
 
                        case ST_HOST:
                                switch(uri->s[i]) {
+                                       case '[':
+                                               st = ST_HOST6;
+                                               begin = uri->s + i + 1;
+                                               break;
+
                                        case ':':
                                                st = ST_PORT;
-                                               if(dupl_string(&res->host, begin, uri->s + i) < 0)
+                                               if(dupl_string(&res->host, begin, uri->s + i - ipv6_flag) < 0)
                                                        goto err;
                                                begin = uri->s + i + 1;
                                                break;
@@ -224,7 +235,7 @@ static int parse_postgres_uri(struct pg_uri *res, str *uri)
                                                if(memchr(uri->s + i + 1, '/', uri->len - i - 1)
                                                                != NULL)
                                                        break;
-                                               if(dupl_string(&res->host, begin, uri->s + i) < 0)
+                                               if(dupl_string(&res->host, begin, uri->s + i - ipv6_flag) < 0)
                                                        goto err;
                                                if(dupl_string(&res->database, uri->s + i + 1,
                                                                   uri->s + uri->len)
@@ -234,6 +245,15 @@ static int parse_postgres_uri(struct pg_uri *res, str *uri)
                                }
                                break;
 
+                       case ST_HOST6:
+                               switch(uri->s[i]) {
+                                       case ']':
+                                               ipv6_flag = 1;
+                                               st = ST_HOST;
+                                               break;
+                               }
+                               break;
+
                        case ST_PORT:
                                switch(uri->s[i]) {
                                        case '/':