Skip to content

Commit 262125a

Browse files
author
Illia Sakovich
committed
wip
1 parent 4cd8aef commit 262125a

File tree

9 files changed

+91
-31
lines changed

9 files changed

+91
-31
lines changed

config/dynamic-renderer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
'rendering_criteria' => [
88
// \Coderello\DynamicRenderer\RenderingCriteria\IsProduction::class,
9+
\Coderello\DynamicRenderer\RenderingCriteria\IsNotRenderer::class,
910
\Coderello\DynamicRenderer\RenderingCriteria\IsCrawler::class,
11+
\Coderello\DynamicRenderer\RenderingCriteria\IsNotStaticFilePath::class,
1012
],
1113

1214
'driver' => env('DYNAMIC_RENDERER_DRIVER', 'prerender'),

src/Facades/DynamicRenderer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44

55
use Coderello\DynamicRenderer\Managers\DynamicRendererManager;
66
use Coderello\DynamicRenderer\Support\RenderingResult;
7+
use Illuminate\Http\Request;
78
use Illuminate\Support\Facades\Facade;
89

910
/**
1011
* @method static RenderingResult render(string $url)
12+
* @method static bool isRendering(Request $request)
1113
*
1214
* @see DynamicRendererManager
1315
*/

src/Managers/DynamicRendererManager.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Coderello\DynamicRenderer\Renderers\Renderer;
77
use Coderello\DynamicRenderer\Renderers\RendertronRenderer;
88
use Coderello\DynamicRenderer\Support\RenderingResult;
9+
use Illuminate\Http\Request;
910
use Illuminate\Support\Facades\Config;
1011
use Illuminate\Support\Manager;
1112

@@ -56,4 +57,12 @@ public function getUserAgentPatterns(): array
5657

5758
return $driver->getUserAgentPatterns();
5859
}
60+
61+
public function isRendering(Request $request): bool
62+
{
63+
/** @var Renderer $driver */
64+
$driver = $this->driver();
65+
66+
return $driver->isRendering($request);
67+
}
5968
}

src/Renderers/PrerenderRenderer.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Coderello\DynamicRenderer\Support\RenderingResult;
66
use GuzzleHttp\Client;
77
use GuzzleHttp\RequestOptions;
8+
use Illuminate\Http\Request;
89
use Illuminate\Support\Str;
910

1011
class PrerenderRenderer implements Renderer
@@ -31,4 +32,9 @@ public function render(string $url): RenderingResult
3132
->setContent($response->getBody()->getContents())
3233
->setStatusCode($response->getStatusCode());
3334
}
35+
36+
public function isRendering(Request $request): bool
37+
{
38+
return Str::is('*Prerender*', $request->userAgent());
39+
}
3440
}

src/Renderers/Renderer.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
namespace Coderello\DynamicRenderer\Renderers;
44

55
use Coderello\DynamicRenderer\Support\RenderingResult;
6+
use Illuminate\Http\Request;
67

78
interface Renderer
89
{
910
public function render(string $url): RenderingResult;
11+
12+
public function isRendering(Request $request): bool;
1013
}

src/Renderers/RendertronRenderer.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Coderello\DynamicRenderer\Support\RenderingResult;
66
use GuzzleHttp\Client;
77
use GuzzleHttp\RequestOptions;
8+
use Illuminate\Http\Request;
89
use Illuminate\Support\Str;
910

1011
class RendertronRenderer implements Renderer
@@ -31,4 +32,9 @@ public function render(string $url): RenderingResult
3132
->setContent($response->getBody()->getContents())
3233
->setStatusCode($response->getStatusCode());
3334
}
35+
36+
public function isRendering(Request $request): bool
37+
{
38+
return Str::contains($request->userAgent(), 'HeadlessChrome');
39+
}
3440
}

src/RenderingCriteria/IsCrawler.php

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,36 +21,8 @@ public function __construct(CrawlerDetect $crawlerDetect)
2121

2222
public function matches(Request $request): bool
2323
{
24-
$userAgent = strtolower($request->userAgent());
25-
26-
foreach ($this->botUserAgents() as $botUserAgent) {
27-
if ($userAgent === strtolower($botUserAgent)) {
28-
return true;
29-
}
30-
}
31-
32-
return false;
33-
}
34-
35-
protected function botUserAgents(): array
36-
{
37-
return [
38-
'Baiduspider',
39-
'bingbot',
40-
'Embedly',
41-
'facebookexternalhit',
42-
'LinkedInBot',
43-
'outbrain',
44-
'pinterest',
45-
'quora link preview',
46-
'rogerbot',
47-
'showyoubot',
48-
'Slackbot',
49-
'TelegramBot',
50-
'Twitterbot',
51-
'vkShare',
52-
'W3C_Validator',
53-
'WhatsApp',
54-
];
24+
return $this->crawlerDetect->isCrawler(
25+
$request->userAgent()
26+
);
5527
}
5628
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Coderello\DynamicRenderer\RenderingCriteria;
4+
5+
use Coderello\DynamicRenderer\Facades\DynamicRenderer;
6+
use Illuminate\Contracts\Foundation\Application;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Support\Str;
9+
use Jaybizzle\CrawlerDetect\CrawlerDetect;
10+
11+
class IsNotRenderer implements RenderingCriterion
12+
{
13+
public function matches(Request $request): bool
14+
{
15+
return ! DynamicRenderer::isRendering($request);
16+
}
17+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Coderello\DynamicRenderer\RenderingCriteria;
4+
5+
use Coderello\DynamicRenderer\Facades\DynamicRenderer;
6+
use Illuminate\Contracts\Foundation\Application;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Support\Str;
9+
use Jaybizzle\CrawlerDetect\CrawlerDetect;
10+
11+
class IsNotStaticFilePath implements RenderingCriterion
12+
{
13+
public function matches(Request $request): bool
14+
{
15+
$path = $request->path();
16+
17+
return ! $this->isStaticFilePath($path);
18+
}
19+
20+
protected function isStaticFilePath(string $path): bool
21+
{
22+
return preg_match(
23+
$this->staticFilePathRegexPattern(),
24+
$path
25+
);
26+
}
27+
28+
protected function staticFilePathRegexPattern(): string
29+
{
30+
return '/.+\.('.implode('|', $this->staticFileExtensions()).')$/';
31+
}
32+
33+
protected function staticFileExtensions(): array
34+
{
35+
return [
36+
'ai', 'avi', 'css', 'dat', 'dmg', 'doc', 'doc', 'exe', 'flv',
37+
'gif', 'ico', 'iso', 'jpeg', 'jpg', 'js', 'less', 'm4a', 'm4v',
38+
'mov', 'mp3', 'mp4', 'mpeg', 'mpg', 'pdf', 'png', 'ppt', 'psd',
39+
'rar', 'rss', 'svg', 'swf', 'tif', 'torrent', 'ttf', 'txt', 'wav',
40+
'wmv', 'woff', 'xls', 'xml', 'zip',
41+
];
42+
}
43+
}

0 commit comments

Comments
 (0)