db_mysql: database URL supports IPv6 address as hostname
authorAlexey Vasilyev <alexei.vasilyev@gmail.com>
Wed, 4 Sep 2019 10:47:23 +0000 (13:47 +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_mysql/my_uri.c

index 48267ba..8ab819e 100644 (file)
@@ -96,12 +96,13 @@ static int parse_mysql_uri(struct my_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;
 
@@ -157,6 +158,11 @@ static int parse_mysql_uri(struct my_uri* res, str* uri)
                                begin = uri->s + i + 1;
                                break;
 
+                       case '[':
+                               st = ST_HOST6;
+                               begin = uri->s + i + 1;
+                               break;
+
                        case '/':
                                if (dupl_string(&res->host, begin, uri->s + i) < 0) goto err;
                                if (dupl_string(&res->database, uri->s + i + 1, uri->s + uri->len) < 0) goto err;
@@ -185,19 +191,33 @@ static int parse_mysql_uri(struct my_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) goto err;
+                               if (dupl_string(&res->host, begin, uri->s + i - ipv6_flag) < 0) goto err;
                                begin = uri->s + i + 1;
                                break;
 
                        case '/':
-                               if (dupl_string(&res->host, begin, uri->s + i) < 0) goto err;
+                               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) < 0) goto err;
                                return 0;
                        }
                        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 '/':