From: Ben Darnell Date: Thu, 26 Aug 2010 18:09:56 +0000 (-0700) Subject: Set pycurl.NOSIGNAL when multiple threads are detected. X-Git-Tag: v1.1.0~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=318ec31c3d164361e99eac654a41eeb95f37f6be;p=thirdparty%2Ftornado.git Set pycurl.NOSIGNAL when multiple threads are detected. Closes #121. --- diff --git a/tornado/httpclient.py b/tornado/httpclient.py index 8d0402c97..cfa0b4c60 100644 --- a/tornado/httpclient.py +++ b/tornado/httpclient.py @@ -27,6 +27,7 @@ import httplib import logging import pycurl import sys +import threading import time import weakref @@ -543,7 +544,7 @@ def _curl_setup_request(curl, request, buffer, headers): curl.setopt(pycurl.PROXY, request.proxy_host) curl.setopt(pycurl.PROXYPORT, request.proxy_port) if request.proxy_username: - credentials = '%s:%s' % (request.proxy_username, + credentials = '%s:%s' % (request.proxy_username, request.proxy_password) curl.setopt(pycurl.PROXYUSERPWD, credentials) @@ -588,6 +589,16 @@ def _curl_setup_request(curl, request, buffer, headers): else: curl.unsetopt(pycurl.USERPWD) logging.info("%s %s", request.method, request.url) + if threading.active_count() > 1: + # libcurl/pycurl is not thread-safe by default. When multiple threads + # are used, signals should be disabled. This has the side effect + # of disabling DNS timeouts in some environments (when libcurl is + # not linked against ares), so we don't do it when there is only one + # thread. Applications that use many short-lived threads may need + # to set NOSIGNAL manually in a prepare_curl_callback since + # there may not be any other threads running at the time we call + # threading.active_count. + curl.setopt(pycurl.NOSIGNAL, 1) if request.prepare_curl_callback is not None: request.prepare_curl_callback(curl)