wget support for no_proxy env var

dann frazier dannf at dannf.org
Mon Jun 18 21:23:20 UTC 2007


hey,
 The following patch adds support for the no_proxy envvar to the wget
applet. Most of the code is lifted directly from GNU's wget source
(with a few simplifications). This is my first contribution to
busybox and a rare attempt at C for me - let me know if I should
reduce wrap this code in a config option, etc.

Index: networking/wget.c
===================================================================
--- networking/wget.c	(revision 18847)
+++ networking/wget.c	(working copy)
@@ -83,6 +83,66 @@
 }
 #endif
 
+bool sufmatch (char **list, const char *what);
+bool sufmatch (char **list, const char *what)
+{
+	int i, j, k, lw;
+
+	lw = strlen (what);
+	for (i = 0; list[i]; i++) {
+		for (j = strlen (list[i]), k = lw; j >= 0 && k >= 0; j--, k--) 
+			if (tolower (list[i][j]) != tolower (what[k]))
+				break;
+		/* The domain must be first to reach to beginning.  */
+		if (j == -1)
+			return true;
+	}
+	return false;
+}
+
+char *strdupdelim (const char *beg, const char *end);
+char *strdupdelim (const char *beg, const char *end)
+{
+	char *res = xmalloc (end - beg + 1);
+	memcpy (res, beg, end - beg);
+	res[end - beg] = '\0';
+	return res;
+}
+
+/* Parse a string containing comma-separated elements, and return a
+   vector of char pointers with the elements.  Spaces following the
+   commas are ignored.  */
+char **sepstring (const char *s);
+char **sepstring (const char *s)
+{
+	char **res;
+	const char *p;
+	int i = 0;
+
+	if (!s || !*s)
+		return NULL;
+	res = NULL;
+	p = s;
+	while (*s) {
+		if (*s == ',') {
+			res = xrealloc (res, (i + 2) * sizeof (char *));
+			res[i] = strdupdelim (p, s);
+			res[++i] = NULL;
+			++s;
+			/* Skip the blanks following the ','.  */
+			while (*s == ' ')
+				++s;
+				p = s;
+		} else {
+			++s;
+		}
+	}
+	res = xrealloc (res, (i + 2) * sizeof (char *));
+	res[i] = strdupdelim (p, s);
+	res[i + 1] = NULL;
+	return res;
+}
+
 int wget_main(int argc, char **argv);
 int wget_main(int argc, char **argv)
 {
@@ -107,6 +167,8 @@
 	bool got_clen = 0;               /* got content-length: from server  */
 	int output_fd = -1;
 	bool use_proxy = 1;              /* Use proxies if env vars are set  */
+	char *tmp;
+	char **no_proxy = NULL;
 	const char *proxy_flag = "on";  /* Use proxies if env vars are set  */
 	const char *user_agent = "Wget";/* "User-Agent" header field        */
 	static const char * const keywords[] = {
@@ -174,6 +236,13 @@
 	server.host = target.host;
 	server.port = target.port;
 
+	tmp = getenv ("no_proxy");
+	if (tmp)
+		no_proxy = sepstring(tmp);
+
+	if (no_proxy && sufmatch(no_proxy, server.host))
+		use_proxy = 0;
+
 	/* Use the proxy if necessary */
 	if (use_proxy) {
 		proxy = getenv(target.is_ftp ? "ftp_proxy" : "http_proxy");


-- 
dann frazier




More information about the busybox mailing list