Differences From:
File
src/url.c
part of check-in
[dbda8d6ce9]
- Initial check-in of m1 sources.
by
drh on
2007-07-21 14:10:57.
[view]
To:
File
src/url.c
part of check-in
[e621b6dbe3]
- Use POST instead of GET for the /xfer method. Other bug fixes in the
URL parser.
by
drh on
2007-07-30 14:28:17.
[view]
@@ -32,18 +32,36 @@
** g.urlIsFile True if this is a file URL
** g.urlName Hostname for HTTP:. Filename for FILE:
** g.urlPort Port name for HTTP.
** g.urlPath Path name for HTTP.
+** g.urlUser Userid.
+** g.urlPasswd Password.
** g.urlCanonical The URL in canonical form
+**
+** HTTP url format is:
+**
+** http://userid:password@host:port/path?query#fragment
**
*/
void url_parse(const char *zUrl){
int i, j, c;
- char *zFile;
+ char *zFile = 0;
if( strncmp(zUrl, "http:", 5)==0 ){
g.urlIsFile = 0;
- for(i=7; (c=zUrl[i])!=0 && c!=':' && c!='/'; i++){}
- g.urlName = mprintf("%.*s", i-7, &zUrl[7]);
+ for(i=7; (c=zUrl[i])!=0 && c!='/' && c!='@'; i++){}
+ if( c=='@' ){
+ for(j=7; j<i && zUrl[j]!=':'; j++){}
+ g.urlUser = mprintf("%.*s", j-7, &zUrl[7]);
+ if( j<i ){
+ g.urlPasswd = mprintf("%.*s", i-j-1, &zUrl[j+1]);
+ }
+ for(j=i+1; (c=zUrl[j])!=0 && c!='/' && c!=':'; j++){}
+ g.urlName = mprintf("%.*s", j-i-1, &zUrl[i+1]);
+ i = j;
+ }else{
+ for(i=7; (c=zUrl[i])!=0 && c!='/' && c!=':'; i++){}
+ g.urlName = mprintf("%.*s", i-7, &zUrl[7]);
+ }
for(j=0; g.urlName[j]; j++){ g.urlName[j] = tolower(g.urlName[j]); }
if( c==':' ){
g.urlPort = 0;
i++;
@@ -88,5 +106,22 @@
g.urlName = mprintf("%b", &cfile);
g.urlCanonical = mprintf("file://%T", g.urlName);
blob_reset(&cfile);
}
+}
+
+/*
+** COMMAND: test-urlparser
+*/
+void cmd_test_urlparser(void){
+ if( g.argc!=3 ){
+ usage("URL");
+ }
+ url_parse(g.argv[2]);
+ printf("g.urlIsFile = %d\n", g.urlIsFile);
+ printf("g.urlName = %s\n", g.urlName);
+ printf("g.urlPort = %d\n", g.urlPort);
+ printf("g.urlPath = %s\n", g.urlPath);
+ printf("g.urlUser = %s\n", g.urlUser);
+ printf("g.urlPasswd = %s\n", g.urlPasswd);
+ printf("g.urlCanonical = %s\n", g.urlCanonical);
}