mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-11 09:50:12 +00:00
Deal with broken Web sites which return 302 responses rather than 404
and an error document when the requested resource does not exist. Grrr. Requested by: asami
This commit is contained in:
parent
141ae16656
commit
189da04438
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=44240
@ -1,13 +1,13 @@
|
|||||||
.\" $Id: fetch.1,v 1.27 1999/01/15 16:56:22 wollman Exp $
|
.\" $Id: fetch.1,v 1.28 1999/02/03 20:43:28 fenner Exp $
|
||||||
.Dd January 15, 1999
|
.Dd February 22, 1999
|
||||||
.Dt FETCH 1
|
.Dt FETCH 1
|
||||||
.Os FreeBSD 3.1
|
.Os FreeBSD 4.0
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
.Nm fetch
|
.Nm fetch
|
||||||
.Nd retrieve a file by Uniform Resource Locator
|
.Nd retrieve a file by Uniform Resource Locator
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm fetch
|
.Nm fetch
|
||||||
.Op Fl MPablmnpqrtv
|
.Op Fl AMPablmnpqrtv
|
||||||
.Op Fl S Ar size
|
.Op Fl S Ar size
|
||||||
.Op Fl T Ar timeout
|
.Op Fl T Ar timeout
|
||||||
.Op Fl o Ar file
|
.Op Fl o Ar file
|
||||||
@ -49,6 +49,10 @@ flags.
|
|||||||
.Pp
|
.Pp
|
||||||
The following options are available:
|
The following options are available:
|
||||||
.Bl -tag -width Fl
|
.Bl -tag -width Fl
|
||||||
|
.It Fl A
|
||||||
|
Do not automatically follow ``temporary'' (302) redirects. Some
|
||||||
|
broken Web sites will return a redirect instead of a not-found error
|
||||||
|
when the requested object does not exist.
|
||||||
.It Fl a
|
.It Fl a
|
||||||
Automatically retry the transfer upon soft failures.
|
Automatically retry the transfer upon soft failures.
|
||||||
.It Fl b
|
.It Fl b
|
||||||
@ -192,7 +196,7 @@ proxy client passes the remote username, host and port as the
|
|||||||
.Tn FTP
|
.Tn FTP
|
||||||
session's username, in the form
|
session's username, in the form
|
||||||
.Do Va remoteuser Ns Li \&@ Ns Va remotehost
|
.Do Va remoteuser Ns Li \&@ Ns Va remotehost
|
||||||
.Op Li \^@ Ns Va port
|
.Op Li \&@ Ns Va port
|
||||||
.Dc .
|
.Dc .
|
||||||
The
|
The
|
||||||
.Tn HTTP
|
.Tn HTTP
|
||||||
@ -254,7 +258,7 @@ or
|
|||||||
.Pp
|
.Pp
|
||||||
and
|
and
|
||||||
.Nm
|
.Nm
|
||||||
will prompt for the missing information if it is required. She might
|
will prompt for any missing information when it is required. She might
|
||||||
also specify a realm of
|
also specify a realm of
|
||||||
.Dq Li \&*
|
.Dq Li \&*
|
||||||
instead of
|
instead of
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $Id: http.c,v 1.24 1999/01/15 17:10:31 wollman Exp $
|
* $Id: http.c,v 1.25 1999/02/03 20:24:53 fenner Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -703,7 +703,6 @@ http_retrieve(struct fetch_state *fs)
|
|||||||
line[linelen - 1] = '\0'; /* turn line into a string */
|
line[linelen - 1] = '\0'; /* turn line into a string */
|
||||||
status = http_first_line(line);
|
status = http_first_line(line);
|
||||||
|
|
||||||
/* In the future, we might handle redirection and other responses. */
|
|
||||||
switch(status) {
|
switch(status) {
|
||||||
case 100: /* Continue */
|
case 100: /* Continue */
|
||||||
goto got100reply;
|
goto got100reply;
|
||||||
@ -715,17 +714,29 @@ http_retrieve(struct fetch_state *fs)
|
|||||||
/* can only happen when restarting */
|
/* can only happen when restarting */
|
||||||
break;
|
break;
|
||||||
case 301: /* Resource has moved permanently */
|
case 301: /* Resource has moved permanently */
|
||||||
if (!fs->fs_auto_retry)
|
if (fs->fs_auto_retry < 1)
|
||||||
errstr = safe_strdup(line);
|
errstr = safe_strdup(line);
|
||||||
else
|
else
|
||||||
redirection = 301;
|
redirection = 301;
|
||||||
break;
|
break;
|
||||||
case 302: /* Resource has moved temporarily */
|
case 302: /* Resource has moved temporarily */
|
||||||
/*
|
/*
|
||||||
* We don't test fs->fs_auto_retry here so that this
|
* We formerly didn't test fs->fs_auto_retry here,
|
||||||
* sort of redirection is transparent to the user.
|
* so that this sort of redirection would be transparent
|
||||||
|
* to the user. Unfortunately, there are a lot of idiots
|
||||||
|
* out there running Web sites, and some of them have
|
||||||
|
* decided to implement the following stupidity: rather
|
||||||
|
* than returning the correct `404 Not Found' error
|
||||||
|
* when something is not found, they instead return
|
||||||
|
* a 302 redirect, giving the erroneous impression that
|
||||||
|
* the requested resource actually exists. This
|
||||||
|
* breaks any client which expects a non-existent resource
|
||||||
|
* to elicit a 40x response. Grrr.
|
||||||
*/
|
*/
|
||||||
redirection = 302;
|
if (fs->fs_auto_retry < 0) /* -A flag */
|
||||||
|
errstr = safe_strdup(line);
|
||||||
|
else
|
||||||
|
redirection = 302;
|
||||||
break;
|
break;
|
||||||
case 304: /* Object is unmodified */
|
case 304: /* Object is unmodified */
|
||||||
if (fs->fs_mirror) {
|
if (fs->fs_mirror) {
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: main.c,v 1.48 1998/11/08 23:18:48 des Exp $ */
|
/* $Id: main.c,v 1.49 1998/12/08 13:00:49 cracauer Exp $ */
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
@ -49,10 +49,11 @@ static sigjmp_buf sigbuf;
|
|||||||
static int get(struct fetch_state *volatile fs);
|
static int get(struct fetch_state *volatile fs);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage()
|
usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s\n%s\n",
|
fprintf(stderr,
|
||||||
"usage: fetch [-DHILMNPRTVablmnpqrstv] [-o outputfile] [-S bytes]",
|
"usage: fetch [-ADHILMNPRTVablmnpqrstv] [-o outputfile] "
|
||||||
|
"[-S bytes]\n"
|
||||||
" [-f file -h host [-c dir] | URL]");
|
" [-f file -h host [-c dir] | URL]");
|
||||||
exit(EX_USAGE);
|
exit(EX_USAGE);
|
||||||
}
|
}
|
||||||
@ -75,8 +76,13 @@ main(int argc, char *const *argv)
|
|||||||
fs.fs_expectedsize = -1;
|
fs.fs_expectedsize = -1;
|
||||||
change_to_dir = file_to_get = hostname = 0;
|
change_to_dir = file_to_get = hostname = 0;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "abc:D:f:h:HIlLmMnNo:pPqRrS:stT:vV:")) != -1) {
|
#define OPT_STRING "Aabc:D:f:h:HIlLmMnNo:pPqRrS:stT:vV:"
|
||||||
|
while ((c = getopt(argc, argv, OPT_STRING)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
case 'A':
|
||||||
|
fs.fs_auto_retry = -1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'D': case 'H': case 'I': case 'L': case 'N': case 'V':
|
case 'D': case 'H': case 'I': case 'L': case 'N': case 'V':
|
||||||
break; /* ncftp compatibility */
|
break; /* ncftp compatibility */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user