[#8334] set a global socket default timeout for oembed usage
diff --git a/Allura/allura/lib/macro.py b/Allura/allura/lib/macro.py
index 6746a48..abb4776 100644
--- a/Allura/allura/lib/macro.py
+++ b/Allura/allura/lib/macro.py
@@ -31,6 +31,7 @@
 from paste.deploy.converters import asint
 from bs4 import BeautifulSoup
 
+from allura.lib.utils import socket_default_timeout
 from . import helpers as h
 from . import security
 
@@ -452,10 +453,14 @@
                                       'http://*.youtube-nocookie.com/*', 'https://*.youtube-nocookie.com/*',
                                       ])
     consumer.addEndpoint(endpoint)
-    try:
-        html = consumer.embed(url)['html']
-    except oembed.OEmbedNoEndpoint:
-        html = None
+
+    # workaround for https://github.com/abarmat/python-oembed/pull/9 not being implemented yet
+    with socket_default_timeout(5):
+
+        try:
+            html = consumer.embed(url)['html']
+        except oembed.OEmbedNoEndpoint:
+            html = None
 
     if html:
         # youtube has a trailing ")" at the moment
diff --git a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
index 0203f7a..fdf0340 100644
--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -33,6 +33,7 @@
 from urlparse import urlparse
 import urllib
 import types
+import socket
 
 import tg
 import emoji
@@ -862,3 +863,13 @@
 
 def close_ipv4_addrs(ip1, ip2):
     return ip1.split('.')[0:3] == ip2.split('.')[0:3]
+
+
+@contextmanager
+def socket_default_timeout(timeout):
+    orig_timeout = socket.getdefaulttimeout()
+    socket.setdefaulttimeout(timeout)
+    try:
+        yield
+    finally:
+        socket.setdefaulttimeout(orig_timeout)
\ No newline at end of file