Skip to content

Commit b8fcb46

Browse files
committed
Merge pull request scrapy#1804 from redapple/enable-test-dwnld-timeout
Re-enable HTTPS tests for download timeouts
2 parents 21da493 + c9e7813 commit b8fcb46

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

scrapy/core/downloader/handlers/http11.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def __init__(self, contextFactory=None, connectTimeout=10, bindAddress=None, poo
209209
self._pool = pool
210210
self._maxsize = maxsize
211211
self._warnsize = warnsize
212+
self._txresponse = None
212213

213214
def _get_agent(self, request, timeout):
214215
bindaddress = request.meta.get('bindaddress') or self._bindAddress
@@ -275,6 +276,11 @@ def _cb_timeout(self, result, request, url, timeout):
275276
if self._timeout_cl.active():
276277
self._timeout_cl.cancel()
277278
return result
279+
# needed for HTTPS requests, otherwise _ResponseReader doesn't
280+
# receive connectionLost()
281+
if self._txresponse:
282+
self._txresponse._transport.stopProducing()
283+
278284
raise TimeoutError("Getting %s took longer than %s seconds." % (url, timeout))
279285

280286
def _cb_latency(self, result, request, start_time):
@@ -310,6 +316,10 @@ def _cancel(_):
310316

311317
d = defer.Deferred(_cancel)
312318
txresponse.deliverBody(_ResponseReader(d, txresponse, request, maxsize, warnsize))
319+
320+
# save response for timeouts
321+
self._txresponse = txresponse
322+
313323
return d
314324

315325
def _cb_bodydone(self, result, request, url):

scrapy/core/downloader/webclient.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ def handleResponse(self, response):
8383

8484
def timeout(self):
8585
self.transport.loseConnection()
86+
87+
# transport cleanup needed for HTTPS connections
88+
if self.factory.url.startswith(b'https'):
89+
self.transport.stopProducing()
90+
8691
self.factory.noPage(\
8792
defer.TimeoutError("Getting %s took longer than %s seconds." % \
8893
(self.factory.url, self.factory.timeout)))

tests/test_downloader_handlers.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,17 +182,19 @@ def test_redirect_status_head(self):
182182
return d
183183

184184
@defer.inlineCallbacks
185-
def test_timeout_download_from_spider(self):
186-
if self.scheme == 'https':
187-
raise unittest.SkipTest(
188-
'test_timeout_download_from_spider skipped under https')
185+
def test_timeout_download_from_spider_nodata_rcvd(self):
186+
# client connects but no data is received
189187
spider = Spider('foo')
190188
meta = {'download_timeout': 0.2}
191-
# client connects but no data is received
192189
request = Request(self.getURL('wait'), meta=meta)
193190
d = self.download_request(request, spider)
194191
yield self.assertFailure(d, defer.TimeoutError, error.TimeoutError)
192+
193+
@defer.inlineCallbacks
194+
def test_timeout_download_from_spider_server_hangs(self):
195195
# client connects, server send headers and some body bytes but hangs
196+
spider = Spider('foo')
197+
meta = {'download_timeout': 0.2}
196198
request = Request(self.getURL('hang-after-headers'), meta=meta)
197199
d = self.download_request(request, spider)
198200
yield self.assertFailure(d, defer.TimeoutError, error.TimeoutError)

0 commit comments

Comments
 (0)