[Rd] Changing HTTP proxy configurations at run time

Moritz Gerstung mg14 at sanger.ac.uk
Thu Apr 4 11:56:55 CEST 2013

DeaR developers,

I was recently moving with my laptop between two environments with and without a HTTP proxy server. As the internal proxy configuration is read only once from the environment variables http_proxy/HTTP_PROXY at the first call of download.file(), the proxy configurations couldn't be adjusted at a later stage. (See also the comment in ?download.file). This caused some frustration as I wasn't able to use http functionality in a running R session after moving to an environment with a different/no proxy server.

After some digging I found that this behaviour was caused by RxmlNanoHTTPInit() in src/modules/internet/nanohttp.c, which after its first call refuses to reinitialise the proxy configuration. It does so by setting a variable 'initialized' to 1, and checking whether the string 'proxy' is non-NULL.

I have made a small modification to have RxmlNanoHTTPInit() ignore these variables and to read in the proxy configuration at each call.

$ svn diff
Index: src/modules/internet/nanohttp.c
--- src/modules/internet/nanohttp.c	(revision 62488)
+++ src/modules/internet/nanohttp.c	(working copy)
@@ -255,15 +255,12 @@
     WSADATA wsaData;

-    if (initialized)
-	return;
 #ifdef _WINSOCKAPI_
     if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)

-    if (proxy == NULL) {
+    proxy = NULL;
 	proxyPort = 80;
 	env = getenv("no_proxy");
 	if (env && ((env[0] == '*') && (env[1] == 0)))
@@ -287,7 +284,7 @@
 	    proxyUser = xmlMemStrdup(env);
-    }
     initialized = 1;

This works fine for me (on a Mac) and I can simply use Sys.setenv(http_proxy=) to adjust the proxy server at run time.

I think this doesn't really cause overhead as the number of calls do download.file() is typically small and parsing the environment variables is simple. On the other hand, if a user alters the proxy environment variables, he/she probably does so for a reason. Googling around I found a few posts of R users demanding this.

A cleaner solution would of course be to write a function that resets the internal proxy configuration, but this would be a bit of an effort to make it user visible.

What are your thoughts?

Best wishes,


 The Wellcome Trust Sanger Institute is operated by Genome Research 
 Limited, a charity registered in England with number 1021457 and a 
 company registered in England with number 2742969, whose registered 
 office is 215 Euston Road, London, NW1 2BE.

More information about the R-devel mailing list