From 49bc272b51cf1abc350e0ae93a13568441d9eba0 Mon Sep 17 00:00:00 2001 From: DogFortune Date: Mon, 22 Dec 2025 16:48:08 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=E6=99=82=E3=81=ABNG=E3=81=AB=E3=81=AA=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=A6=E3=80=81=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E3=81=A7=E8=90=BD=E3=81=A1=E3=81=AA=E3=81=84=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20refs=20#14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/linkstat/analyzer.py | 6 ++++-- tests/test_analyzer.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/linkstat/analyzer.py b/src/linkstat/analyzer.py index 9a6fe65..1c9738b 100644 --- a/src/linkstat/analyzer.py +++ b/src/linkstat/analyzer.py @@ -38,14 +38,16 @@ def request(url: str) -> AnalyzeResponse: :rtype: AnalyzeResponse """ try: - res = urlopen(url, timeout=3) - return AnalyzeResponse(Result.OK, res.code, res.url, None) + with urlopen(url, timeout=3) as res: + return AnalyzeResponse(Result.OK, res.code, res.url, None) except HTTPError as e: # アクセスできて400や500系が来た時はこっち return AnalyzeResponse(Result.NG, e.code, url, e.reason) except URLError as e: # そもそもアクセスすらできなかった場合はこっち return AnalyzeResponse(Result.NG, None, url, e.reason) + except TimeoutError: + return AnalyzeResponse(Result.NG, None, url, "Timeout") def check_links(links: dict[str, URLInfo]) -> list[ReportData]: diff --git a/tests/test_analyzer.py b/tests/test_analyzer.py index 3faad4d..8aacd4a 100644 --- a/tests/test_analyzer.py +++ b/tests/test_analyzer.py @@ -107,3 +107,19 @@ def test_extract_link(): assert len(duplicated_link_list) == 2 assert duplicated_link_list[0].url == duplicated_link_list[1].url assert duplicated_link_list[0].url == "https://example.com" + + +class TestInValid: + @pytest.mark.usefixtures("use_mock_server") + def test_request_timeout(self): + """タイムアウトの場合、NGになる事""" + + url = "https://httpbin.org/delay/10" + + res = analyzer.request(url) + + assert type(res) is analyzer.AnalyzeResponse + assert res.result == "NG" + assert res.code is None + assert res.url == url + assert res.reason == "Timeout"