[#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