libxbps: avoid fetchStat() and use only fetchXGet().

Some HTTP servers (observerd with googlecode.com), issue a 404
if the headers are checked before issuing a GET transfer.

--HG--
extra : convert_revision : xtraeme%40gmail.com-20091030162044-ng8o944bajwdudg8
This commit is contained in:
Juan RP 2009-10-30 17:20:44 +01:00
parent 4aeea194e3
commit 4e83deb0cc

View File

@ -186,6 +186,7 @@ xbps_fetch_file(const char *uri, const char *outputdir, const char *flags)
bool restart = false; bool restart = false;
bytes_read = bytes_written = -1; bytes_read = bytes_written = -1;
fetchLastErrCode = 0;
/* /*
* Get the filename specified in URI argument. * Get the filename specified in URI argument.
@ -204,6 +205,10 @@ xbps_fetch_file(const char *uri, const char *outputdir, const char *flags)
goto out; goto out;
} }
/*
* Check if we have to resume a transfer.
*/
memset(&st, 0, sizeof(st));
if (stat(destfile, &st) == 0) if (stat(destfile, &st) == 0)
restart = true; restart = true;
else { else {
@ -221,30 +226,46 @@ xbps_fetch_file(const char *uri, const char *outputdir, const char *flags)
goto out; goto out;
} }
memset(&fetchflags, 0, sizeof(fetchflags)); /*
* Set client flags.
*/
if (flags != NULL) if (flags != NULL)
strcat(fetchflags, flags); strcat(fetchflags, flags);
strcat(fetchflags, "i"); strcat(fetchflags, "i");
if ((rv = fetchStat(url, &url_st, fetchflags)) == -1) {
rv = fetchLastErrCode;
goto out;
}
/* /*
* Nothing to do if both files do have same size/mtime. * By default we assume that we want always restart a transfer,
* will be checked later.
*/ */
if (url_st.size == st.st_size && url_st.mtime == st.st_mtime) url->offset = st.st_size;
goto out;
if (restart)
url->offset = st.st_size;
fio = fetchXGet(url, &url_st, fetchflags); fio = fetchXGet(url, &url_st, fetchflags);
if (fio == NULL) { if (fio == NULL) {
/*
* If requested offset is the same than remote size,
* files are identical.
*/
if (url->offset == st.st_size)
goto out;
rv = fetchLastErrCode; rv = fetchLastErrCode;
goto out; goto out;
} }
if (url_st.size != -1) {
if (url_st.size == st.st_size) {
/*
* Files are identical.
*/
goto out;
} else if (st.st_size > url_st.size) {
/*
* Local file bigger, error out.
*/
rv = EFBIG;
goto out;
}
}
printf("Connected to %s.\n", url->host); printf("Connected to %s.\n", url->host);
/* /*
@ -280,7 +301,10 @@ xbps_fetch_file(const char *uri, const char *outputdir, const char *flags)
else else
stat_update(&xs, bytes_dld); stat_update(&xs, bytes_dld);
} }
if (bytes_read == -1) { if (fetchLastErrCode != 0) {
rv = fetchLastErrCode;
goto out;
} else if (bytes_read == -1) {
rv = EINVAL; rv = EINVAL;
goto out; goto out;
} }