Skip to content

Commit 3d5d1bb

Browse files
CMR-10296: Adding arrayLimit to qs parser to increase the array limit without indices (#389)
* CMR-10296: Adding arrayLimit to qs parser to increase the array limit without indices * CMR-10296: Fixing linter issues * CMR-10296: Resetting limit to 100 * CMR-10296: Adding a unit test when passing in more than 20 polygon coordinates
1 parent 568bb2c commit 3d5d1bb

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

src/__tests__/providerSearch.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,31 @@ describe("GET /:provider/search", () => {
166166
});
167167
});
168168

169+
describe("given a polygon with more than 20 coordinates", () => {
170+
it("getItems should be called with the proper polygon coordinates", async () => {
171+
sandbox
172+
.stub(Providers, "getProviders")
173+
.resolves([null, [{ "provider-id": "TEST", "short-name": "TEST" }]]);
174+
sandbox.stub(Collections, "getCollections").resolves(emptyCollections);
175+
const getItemsSpy = sandbox
176+
.stub(Items, "getItems")
177+
.resolves({ count: 0, cursor: null, items: [] });
178+
179+
const { statusCode, body } = await request(app).get(
180+
"/stac/TEST/search?collections[0]=HLSS30_2.0&intersects[type]=Polygon&intersects[coordinates][0][0][0]=-48.31876570764564&intersects[coordinates][0][0][1]=-24.13235588091331&intersects[coordinates][0][1][0]=-48.319182157887525&intersects[coordinates][0][1][1]=-24.135649639167937&intersects[coordinates][0][2][0]=-48.2842003375668&intersects[coordinates][0][2][1]=-24.159843492656776&intersects[coordinates][0][3][0]=-48.26087912402002&intersects[coordinates][0][3][1]=-24.122474097202897&intersects[coordinates][0][4][0]=-48.259074506305325&intersects[coordinates][0][4][1]=-24.110310854137083&intersects[coordinates][0][5][0]=-48.268652861869185&intersects[coordinates][0][5][1]=-24.095231896596758&intersects[coordinates][0][6][0]=-48.273511448024976&intersects[coordinates][0][6][1]=-24.09662582428146&intersects[coordinates][0][7][0]=-48.2842003375668&intersects[coordinates][0][7][1]=-24.086361092375142&intersects[coordinates][0][8][0]=-48.28600495528215&intersects[coordinates][0][8][1]=-24.081038315106454&intersects[coordinates][0][9][0]=-48.28142400262118&intersects[coordinates][0][9][1]=-24.076095538322363&intersects[coordinates][0][10][0]=-48.28364507057779&intersects[coordinates][0][10][1]=-24.070645589226345&intersects[coordinates][0][11][0]=-48.29280697589971&intersects[coordinates][0][11][1]=-24.079390744017203&intersects[coordinates][0][12][0]=-48.29655502807688&intersects[coordinates][0][12][1]=-24.07977095461004&intersects[coordinates][0][13][0]=-48.295583310845984&intersects[coordinates][0][13][1]=-24.08433339376434&intersects[coordinates][0][14][0]=-48.30169124772749&intersects[coordinates][0][14][1]=-24.08293933236135&intersects[coordinates][0][15][0]=-48.3040511324312&intersects[coordinates][0][15][1]=-24.0845868578446&intersects[coordinates][0][16][0]=-48.298914912781214&intersects[coordinates][0][16][1]=-24.08876894281238&intersects[coordinates][0][17][0]=-48.30058071374884&intersects[coordinates][0][17][1]=-24.089909487754852&intersects[coordinates][0][18][0]=-48.30641101713553&intersects[coordinates][0][18][1]=-24.086614552446946&intersects[coordinates][0][19][0]=-48.31140842003842&intersects[coordinates][0][19][1]=-24.096879264048766&intersects[coordinates][0][20][0]=-48.310020252565636&intersects[coordinates][0][20][1]=-24.10068080039386&intersects[coordinates][0][21][0]=-48.31876570764564&intersects[coordinates][0][21][1]=-24.13235588091331"
181+
);
182+
expect(statusCode, JSON.stringify(body, null, 2)).to.equal(200);
183+
expect(getItemsSpy).to.have.been.calledOnce;
184+
expect(getItemsSpy).to.have.been.calledWithMatch({
185+
provider: "TEST",
186+
entryId: ["HLSS30_2.0"],
187+
polygon: [
188+
"-48.31876570764564,-24.13235588091331,-48.319182157887525,-24.135649639167937,-48.2842003375668,-24.159843492656776,-48.26087912402002,-24.122474097202897,-48.259074506305325,-24.110310854137083,-48.268652861869185,-24.095231896596758,-48.273511448024976,-24.09662582428146,-48.2842003375668,-24.086361092375142,-48.28600495528215,-24.081038315106454,-48.28142400262118,-24.076095538322363,-48.28364507057779,-24.070645589226345,-48.29280697589971,-24.079390744017203,-48.29655502807688,-24.07977095461004,-48.295583310845984,-24.08433339376434,-48.30169124772749,-24.08293933236135,-48.3040511324312,-24.0845868578446,-48.298914912781214,-24.08876894281238,-48.30058071374884,-24.089909487754852,-48.30641101713553,-24.086614552446946,-48.31140842003842,-24.096879264048766,-48.310020252565636,-24.10068080039386,-48.31876570764564,-24.13235588091331",
189+
],
190+
});
191+
});
192+
});
193+
169194
const limits = [
170195
["valid", 100, 200],
171196
["needing to page", 4000, 200],

src/app.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import helmet from "helmet";
44
import express from "express";
55
import compression from "compression";
66
import cookieParser from "cookie-parser";
7+
import qs from "qs";
78

89
import * as dotenv from "dotenv";
910
dotenv.config();
@@ -14,6 +15,13 @@ import { notFoundHandler, errorHandler } from "./middleware";
1415
const createApp = () => {
1516
const app = express();
1617

18+
// This allows the query parser to parse up to 100 coordinates without adding indices.
19+
// Anything over 100 would error out because indices are added. See CMR-10296 and
20+
// https://github.com/ljharb/qs for more details.
21+
app.set("query parser", function (str: string) {
22+
return qs.parse(str, { arrayLimit: 100 });
23+
});
24+
1725
app.use(compression());
1826
app.use(helmet());
1927
app.use(cors());

0 commit comments

Comments
 (0)