Skip to content

Commit

Permalink
feat: add a customisable callback to get proxies (#234)
Browse files Browse the repository at this point in the history
  • Loading branch information
asbiin authored Jan 16, 2022
1 parent 37ec298 commit 207609b
Show file tree
Hide file tree
Showing 9 changed files with 134 additions and 21 deletions.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,28 @@ Another option is to extend the `App\Http\Middleware\TrustProxies` class to `Mon
...
```

## Custom proxies callback

You can define your own proxies callback by calling the `LaravelCloudflare::getProxiesUsing()` to change the behavior of the `LaravelCloudflare::getProxies()` method.
This method should typically be called in the `boot` method of your `AppServiceProvider` class:

```php
use Monicahq\Cloudflare\LaravelCloudflare;
use Monicahq\Cloudflare\Facades\CloudflareProxies;

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
LaravelCloudflare::getProxiesUsing(function() {
return CloudflareProxies::load();
});
}
```


# How it works

Expand Down
7 changes: 3 additions & 4 deletions src/Commands/Reload.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use Illuminate\Console\Command;
use Illuminate\Contracts\Cache\Factory;
use Illuminate\Contracts\Config\Repository;
use Monicahq\Cloudflare\CloudflareProxies;
use Monicahq\Cloudflare\LaravelCloudflare;

class Reload extends Command
{
Expand All @@ -32,10 +32,9 @@ class Reload extends Command
*/
public function handle(Factory $cache, Repository $config)
{
/** @var CloudflareProxies */
$loader = $this->laravel->make(CloudflareProxies::class);
$proxies = LaravelCloudflare::getProxies();

$cache->store()->forever($config->get('laravelcloudflare.cache'), $loader->load());
$cache->store()->forever($config->get('laravelcloudflare.cache'), $proxies);

$this->info('Cloudflare\'s IP blocks have been reloaded.');
}
Expand Down
23 changes: 23 additions & 0 deletions src/Facades/CloudflareProxies.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace Monicahq\Cloudflare\Facades;

use Illuminate\Support\Facades\Facade;

/**
* @method static array load(int $type = \Monicahq\Cloudflare\CloudflareProxies::IP_VERSION_ANY)
*
* @see \Monicahq\Cloudflare\CloudflareProxies
*/
class CloudflareProxies extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return \Monicahq\Cloudflare\CloudflareProxies::class;
}
}
7 changes: 2 additions & 5 deletions src/Http/Middleware/TrustProxies.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Monicahq\Cloudflare\CloudflareProxies;
use Monicahq\Cloudflare\LaravelCloudflare;

class TrustProxies extends Middleware
{
Expand All @@ -18,10 +18,7 @@ class TrustProxies extends Middleware
protected function setTrustedProxyIpAddresses(Request $request)
{
$cachedProxies = Cache::get(Config::get('laravelcloudflare.cache'), function () {
/** @var CloudflareProxies $cloudflareProxies */
$cloudflareProxies = app(CloudflareProxies::class);

return $cloudflareProxies->load();
return LaravelCloudflare::getProxies();
});

if (is_array($cachedProxies) && count($cachedProxies) > 0) {
Expand Down
40 changes: 40 additions & 0 deletions src/LaravelCloudflare.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Monicahq\Cloudflare;

use Monicahq\Cloudflare\Facades\CloudflareProxies;

final class LaravelCloudflare
{
/**
* The callback that should be used to get the proxies addresses.
*
* @var \Closure|null
*/
protected static $getProxiesCallback;

/**
* Get the proxies addresses.
*
* @return array
*/
public static function getProxies(): array
{
if (static::$getProxiesCallback !== null) {
return call_user_func(static::$getProxiesCallback);
}

return CloudflareProxies::load();
}

/**
* Set a callback that should be used when getting the proxies addresses.
*
* @param \Closure $callback
* @return void
*/
public static function getProxiesUsing($callback): void
{
static::$getProxiesCallback = $callback;
}
}
1 change: 1 addition & 0 deletions src/TrustedProxyServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public function register()
$this->mergeConfigFrom(
__DIR__.'/../config/laravelcloudflare.php', 'laravelcloudflare'
);
$this->app->singleton(\Monicahq\Cloudflare\Facades\CloudflareProxies::class, \Monicahq\Cloudflare\CloudflareProxies::class);

if ($this->app->runningInConsole()) {
$this->commands([
Expand Down
10 changes: 4 additions & 6 deletions tests/Unit/Commands/ReloadTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,17 @@

use Illuminate\Http\Client\Factory as HttpClient;
use Illuminate\Support\Facades\Http;
use Mockery\MockInterface;
use Monicahq\Cloudflare\CloudflareProxies;
use Monicahq\Cloudflare\Facades\CloudflareProxies;
use Monicahq\Cloudflare\Tests\FeatureTestCase;

class ReloadTest extends FeatureTestCase
{
/** @test */
public function it_loads_proxies()
{
$this->mock(CloudflareProxies::class, function (MockInterface $mock) {
$mock->shouldReceive('load')
->andReturn(['expect']);
});
CloudflareProxies::shouldReceive('load')
->once()
->andReturn(['expect']);

$this->artisan('cloudflare:reload')
->expectsOutput('Cloudflare\'s IP blocks have been reloaded.')
Expand Down
10 changes: 4 additions & 6 deletions tests/Unit/Http/Middleware/TrustProxiesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Mockery\MockInterface;
use Monicahq\Cloudflare\CloudflareProxies;
use Monicahq\Cloudflare\Facades\CloudflareProxies;
use Monicahq\Cloudflare\Http\Middleware\TrustProxies;
use Monicahq\Cloudflare\Tests\FeatureTestCase;

Expand Down Expand Up @@ -48,10 +47,9 @@ public function it_does_not_sets_trusted_proxies()
/** @test */
public function it_load_trustproxies()
{
$this->mock(CloudflareProxies::class, function (MockInterface $mock) {
$mock->shouldReceive('load')
->andReturn(['expect']);
});
CloudflareProxies::shouldReceive('load')
->once()
->andReturn(['expect']);

$request = new Request();

Expand Down
35 changes: 35 additions & 0 deletions tests/Unit/LaravelCloudflareTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Monicahq\Cloudflare\Tests\Unit;

use Illuminate\Http\Request;
use Monicahq\Cloudflare\Http\Middleware\TrustProxies;
use Monicahq\Cloudflare\LaravelCloudflare;
use Monicahq\Cloudflare\Tests\FeatureTestCase;

class LaravelCloudflareTest extends FeatureTestCase
{
private static bool $run;

/** @test */
public function it_call_callback()
{
static::$run = false;

LaravelCloudflare::getProxiesUsing(function () {
static::$run = true;

return ['expect'];
});

$request = new Request();

$this->app->make(TrustProxies::class)->handle($request, function () {
});

$proxies = $request->getTrustedProxies();

$this->assertTrue(static::$run);
$this->assertEquals(['expect'], $proxies);
}
}

0 comments on commit 207609b

Please sign in to comment.