int wget_main(int argc, char **argv)
{
- FILE *sfp; /* socket to web server */
- char *uri_host, *uri_path; /* parsed from command line url */
- int uri_port;
- char *s, buf[512];
int n;
+ char *proxy, *proxy_host;
+ int uri_port, proxy_port;
+ char *s, buf[512];
+ struct stat sbuf;
+ FILE *sfp; /* socket to web server */
+ char *uri_host, *uri_path; /* parsed from command line url */
char *fname_out = NULL; /* where to direct output (-O) */
int do_continue = 0; /* continue a prev transfer (-c) */
long beg_range = 0L; /* range at which continue begins */
int got_clen = 0; /* got content-length: from server */
- FILE *output; /* socket to web server */
+ FILE *output; /* socket to web server */
+ int quiet_flag = FALSE; /* Be verry, verry quiet... */
/*
* Crack command line.
*/
- while ((n = getopt(argc, argv, "cO:")) != EOF) {
+ while ((n = getopt(argc, argv, "cqO:")) != EOF) {
switch (n) {
case 'c':
++do_continue;
break;
+ case 'q':
+ quiet_flag = TRUE;
+ break;
case 'O':
/* can't set fname_out to NULL if outputting to stdout, because
* this gets interpreted as the auto-gen output filename
if (argc - optind != 1)
usage(wget_usage);
+ if (do_continue && !fname_out)
+ error_msg_and_die("cannot specify continue (-c) without a filename (-O)\n");
+
+ /*
+ * Use the proxy if necessary.
+ */
+ if ((proxy = getenv("http_proxy")) != NULL) {
+ proxy = xstrdup(proxy);
+ parse_url(proxy, &proxy_host, &proxy_port, &uri_path);
+ parse_url(argv[optind], &uri_host, &uri_port, &uri_path);
+ } else {
+ /*
+ * Parse url into components.
+ */
+ parse_url(argv[optind], &uri_host, &uri_port, &uri_path);
+ proxy_host=uri_host;
+ proxy_port=uri_port;
+ }
+
/* Guess an output filename */
if (!fname_out) {
fname_out =
#ifdef BB_FEATURE_STATUSBAR
curfile =
#endif
- get_last_path_component(argv[optind]);
+ get_last_path_component(uri_path);
+ if (fname_out==NULL || strlen(fname_out)<1) {
+ fname_out =
+#ifdef BB_FEATURE_STATUSBAR
+ curfile =
+#endif
+ "index.html";
+ }
#ifdef BB_FEATURE_STATUSBAR
} else {
curfile=argv[optind];
}
- if (do_continue && !fname_out)
- fatalError("cannot specify continue (-c) without a filename (-O)\n");
- /*
- * Parse url into components.
- */
- parse_url(argv[optind], &uri_host, &uri_port, &uri_path);
-
/*
* Open socket to server.
*/
- sfp = open_socket(uri_host, uri_port);
+ sfp = open_socket(proxy_host, proxy_port);
+
+ /* Make the assumption that if the file already exists
+ * on disk that the intention is to continue downloading
+ * a previously aborted download -Erik */
+ if (stat(fname_out, &sbuf) == 0) {
+ ++do_continue;
+ }
/*
- * Open the output stream.
+ * Open the output file stream.
*/
if (fname_out != (char *)1) {
if ( (output=fopen(fname_out, (do_continue ? "a" : "w")))
== NULL)
- fatalPerror("fopen(%s)", fname_out);
+ perror_msg_and_die("fopen(%s)", fname_out);
} else {
output = stdout;
}
* Determine where to start transfer.
*/
if (do_continue) {
- struct stat sbuf;
if (fstat(fileno(output), &sbuf) < 0)
- fatalError("fstat()");
+ error_msg_and_die("fstat()");
if (sbuf.st_size > 0)
beg_range = sbuf.st_size;
else
/*
* Send HTTP request.
*/
- fprintf(sfp, "GET %s HTTP/1.1\r\nHost: %s\r\n", uri_path, uri_host);
+ fprintf(sfp, "GET http://%s:%d/%s HTTP/1.1\r\n",
+ uri_host, uri_port, uri_path);
+ fprintf(sfp, "Host: %s\r\nUser-Agent: Wget\r\n", uri_host);
if (do_continue)
fprintf(sfp, "Range: bytes=%ld-\r\n", beg_range);
- fputs("Connection: close\r\n\r\n", sfp);
+ fprintf(sfp,"Connection: close\r\n\r\n");
/*
* Retrieve HTTP response line and check for "200" status code.
*/
- if (fgets(buf, sizeof(buf), sfp) == NULL)
- fatalError("no response from server\n");
+ if (fgets(buf, sizeof(buf), sfp) == NULL) {
+ error_msg_and_die("no response from server\n");
+ }
for (s = buf ; *s != '\0' && !isspace(*s) ; ++s)
;
for ( ; isspace(*s) ; ++s)
case 200:
if (!do_continue)
break;
- fatalError("server does not support ranges\n");
+ error_msg_and_die("server does not support ranges\n");
case 206:
if (do_continue)
break;
/*FALLTHRU*/
default:
- fatalError("server returned error: %s", buf);
+ error_msg_and_die("server returned error: %s", buf);
}
/*
continue;
}
if (strcmp(buf, "transfer-encoding") == 0) {
- fatalError("server wants to do %s transfer encoding\n", s);
+ error_msg_and_die("server wants to do %s transfer encoding\n", s);
continue;
}
}
*/
#ifdef BB_FEATURE_STATUSBAR
statbytes=0;
- progressmeter(-1);
+ if (quiet_flag==FALSE)
+ progressmeter(-1);
#endif
while (filesize > 0 && (n = fread(buf, 1, sizeof(buf), sfp)) > 0) {
fwrite(buf, 1, n, output);
#ifdef BB_FEATURE_STATUSBAR
statbytes+=n;
- progressmeter(1);
+ if (quiet_flag==FALSE)
+ progressmeter(1);
#endif
if (got_clen)
filesize -= n;
}
if (n == 0 && ferror(sfp))
- fatalPerror("network read error");
+ perror_msg_and_die("network read error");
exit(0);
}
*uri_port = 80;
if (strncmp(url, "http://", 7) != 0)
- fatalError("not an http url: %s\n", url);
+ error_msg_and_die("not an http url: %s\n", url);
/* pull the host portion to the front of the buffer */
for (s = url, h = url+7 ; *h != '/' && *h != 0; ++h) {
*uri_host = url;
*uri_path = h;
+
+ if (!strcmp( *uri_host, *uri_path))
+ *uri_path = defaultpath;
}
memzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
if ((hp = (struct hostent *) gethostbyname(host)) == NULL)
- fatalError("cannot resolve %s\n", host);
+ error_msg_and_die("cannot resolve %s\n", host);
memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length);
sin.sin_port = htons(port);
* Get the server onto a stdio stream.
*/
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- fatalPerror("socket()");
+ perror_msg_and_die("socket()");
if (connect(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0)
- fatalPerror("connect(%s)", host);
+ perror_msg_and_die("connect(%s)", host);
if ((fp = fdopen(fd, "r+")) == NULL)
- fatalPerror("fdopen()");
+ perror_msg_and_die("fdopen()");
return fp;
}
/* verify we are at the end of the header name */
if (*s != ':')
- fatalError("bad header line: %s\n", buf);
+ error_msg_and_die("bad header line: %s\n", buf);
/* locate the start of the header value */
for (*s++ = '\0' ; *s == ' ' || *s == '\t' ; ++s)
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: wget.c,v 1.9 2000/12/07 03:55:35 tausq Exp $
+ * $Id: wget.c,v 1.13 2000/12/09 16:55:35 andersen Exp $
*/