Skip to content

Commit 70aa2ce

Browse files
authored
Merge pull request #152 from humanmade/add-parameter-validation
Add parameter validation and provide additional information to response header about the error
2 parents 824b7b8 + 625cf8a commit 70aa2ce

File tree

4 files changed

+112
-24
lines changed

4 files changed

+112
-24
lines changed

index.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,82 @@ module.exports.resizeBuffer = async function(buffer, args, callback) {
125125
}
126126
}
127127

128+
// validate args, remove from the object if not valid
129+
var errors = [];
130+
131+
if (args.w) {
132+
if (!/^[1-9]\d*$/.test(args.w)) {
133+
delete args.w;
134+
errors.push("w arg is not valid");
135+
}
136+
}
137+
if (args.h) {
138+
if (!/^[1-9]\d*$/.test(args.h)) {
139+
delete args.h;
140+
errors.push("h arg is not valid");
141+
}
142+
}
143+
if (args.quality) {
144+
if (!/^[0-9]{1,3}$/.test(args.quality) || args.quality < 0 || args.quality > 100) {
145+
delete args.quality;
146+
errors.push("quality arg is not valid");
147+
}
148+
}
149+
if (args.resize) {
150+
if (!/^\d+(px)?,\d+(px)?$/.test(args.resize)) {
151+
delete args.resize;
152+
errors.push("resize arg is not valid");
153+
}
154+
}
155+
if (args.crop_strategy) {
156+
if (!/^(smart|entropy|attention)$/.test(args.crop_strategy)) {
157+
delete args.crop_strategy;
158+
errors.push("crop_strategy arg is not valid");
159+
}
160+
}
161+
if (args.gravity) {
162+
if (!/^(north|northeast|east|southeast|south|southwest|west|northwest|center)$/.test(args.gravity)) {
163+
delete args.gravity;
164+
errors.push("gravity arg is not valid");
165+
}
166+
}
167+
if (args.fit) {
168+
if (!/^\d+(px)?,\d+(px)?$/.test(args.fit)) {
169+
delete args.fit;
170+
errors.push("fit arg is not valid");
171+
}
172+
}
173+
if (args.crop) {
174+
if (!/^\d+(px)?,\d+(px)?,\d+(px)?,\d+(px)?$/.test(args.crop)) {
175+
delete args.crop;
176+
errors.push("crop arg is not valid");
177+
}
178+
}
179+
if (args.zoom) {
180+
if (!/^\d+(\.\d+)?$/.test(args.zoom)) {
181+
delete args.zoom;
182+
errors.push("zoom arg is not valid");
183+
}
184+
}
185+
if (args.webp) {
186+
if (!/^0|1|true|false$/.test(args.webp)) {
187+
delete args.webp;
188+
errors.push("webp arg is not valid");
189+
}
190+
}
191+
if (args.lb) {
192+
if (!/^\d+(px)?,\d+(px)?$/.test(args.lb)) {
193+
delete args.lb;
194+
errors.push("lb arg is not valid");
195+
}
196+
}
197+
if (args.background) {
198+
if (!/^#[a-f0-9]{3}[a-f0-9]{3}?$/.test(args.background)) {
199+
delete args.background;
200+
errors.push("background arg is not valid");
201+
}
202+
}
203+
128204
// crop (assumes crop data from original)
129205
if (args.crop) {
130206
var cropValues =
@@ -254,6 +330,9 @@ module.exports.resizeBuffer = async function(buffer, args, callback) {
254330
info.size = data.length;
255331
}
256332

333+
// add invalid args
334+
info.errors = errors.join(';');
335+
257336
callback && callback(null, data, info);
258337
resolve({ data, info });
259338
});

lambda-handler.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ exports.handler = function(event, context, callback) {
5555
body: Buffer.from(data).toString('base64'),
5656
isBase64Encoded: true,
5757
};
58+
59+
if (info.errors) {
60+
resp.headers["X-Tachyon-Errors"] = info.errors;
61+
}
62+
5863
callback(null, resp);
5964

6065
data = null;

server.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,15 @@ http.createServer( function( request, response ) {
8282
}
8383
return callback( err );
8484
}
85-
response.writeHead( 200, {
85+
var resp = {
8686
'Content-Type': 'image/' + info.format,
8787
'Content-Length': info.size,
8888
'Cache-Control': 'public, max-age=31557600',
89-
} );
89+
}
90+
if (info.errors) {
91+
resp["X-Tachyon-Errors"] = info.errors;
92+
}
93+
response.writeHead( 200, resp );
9094
response.write( data );
9195
return response.end();
9296
} );

test-filesize/fixtures.json

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
{
2-
"briefing-copywriting.jpg-original.jpeg": 115390,
3-
"briefing-copywriting.jpg-small.jpeg": 3092,
4-
"briefing-copywriting.jpg-medium.jpeg": 9584,
5-
"briefing-copywriting.jpg-large.jpeg": 29223,
6-
"briefing-copywriting.jpg-webp.webp": 15660,
7-
"hdr.jpg-original.jpeg": 149042,
8-
"hdr.jpg-small.jpeg": 10589,
9-
"hdr.jpg-medium.jpeg": 24100,
10-
"hdr.jpg-large.jpeg": 87533,
11-
"hdr.jpg-webp.webp": 82784,
2+
"hdr.jpg-original.jpeg": 148964,
3+
"hdr.jpg-small.jpeg": 10632,
4+
"hdr.jpg-medium.jpeg": 24387,
5+
"hdr.jpg-large.jpeg": 87555,
6+
"hdr.jpg-webp.webp": 82710,
127
"Website.png-original.png": 34589,
13-
"Website.png-small.png": 3420,
14-
"Website.png-medium.png": 13778,
8+
"Website.png-small.png": 3343,
9+
"Website.png-medium.png": 13591,
1510
"Website.png-large.png": 34589,
1611
"Website.png-webp.webp": 20288,
12+
"briefing-copywriting.jpg-original.jpeg": 115372,
13+
"briefing-copywriting.jpg-small.jpeg": 3063,
14+
"briefing-copywriting.jpg-medium.jpeg": 9541,
15+
"briefing-copywriting.jpg-large.jpeg": 29281,
16+
"briefing-copywriting.jpg-webp.webp": 15776,
1717
"icons.png-original.png": 28026,
18-
"icons.png-small.png": 3948,
19-
"icons.png-medium.png": 11212,
20-
"icons.png-large.png": 26372,
21-
"icons.png-webp.webp": 24816,
22-
"humans.png-original.png": 873684,
23-
"humans.png-small.png": 9175,
24-
"humans.png-medium.png": 56093,
25-
"humans.png-large.png": 279635,
26-
"humans.png-webp.webp": 141340
27-
}
18+
"icons.png-small.png": 3987,
19+
"icons.png-medium.png": 11580,
20+
"icons.png-large.png": 27584,
21+
"icons.png-webp.webp": 24500,
22+
"humans.png-original.png": 873673,
23+
"humans.png-small.png": 9162,
24+
"humans.png-medium.png": 55961,
25+
"humans.png-large.png": 280452,
26+
"humans.png-webp.webp": 142528
27+
}

0 commit comments

Comments
 (0)