Skip to content

Commit 5b8df42

Browse files
timobrembeckclaudep
authored andcommitted
Fix SSL status of unreachable domains
1 parent 800beea commit 5b8df42

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
Unreleased
22

3+
* Fix SSL status of unreachable domains (Timo Ludwig, #184)
34
* Fix URL message for internal server errorrs (Timo Ludwig, #182)
45
* Add support for Django 4.2
56
* Remove support for Django 4.0

linkcheck/models.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,18 +387,17 @@ def check_external(self, external_recheck_interval=EXTERNAL_RECHECK_INTERVAL):
387387
}
388388
try:
389389
try:
390-
# If no exceptions occur, the SSL certificate is valid
391-
if self.external_url.startswith('https://'):
392-
self.ssl_status = True
393390
# At first try a HEAD request
394391
fetch = requests.head
395392
response = fetch(self.external_url, **request_params)
393+
# If no exceptions occur, the SSL certificate is valid
394+
if self.external_url.startswith('https://'):
395+
self.ssl_status = True
396396
except ConnectionError as e:
397397
# This error could also be caused by an incomplete root certificate bundle,
398398
# so let's retry without verifying the certificate
399399
if "unable to get local issuer certificate" in str(e):
400400
request_params['verify'] = False
401-
self.ssl_status = None
402401
response = fetch(self.external_url, **request_params)
403402
else:
404403
# Re-raise exception if it's definitely not a false positive

linkcheck/tests/test_linkcheck.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,23 @@ def test_external_check_404_incomplete_cert(self):
436436
self.assertEqual(uv.redirect_to, '')
437437
self.assertEqual(uv.type, 'external')
438438

439+
def test_external_check_unreachable(self):
440+
uv = Url(url='https://invalid')
441+
uv.check_url()
442+
self.assertEqual(uv.status, False)
443+
for attr in [uv.message, uv.get_message, uv.error_message]:
444+
self.assertEqual(
445+
attr,
446+
'New Connection Error: Failed to establish a new connection: [Errno -2] Name or service not known',
447+
)
448+
self.assertEqual(uv.anchor_message, '')
449+
self.assertEqual(uv.ssl_status, None)
450+
self.assertEqual(uv.ssl_message, 'SSL certificate could not be checked')
451+
self.assertEqual(uv.get_status_code_display(), None)
452+
self.assertEqual(uv.get_redirect_status_code_display(), None)
453+
self.assertEqual(uv.redirect_to, '')
454+
self.assertEqual(uv.type, 'external')
455+
439456
def test_external_check_200_utf8(self):
440457
uv = Url(url=f"{self.live_server_url}/http/200/r%C3%BCckmeldung/")
441458
uv.check_url()

0 commit comments

Comments
 (0)