summaryrefslogtreecommitdiffstats
path: root/lib/libfetch/fetch.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2000-10-12 22:07:49 +0000
committerdes <des@FreeBSD.org>2000-10-12 22:07:49 +0000
commit238c26fcaef354acb1ec4ed4b539ceedfc42ab9f (patch)
tree2f5445851783219ab334fdd4ad9929f9fc3a01a1 /lib/libfetch/fetch.c
parent4ce445deae9fd1f24de069fd98e1eed6e4c0e989 (diff)
downloadFreeBSD-src-238c26fcaef354acb1ec4ed4b539ceedfc42ab9f.zip
FreeBSD-src-238c26fcaef354acb1ec4ed4b539ceedfc42ab9f.tar.gz
Relax URL syntax so that schemeless URLs are supported.
Diffstat (limited to 'lib/libfetch/fetch.c')
-rw-r--r--lib/libfetch/fetch.c47
1 files changed, 23 insertions, 24 deletions
diff --git a/lib/libfetch/fetch.c b/lib/libfetch/fetch.c
index 3eb8075..e79dba8 100644
--- a/lib/libfetch/fetch.c
+++ b/lib/libfetch/fetch.c
@@ -75,11 +75,11 @@ fetchXGet(struct url *URL, struct url_stat *us, char *flags)
int direct;
direct = (flags && strchr(flags, 'd'));
- if (strcasecmp(URL->scheme, "file") == 0)
+ if (strcasecmp(URL->scheme, SCHEME_FILE) == 0)
return fetchXGetFile(URL, us, flags);
- else if (strcasecmp(URL->scheme, "http") == 0)
+ else if (strcasecmp(URL->scheme, SCHEME_HTTP) == 0)
return fetchXGetHTTP(URL, us, flags);
- else if (strcasecmp(URL->scheme, "ftp") == 0) {
+ else if (strcasecmp(URL->scheme, SCHEME_FTP) == 0) {
return fetchXGetFTP(URL, us, flags);
} else {
_url_seterr(URL_BAD_SCHEME);
@@ -107,11 +107,11 @@ fetchPut(struct url *URL, char *flags)
int direct;
direct = (flags && strchr(flags, 'd'));
- if (strcasecmp(URL->scheme, "file") == 0)
+ if (strcasecmp(URL->scheme, SCHEME_FILE) == 0)
return fetchPutFile(URL, flags);
- else if (strcasecmp(URL->scheme, "http") == 0)
+ else if (strcasecmp(URL->scheme, SCHEME_HTTP) == 0)
return fetchPutHTTP(URL, flags);
- else if (strcasecmp(URL->scheme, "ftp") == 0) {
+ else if (strcasecmp(URL->scheme, SCHEME_FTP) == 0) {
return fetchPutFTP(URL, flags);
} else {
_url_seterr(URL_BAD_SCHEME);
@@ -129,11 +129,11 @@ fetchStat(struct url *URL, struct url_stat *us, char *flags)
int direct;
direct = (flags && strchr(flags, 'd'));
- if (strcasecmp(URL->scheme, "file") == 0)
+ if (strcasecmp(URL->scheme, SCHEME_FILE) == 0)
return fetchStatFile(URL, us, flags);
- else if (strcasecmp(URL->scheme, "http") == 0)
+ else if (strcasecmp(URL->scheme, SCHEME_HTTP) == 0)
return fetchStatHTTP(URL, us, flags);
- else if (strcasecmp(URL->scheme, "ftp") == 0) {
+ else if (strcasecmp(URL->scheme, SCHEME_FTP) == 0) {
return fetchStatFTP(URL, us, flags);
} else {
_url_seterr(URL_BAD_SCHEME);
@@ -151,11 +151,11 @@ fetchList(struct url *URL, char *flags)
int direct;
direct = (flags && strchr(flags, 'd'));
- if (strcasecmp(URL->scheme, "file") == 0)
+ if (strcasecmp(URL->scheme, SCHEME_FILE) == 0)
return fetchListFile(URL, flags);
- else if (strcasecmp(URL->scheme, "http") == 0)
+ else if (strcasecmp(URL->scheme, SCHEME_HTTP) == 0)
return fetchListHTTP(URL, flags);
- else if (strcasecmp(URL->scheme, "ftp") == 0) {
+ else if (strcasecmp(URL->scheme, SCHEME_FTP) == 0) {
return fetchListFTP(URL, flags);
} else {
_url_seterr(URL_BAD_SCHEME);
@@ -288,7 +288,7 @@ fetchMakeURL(char *scheme, char *host, int port, char *doc,
/*
* Split an URL into components. URL syntax is:
- * method:[//[user[:pwd]@]host[:port]]/[document]
+ * [method:/][/[user[:pwd]@]host[:port]/][document]
* This almost, but not quite, RFC1738 URL syntax.
*/
struct url *
@@ -305,19 +305,18 @@ fetchParseURL(char *URL)
}
/* scheme name */
- for (i = 0; *URL && (*URL != ':'); URL++)
- if (i < URL_SCHEMELEN)
- u->scheme[i++] = *URL;
- if (!URL[0] || (URL[1] != '/')) {
- _url_seterr(URL_BAD_SCHEME);
- goto ouch;
+ if ((p = strstr(URL, ":/"))) {
+ snprintf(u->scheme, URL_SCHEMELEN+1, "%.*s", p - URL, URL);
+ URL = ++p;
+ /*
+ * Only one slash: no host, leave slash as part of document
+ * Two slashes: host follows, strip slashes
+ */
+ if (URL[1] == '/')
+ URL = (p += 2);
}
- else URL++;
- if (URL[1] != '/') {
- p = URL;
+ if (!*URL || *URL == '/')
goto nohost;
- }
- else URL += 2;
p = strpbrk(URL, "/@");
if (p && *p == '@') {
OpenPOWER on IntegriCloud