Skip to content

Commit 615861a

Browse files
committed
Add option for path/params combo when validating HTTP signatures.
Move request arguments resolution to new RequestArgumentsResolver class.
1 parent 05bc4ba commit 615861a

File tree

5 files changed

+123
-61
lines changed

5 files changed

+123
-61
lines changed

src/Http/RequestArgumentsResolver.php

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace League\Glide\Http;
4+
5+
use InvalidArgumentException;
6+
use Symfony\Component\HttpFoundation\Request;
7+
8+
class RequestArgumentsResolver
9+
{
10+
/**
11+
* Resolve request object.
12+
* @param array $args Array of supplied arguments.
13+
* @return Request The request object.
14+
*/
15+
public function getRequest($args)
16+
{
17+
if (isset($args[0]) and $args[0] instanceof Request) {
18+
return $args[0];
19+
}
20+
21+
if (isset($args[0]) and is_string($args[0])) {
22+
$path = $args[0];
23+
$params = [];
24+
25+
if (isset($args[1]) and is_array($args[1])) {
26+
$params = $args[1];
27+
}
28+
29+
return RequestFactory::create($path, $params);
30+
}
31+
32+
throw new InvalidArgumentException('Not a valid path or Request object.');
33+
}
34+
}

src/Http/Signature.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ public function addSignature($path, array $params)
3434

3535
/**
3636
* Validate a request signature.
37-
* @param Request $request The request object.
37+
* @param mixed
3838
* @throws SignatureException
3939
*/
40-
public function validateRequest(Request $request)
40+
public function validateRequest()
4141
{
42+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
43+
4244
if (is_null($request->get('s'))) {
4345
throw new SignatureException('Signature is missing.');
4446
}

src/Http/SignatureInterface.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public function addSignature($path, array $params);
1616

1717
/**
1818
* Validate a request signature.
19-
* @param Request $request The request object.
19+
* @param mixed
2020
* @throws SignatureException
2121
*/
22-
public function validateRequest(Request $request);
22+
public function validateRequest();
2323
}

src/Server.php

+30-57
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
namespace League\Glide;
44

5-
use InvalidArgumentException;
65
use League\Flysystem\FileExistsException;
76
use League\Flysystem\FilesystemInterface;
87
use League\Glide\Api\ApiInterface;
98
use League\Glide\Filesystem\FilesystemException;
109
use League\Glide\Http\NotFoundException;
11-
use League\Glide\Http\RequestFactory;
10+
use League\Glide\Http\RequestArgumentsResolver;
1211
use League\Glide\Http\ResponseFactory;
1312
use Symfony\Component\HttpFoundation\Request;
1413
use Symfony\Component\HttpFoundation\StreamedResponse;
@@ -57,7 +56,7 @@ class Server
5756
* @param FilesystemInterface|null $cache The cache file system.
5857
* @param ApiInterface $api The image manipulation API.
5958
*/
60-
public function __construct(FilesystemInterface $source, $cache, ApiInterface $api)
59+
public function __construct(FilesystemInterface $source, FilesystemInterface $cache = null, ApiInterface $api)
6160
{
6261
$this->setSource($source);
6362
$this->setCache($cache);
@@ -108,7 +107,7 @@ public function getSourcePathPrefix()
108107
*/
109108
public function getSourcePath()
110109
{
111-
$request = $this->resolveRequestObject(func_get_args());
110+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
112111

113112
$path = trim($request->getPathInfo(), '/');
114113

@@ -134,7 +133,7 @@ public function getSourcePath()
134133
*/
135134
public function sourceFileExists()
136135
{
137-
$request = $this->resolveRequestObject(func_get_args());
136+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
138137

139138
return $this->source->has($this->getSourcePath($request));
140139
}
@@ -143,7 +142,7 @@ public function sourceFileExists()
143142
* Set the cache file system.
144143
* @param FilesystemInterface|null $cache The cache file system.
145144
*/
146-
public function setCache($cache)
145+
public function setCache(FilesystemInterface $cache = null)
147146
{
148147
$this->cache = $cache;
149148
}
@@ -182,7 +181,7 @@ public function getCachePathPrefix()
182181
*/
183182
public function getCachePath()
184183
{
185-
$request = $this->resolveRequestObject(func_get_args());
184+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
186185

187186
$path = md5($this->getSourcePath($request).'?'.http_build_query($request->query->all()));
188187

@@ -204,7 +203,7 @@ public function cacheFileExists()
204203
return false;
205204
}
206205

207-
$request = $this->resolveRequestObject(func_get_args());
206+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
208207

209208
return $this->cache->has($this->getCachePath($request));
210209
}
@@ -252,7 +251,7 @@ public function getBaseUrl()
252251
*/
253252
public function outputImage()
254253
{
255-
$request = $this->resolveRequestObject(func_get_args());
254+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
256255

257256
$this->makeImage($request);
258257

@@ -274,7 +273,7 @@ public function outputImage()
274273
*/
275274
public function getImageResponse()
276275
{
277-
$request = $this->resolveRequestObject(func_get_args());
276+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
278277

279278
$this->makeImage($request);
280279

@@ -288,7 +287,7 @@ public function getImageResponse()
288287
*/
289288
public function makeImage()
290289
{
291-
$request = $this->resolveRequestObject(func_get_args());
290+
$request = (new RequestArgumentsResolver())->getRequest(func_get_args());
292291

293292
if ($this->cacheFileExists($request) === true) {
294293
return $request;
@@ -310,62 +309,36 @@ public function makeImage()
310309
);
311310
}
312311

313-
try {
314-
$written = $this->writeCache($request, $source);
315-
} catch (FileExistsException $exception) {
316-
// Cache file failed to write. Fail silently.
317-
return $request;
318-
}
319-
320-
if ($written === false) {
321-
throw new FilesystemException(
322-
'Could not write the image `'.$this->getCachePath($request).'`.'
323-
);
312+
if ($this->cache) {
313+
$this->writeCache($request, $source);
324314
}
325315

326316
return $request;
327317
}
328318

329-
/**
330-
* Resolve request object.
331-
* @param array $args Array of supplied arguments.
332-
* @return Request The request object.
333-
*/
334-
protected function resolveRequestObject($args)
335-
{
336-
if (isset($args[0]) and $args[0] instanceof Request) {
337-
return $args[0];
338-
}
339-
340-
if (isset($args[0]) and is_string($args[0])) {
341-
$path = $args[0];
342-
$params = [];
343-
344-
if (isset($args[1]) and is_array($args[1])) {
345-
$params = $args[1];
346-
}
347-
348-
return RequestFactory::create($path, $params);
349-
}
350-
351-
throw new InvalidArgumentException('Not a valid path or Request object.');
352-
}
353-
354319
/**
355320
* Write the cache file if caching is enabled.
356-
* @param Request $request
357-
* @param string $source
321+
* @param Request $request
322+
* @param string $source
358323
* @return mixed
359324
*/
360-
private function writeCache(Request $request, $source)
325+
protected function writeCache(Request $request, $source)
361326
{
362-
if ($this->cache === null) {
363-
return null;
364-
}
327+
try {
328+
$written = $this->cache->write(
329+
$this->getCachePath($request),
330+
$this->api->run($request, $source)
331+
);
365332

366-
return $this->cache->write(
367-
$this->getCachePath($request),
368-
$this->api->run($request, $source)
369-
);
333+
if ($written === false) {
334+
throw new FilesystemException(
335+
'Could not write the image `'.$this->getCachePath($request).'`.'
336+
);
337+
}
338+
} catch (FileExistsException $exception) {
339+
// This edge case occurs when the target already exists
340+
// because it's currently be written to disk in another
341+
// request. It's best to just fail silently.
342+
}
370343
}
371344
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace League\Glide\Http;
4+
5+
class RequestArgumentsResolverTest extends \PHPUnit_Framework_TestCase
6+
{
7+
private $resolver;
8+
9+
public function setUp()
10+
{
11+
$this->resolver = new RequestArgumentsResolver();
12+
}
13+
14+
public function testCreateRequestArgumentsResolver()
15+
{
16+
$this->assertInstanceOf(
17+
'League\Glide\Http\RequestArgumentsResolver',
18+
$this->resolver
19+
);
20+
}
21+
22+
public function testRequestObjectArg()
23+
{
24+
$request = $this->resolver->getRequest([
25+
RequestFactory::create('image.jpg', ['w' => 100]),
26+
]);
27+
28+
$this->assertEquals('image.jpg', $request->getPathInfo());
29+
$this->assertEquals(['w' => 100], $request->query->all());
30+
$this->assertInstanceOf('Symfony\Component\HttpFoundation\Request', $request);
31+
}
32+
33+
public function testRequestParamsArgs()
34+
{
35+
$request = $this->resolver->getRequest([
36+
'image.jpg', ['w' => 100],
37+
]);
38+
39+
$this->assertEquals('image.jpg', $request->getPathInfo());
40+
$this->assertEquals(['w' => 100], $request->query->all());
41+
$this->assertInstanceOf('Symfony\Component\HttpFoundation\Request', $request);
42+
}
43+
44+
public function testInvalidArgs()
45+
{
46+
$this->setExpectedException(
47+
'InvalidArgumentException',
48+
'Not a valid path or Request object.'
49+
);
50+
51+
$this->resolver->getRequest([]);
52+
}
53+
}

0 commit comments

Comments
 (0)