Kaydet (Commit) 29ff461c authored tarafından Andrew M. Kuchling's avatar Andrew M. Kuchling

[Patch #1587139 by kxroberto] Protect lock acquisition/release with

try...finally to ensure the lock is always released.  This could use
the 'with' statement, but the patch uses 'finally'.

2.5 backport candidate.
üst c911e916
...@@ -1316,26 +1316,28 @@ class CookieJar: ...@@ -1316,26 +1316,28 @@ class CookieJar:
""" """
_debug("add_cookie_header") _debug("add_cookie_header")
self._cookies_lock.acquire() self._cookies_lock.acquire()
try:
self._policy._now = self._now = int(time.time()) self._policy._now = self._now = int(time.time())
cookies = self._cookies_for_request(request)
attrs = self._cookie_attrs(cookies) cookies = self._cookies_for_request(request)
if attrs:
if not request.has_header("Cookie"):
request.add_unredirected_header(
"Cookie", "; ".join(attrs))
# if necessary, advertise that we know RFC 2965 attrs = self._cookie_attrs(cookies)
if (self._policy.rfc2965 and not self._policy.hide_cookie2 and if attrs:
not request.has_header("Cookie2")): if not request.has_header("Cookie"):
for cookie in cookies: request.add_unredirected_header(
if cookie.version != 1: "Cookie", "; ".join(attrs))
request.add_unredirected_header("Cookie2", '$Version="1"')
break
self._cookies_lock.release() # if necessary, advertise that we know RFC 2965
if (self._policy.rfc2965 and not self._policy.hide_cookie2 and
not request.has_header("Cookie2")):
for cookie in cookies:
if cookie.version != 1:
request.add_unredirected_header("Cookie2", '$Version="1"')
break
finally:
self._cookies_lock.release()
self.clear_expired_cookies() self.clear_expired_cookies()
...@@ -1602,12 +1604,15 @@ class CookieJar: ...@@ -1602,12 +1604,15 @@ class CookieJar:
def set_cookie_if_ok(self, cookie, request): def set_cookie_if_ok(self, cookie, request):
"""Set a cookie if policy says it's OK to do so.""" """Set a cookie if policy says it's OK to do so."""
self._cookies_lock.acquire() self._cookies_lock.acquire()
self._policy._now = self._now = int(time.time()) try:
self._policy._now = self._now = int(time.time())
if self._policy.set_ok(cookie, request): if self._policy.set_ok(cookie, request):
self.set_cookie(cookie) self.set_cookie(cookie)
self._cookies_lock.release() finally:
self._cookies_lock.release()
def set_cookie(self, cookie): def set_cookie(self, cookie):
"""Set a cookie, without checking whether or not it should be set.""" """Set a cookie, without checking whether or not it should be set."""
...@@ -1626,13 +1631,15 @@ class CookieJar: ...@@ -1626,13 +1631,15 @@ class CookieJar:
"""Extract cookies from response, where allowable given the request.""" """Extract cookies from response, where allowable given the request."""
_debug("extract_cookies: %s", response.info()) _debug("extract_cookies: %s", response.info())
self._cookies_lock.acquire() self._cookies_lock.acquire()
self._policy._now = self._now = int(time.time()) try:
self._policy._now = self._now = int(time.time())
for cookie in self.make_cookies(response, request): for cookie in self.make_cookies(response, request):
if self._policy.set_ok(cookie, request): if self._policy.set_ok(cookie, request):
_debug(" setting cookie: %s", cookie) _debug(" setting cookie: %s", cookie)
self.set_cookie(cookie) self.set_cookie(cookie)
self._cookies_lock.release() finally:
self._cookies_lock.release()
def clear(self, domain=None, path=None, name=None): def clear(self, domain=None, path=None, name=None):
"""Clear some cookies. """Clear some cookies.
...@@ -1669,10 +1676,12 @@ class CookieJar: ...@@ -1669,10 +1676,12 @@ class CookieJar:
""" """
self._cookies_lock.acquire() self._cookies_lock.acquire()
for cookie in self: try:
if cookie.discard: for cookie in self:
self.clear(cookie.domain, cookie.path, cookie.name) if cookie.discard:
self._cookies_lock.release() self.clear(cookie.domain, cookie.path, cookie.name)
finally:
self._cookies_lock.release()
def clear_expired_cookies(self): def clear_expired_cookies(self):
"""Discard all expired cookies. """Discard all expired cookies.
...@@ -1685,11 +1694,13 @@ class CookieJar: ...@@ -1685,11 +1694,13 @@ class CookieJar:
""" """
self._cookies_lock.acquire() self._cookies_lock.acquire()
now = time.time() try:
for cookie in self: now = time.time()
if cookie.is_expired(now): for cookie in self:
self.clear(cookie.domain, cookie.path, cookie.name) if cookie.is_expired(now):
self._cookies_lock.release() self.clear(cookie.domain, cookie.path, cookie.name)
finally:
self._cookies_lock.release()
def __iter__(self): def __iter__(self):
return deepvalues(self._cookies) return deepvalues(self._cookies)
...@@ -1761,16 +1772,18 @@ class FileCookieJar(CookieJar): ...@@ -1761,16 +1772,18 @@ class FileCookieJar(CookieJar):
else: raise ValueError(MISSING_FILENAME_TEXT) else: raise ValueError(MISSING_FILENAME_TEXT)
self._cookies_lock.acquire() self._cookies_lock.acquire()
old_state = copy.deepcopy(self._cookies)
self._cookies = {}
try: try:
self.load(filename, ignore_discard, ignore_expires)
except (LoadError, IOError):
self._cookies = old_state
raise
self._cookies_lock.release() old_state = copy.deepcopy(self._cookies)
self._cookies = {}
try:
self.load(filename, ignore_discard, ignore_expires)
except (LoadError, IOError):
self._cookies = old_state
raise
finally:
self._cookies_lock.release()
from _LWPCookieJar import LWPCookieJar, lwp_cookie_str from _LWPCookieJar import LWPCookieJar, lwp_cookie_str
from _MozillaCookieJar import MozillaCookieJar from _MozillaCookieJar import MozillaCookieJar
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment