Add test.test_support.transient_internet .  Returns a context manager that
nests test.test_support.TransientResource context managers that capture
exceptions raised when the Internet connection is flaky.

Initially using in test_socket_ssl but should probably be expanded to cover any
test that should not raise the captured exceptions if the Internet connection
works.
diff --git a/Lib/test/test_socket_ssl.py b/Lib/test/test_socket_ssl.py
index 8fb7e4c..1f2b9d1 100644
--- a/Lib/test/test_socket_ssl.py
+++ b/Lib/test/test_socket_ssl.py
@@ -27,7 +27,7 @@
         print "didn't raise TypeError"
     socket.RAND_add("this is a random string", 75.0)
 
-    with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT):
+    with test_support.transient_internet():
         f = urllib.urlopen('https://sf.net')
     buf = f.read()
     f.close()
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index 2e47aed..880e8e8 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -3,7 +3,9 @@
 if __name__ != 'test.test_support':
     raise ImportError, 'test_support must be imported from the test package'
 
-from contextlib import contextmanager
+import contextlib
+import errno
+import socket
 import sys
 import warnings
 
@@ -271,7 +273,7 @@
     fn, _ = urllib.urlretrieve(url, filename)
     return open(fn)
 
-@contextmanager
+@contextlib.contextmanager
 def guard_warnings_filter():
     """Guard the warnings filter from being permanently changed."""
     original_filters = warnings.filters[:]
@@ -338,6 +340,15 @@
                 raise ResourceDenied("an optional resource is not available")
 
 
+def transient_internet():
+    """Return a context manager that raises ResourceDenied when various issues
+    with the Internet connection manifest themselves as exceptions."""
+    time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
+    socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
+    ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
+    return contextlib.nested(time_out, peer_reset, ioerror_peer_reset)
+
+
 #=======================================================================
 # Decorator for running a function in a different locale, correctly resetting
 # it afterwards.