From 0a9920b11cf1e0cfad654944e60a96a50478c5b7 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 23 Jul 2020 13:08:20 +0900 Subject: [PATCH] =?UTF-8?q?=E3=81=95=E3=81=99=E3=81=8C=E3=81=ABService?= =?UTF-8?q?=E3=81=8B=E3=82=89HttpException=E3=81=AF=E9=9B=91=E3=81=99?= =?UTF-8?q?=E3=81=8E=E3=81=9F=E3=81=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/CardController.php | 7 ++++- app/Listeners/LinkCollector.php | 3 ++ app/MetadataResolver/DeniedHostException.php | 30 ++++++++++++++++++++ app/Services/MetadataResolveService.php | 3 +- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 app/MetadataResolver/DeniedHostException.php diff --git a/app/Http/Controllers/Api/CardController.php b/app/Http/Controllers/Api/CardController.php index 8cdf980..38f56f7 100644 --- a/app/Http/Controllers/Api/CardController.php +++ b/app/Http/Controllers/Api/CardController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api; +use App\MetadataResolver\DeniedHostException; use App\Services\MetadataResolveService; use Illuminate\Http\Request; @@ -13,7 +14,11 @@ class CardController 'url:required|url' ]); - $metadata = $service->execute($request->input('url')); + try { + $metadata = $service->execute($request->input('url')); + } catch (DeniedHostException $e) { + abort(403, $e->getMessage()); + } $metadata->load('tags'); $response = response($metadata); diff --git a/app/Listeners/LinkCollector.php b/app/Listeners/LinkCollector.php index 6c10e21..d3a1b37 100644 --- a/app/Listeners/LinkCollector.php +++ b/app/Listeners/LinkCollector.php @@ -3,6 +3,7 @@ namespace App\Listeners; use App\Events\LinkDiscovered; +use App\MetadataResolver\DeniedHostException; use App\Services\MetadataResolveService; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; @@ -32,6 +33,8 @@ class LinkCollector { try { $this->metadataResolveService->execute($event->url); + } catch (DeniedHostException $e) { + // ignored } catch (\Exception $e) { // 今のところこのイベントは同期実行されるので、上流をクラッシュさせないために雑catchする report($e); diff --git a/app/MetadataResolver/DeniedHostException.php b/app/MetadataResolver/DeniedHostException.php new file mode 100644 index 0000000..dac13b2 --- /dev/null +++ b/app/MetadataResolver/DeniedHostException.php @@ -0,0 +1,30 @@ +url = $url; + } + + public function getUrl(): string + { + return $this->url; + } + + public function getHost(): string + { + return parse_url($this->url, PHP_URL_HOST); + } +} diff --git a/app/Services/MetadataResolveService.php b/app/Services/MetadataResolveService.php index 55372bd..e622813 100644 --- a/app/Services/MetadataResolveService.php +++ b/app/Services/MetadataResolveService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Metadata; +use App\MetadataResolver\DeniedHostException; use App\MetadataResolver\MetadataResolver; use App\Tag; use App\Utilities\Formatter; @@ -29,7 +30,7 @@ class MetadataResolveService // 自分自身は解決しない if (parse_url($url, PHP_URL_HOST) === parse_url(config('app.url'), PHP_URL_HOST)) { - abort(403); + throw new DeniedHostException($url); } // 無かったら取得