mirror of
https://github.com/moparisthebest/curl
synced 2025-03-11 07:39:50 -04:00
curl --head now reports info "headers" on file:// URLs as well
This commit is contained in:
parent
5554f1ccba
commit
fb26b2bd98
6
CHANGES
6
CHANGES
@ -7,6 +7,12 @@
|
|||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
|
||||||
|
Daniel (30 October)
|
||||||
|
- David Hull made libcurl deal with NOBODY and HEADER for file:// the same way
|
||||||
|
it already does for FTP: it provides HTTP-looking headers that provide info
|
||||||
|
only about the file, without doing the actual transfer. The curl tool then
|
||||||
|
lets --head do this.
|
||||||
|
|
||||||
Daniel (29 October)
|
Daniel (29 October)
|
||||||
- runtests.pl now checks for and use valgrind if present. It will redirect the
|
- runtests.pl now checks for and use valgrind if present. It will redirect the
|
||||||
valgrind results in log/valgrind[num] but it currently doesn't scan that
|
valgrind results in log/valgrind[num] but it currently doesn't scan that
|
||||||
|
@ -367,10 +367,11 @@ name, IP address or host name. An example could look like:
|
|||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-I/--head"
|
.IP "-I/--head"
|
||||||
(HTTP/FTP)
|
(HTTP/FTP/FILE)
|
||||||
Fetch the HTTP-header only! HTTP-servers feature the command HEAD
|
Fetch the HTTP-header only! HTTP-servers feature the command HEAD
|
||||||
which this uses to get nothing but the header of a document. When used
|
which this uses to get nothing but the header of a document. When used
|
||||||
on a FTP file, curl displays the file size only.
|
on a FTP or FILE file, curl displays the file size and last modification
|
||||||
|
time only.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable header only.
|
If this option is used twice, the second will again disable header only.
|
||||||
.IP "-j/--junk-session-cookies"
|
.IP "-j/--junk-session-cookies"
|
||||||
|
47
lib/file.c
47
lib/file.c
@ -163,7 +163,8 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
*/
|
*/
|
||||||
CURLcode res = CURLE_OK;
|
CURLcode res = CURLE_OK;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
double expected_size=-1;
|
unsigned long expected_size=0;
|
||||||
|
bool fstated=FALSE;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
char *buf = data->state.buffer;
|
char *buf = data->state.buffer;
|
||||||
@ -178,25 +179,59 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
/*VMS?? -- This only works reliable for STREAMLF files */
|
/*VMS?? -- This only works reliable for STREAMLF files */
|
||||||
if( -1 != fstat(fd, &statbuf)) {
|
if( -1 != fstat(fd, &statbuf)) {
|
||||||
/* we could stat it, then read out the size */
|
/* we could stat it, then read out the size */
|
||||||
expected_size = (double)statbuf.st_size;
|
expected_size = statbuf.st_size;
|
||||||
|
fstated = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we have selected NOBODY and HEADER, it means that we only want file
|
||||||
|
information. Which for FILE can't be much more than the file size and
|
||||||
|
date. */
|
||||||
|
if(data->set.no_body && data->set.include_header && fstated) {
|
||||||
|
CURLcode result;
|
||||||
|
sprintf(buf, "Content-Length: %lu\r\n", expected_size);
|
||||||
|
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
sprintf(buf, "Accept-ranges: bytes\r\n");
|
||||||
|
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
#ifdef HAVE_STRFTIME
|
||||||
|
if(fstated) {
|
||||||
|
struct tm *tm;
|
||||||
|
#ifdef HAVE_LOCALTIME_R
|
||||||
|
struct tm buffer;
|
||||||
|
tm = (struct tm *)localtime_r((time_t *)&statbuf.st_mtime, &buffer);
|
||||||
|
#else
|
||||||
|
tm = localtime((time_t *)&statbuf.st_mtime);
|
||||||
|
#endif
|
||||||
|
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
|
||||||
|
strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S GMT\r\n",
|
||||||
|
tm);
|
||||||
|
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Added by Dolbneff A.V & Spiridonoff A.V */
|
/* Added by Dolbneff A.V & Spiridonoff A.V */
|
||||||
if (conn->resume_from <= expected_size)
|
if (conn->resume_from <= (long)expected_size)
|
||||||
expected_size -= conn->resume_from;
|
expected_size -= conn->resume_from;
|
||||||
else
|
else
|
||||||
/* Is this error code suitable in such situation? */
|
/* Is this error code suitable in such situation? */
|
||||||
return CURLE_FTP_BAD_DOWNLOAD_RESUME;
|
return CURLE_FTP_BAD_DOWNLOAD_RESUME;
|
||||||
|
|
||||||
if (expected_size == 0)
|
if (fstated && (expected_size == 0))
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
/* The following is a shortcut implementation of file reading
|
/* The following is a shortcut implementation of file reading
|
||||||
this is both more efficient than the former call to download() and
|
this is both more efficient than the former call to download() and
|
||||||
it avoids problems with select() and recv() on file descriptors
|
it avoids problems with select() and recv() on file descriptors
|
||||||
in Winsock */
|
in Winsock */
|
||||||
if(expected_size != -1)
|
if(fstated)
|
||||||
Curl_pgrsSetDownloadSize(data, expected_size);
|
Curl_pgrsSetDownloadSize(data, (double)expected_size);
|
||||||
|
|
||||||
if(conn->resume_from)
|
if(conn->resume_from)
|
||||||
/* Added by Dolbneff A.V & Spiridonoff A.V */
|
/* Added by Dolbneff A.V & Spiridonoff A.V */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user