Fossil SCM

Fix the URL parser so that it is able to handle IPv6 addresses. Cherrypick (with updates) from the ipv6 branch circa [2012-07-07].

drh 2015-01-26 18:23 trunk
Commit 2075361ece43d7faa912c78c1c7ca13e71ec0579
2 files changed +11 -1 +11 -1
+11 -1
--- src/url.c
+++ src/url.c
@@ -158,12 +158,22 @@
158158
zLogin = mprintf("%t@", pUrlData->user);
159159
for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
160160
pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]);
161161
i = j;
162162
}else{
163
- for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){}
163
+ int inSquare = 0;
164
+ int n;
165
+ for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){
166
+ if( c=='[' ) inSquare = 1;
167
+ if( c==']' ) inSquare = 0;
168
+ }
164169
pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]);
170
+ n = strlen(pUrlData->name);
171
+ if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){
172
+ pUrlData->name++;
173
+ pUrlData->name[n-2] = 0;
174
+ }
165175
zLogin = mprintf("");
166176
}
167177
url_tolower(pUrlData->name);
168178
if( c==':' ){
169179
pUrlData->port = 0;
170180
--- src/url.c
+++ src/url.c
@@ -158,12 +158,22 @@
158 zLogin = mprintf("%t@", pUrlData->user);
159 for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
160 pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]);
161 i = j;
162 }else{
163 for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){}
 
 
 
 
 
164 pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]);
 
 
 
 
 
165 zLogin = mprintf("");
166 }
167 url_tolower(pUrlData->name);
168 if( c==':' ){
169 pUrlData->port = 0;
170
--- src/url.c
+++ src/url.c
@@ -158,12 +158,22 @@
158 zLogin = mprintf("%t@", pUrlData->user);
159 for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
160 pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]);
161 i = j;
162 }else{
163 int inSquare = 0;
164 int n;
165 for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){
166 if( c=='[' ) inSquare = 1;
167 if( c==']' ) inSquare = 0;
168 }
169 pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]);
170 n = strlen(pUrlData->name);
171 if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){
172 pUrlData->name++;
173 pUrlData->name[n-2] = 0;
174 }
175 zLogin = mprintf("");
176 }
177 url_tolower(pUrlData->name);
178 if( c==':' ){
179 pUrlData->port = 0;
180
+11 -1
--- src/url.c
+++ src/url.c
@@ -158,12 +158,22 @@
158158
zLogin = mprintf("%t@", pUrlData->user);
159159
for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
160160
pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]);
161161
i = j;
162162
}else{
163
- for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){}
163
+ int inSquare = 0;
164
+ int n;
165
+ for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){
166
+ if( c=='[' ) inSquare = 1;
167
+ if( c==']' ) inSquare = 0;
168
+ }
164169
pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]);
170
+ n = strlen(pUrlData->name);
171
+ if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){
172
+ pUrlData->name++;
173
+ pUrlData->name[n-2] = 0;
174
+ }
165175
zLogin = mprintf("");
166176
}
167177
url_tolower(pUrlData->name);
168178
if( c==':' ){
169179
pUrlData->port = 0;
170180
--- src/url.c
+++ src/url.c
@@ -158,12 +158,22 @@
158 zLogin = mprintf("%t@", pUrlData->user);
159 for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
160 pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]);
161 i = j;
162 }else{
163 for(i=iStart; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){}
 
 
 
 
 
164 pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]);
 
 
 
 
 
165 zLogin = mprintf("");
166 }
167 url_tolower(pUrlData->name);
168 if( c==':' ){
169 pUrlData->port = 0;
170
--- src/url.c
+++ src/url.c
@@ -158,12 +158,22 @@
158 zLogin = mprintf("%t@", pUrlData->user);
159 for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
160 pUrlData->name = mprintf("%.*s", j-i-1, &zUrl[i+1]);
161 i = j;
162 }else{
163 int inSquare = 0;
164 int n;
165 for(i=iStart; (c=zUrl[i])!=0 && c!='/' && (inSquare || c!=':'); i++){
166 if( c=='[' ) inSquare = 1;
167 if( c==']' ) inSquare = 0;
168 }
169 pUrlData->name = mprintf("%.*s", i-iStart, &zUrl[iStart]);
170 n = strlen(pUrlData->name);
171 if( pUrlData->name[0]=='[' && n>2 && pUrlData->name[n-1]==']' ){
172 pUrlData->name++;
173 pUrlData->name[n-2] = 0;
174 }
175 zLogin = mprintf("");
176 }
177 url_tolower(pUrlData->name);
178 if( c==':' ){
179 pUrlData->port = 0;
180

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button