Skip to content

Commit 9ebab1f

Browse files
authored
Merge pull request #57 from NHSDigital/dh-APMSPII-526-remove-content-location-check-from-polling-loop
Dh apmspii 526 remove content location check from polling loop
2 parents efe4fd7 + d06f4a4 commit 9ebab1f

5 files changed

Lines changed: 66 additions & 8 deletions

File tree

docker/async-slowapp/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"main": "src/main.js",
55
"scripts": {
66
"start": "node src/main.js --use_strict",
7-
"debug": "nodemon --inspect src/main.js"
7+
"debug": "nodemon --inspect src/main.js",
8+
"test": "mocha ./src/*.spec.js"
89
},
910
"author": "",
1011
"license": "",

docker/async-slowapp/src/handlers.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ async function slow(req, res, next) {
221221

222222
let delay = req.query.delay;
223223

224+
let nocl = req.query.nocl;
225+
224226
if (delay !== undefined) {
225227
delay = parseFloat(delay);
226228
await sleep(delay*1000);
@@ -237,6 +239,10 @@ async function slow(req, res, next) {
237239

238240
let location = `${locals.base_uri}/poll?id=${poll_id}`;
239241

242+
if (nocl === '1') {
243+
location = `${location}&nocl=1`;
244+
}
245+
240246
let headers = new MultiValueHeaders([
241247
"Content-Type", "application/json",
242248
"Content-Location", location
@@ -266,6 +272,7 @@ async function delete_poll(req, res, next) {
266272
async function poll(req, res, next) {
267273

268274
let poll_id = req.query.id;
275+
let nocl = req.query.nocl;
269276
let headers = req.rawHeaders.asMultiValue();
270277
let cookies = headers.cookies('cookie');
271278
let locals = req.app.locals;
@@ -283,17 +290,25 @@ async function poll(req, res, next) {
283290

284291
let tracking = locals.tracked[poll_id];
285292

286-
if (new Date() < tracking.finish_at) {
287-
respond(req, res, next, 202, new MultiValueHeaders(['Content-Location', `${locals.base_uri}/poll?id=${poll_id}`]));
288-
return;
289-
}
290293

291294
let resp_headers = new MultiValueHeaders();
292295

293296
if (poll_count !== undefined) {
294297
resp_headers.withNewCookies({"poll-count": `poll-count=${poll_count}`}, 'set-cookie');
295298
}
296299

300+
301+
if (new Date() < tracking.finish_at) {
302+
303+
if (nocl !== '1') {
304+
resp_headers.set('Content-Location', `${locals.base_uri}/poll?id=${poll_id}`)
305+
}
306+
respond(req, res, next, 202, resp_headers);
307+
return;
308+
}
309+
310+
311+
297312
delete locals.tracked[poll_id];
298313

299314
respond(req, res, next, tracking.final_status, resp_headers);

docker/sync-wrap/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"main": "src/main.js",
55
"scripts": {
66
"start": "node src/main.js --use_strict",
7-
"debug": "nodemon --inspect src/main.js"
7+
"debug": "nodemon --inspect src/main.js",
8+
"test": "mocha ./src/*.spec.js"
89
},
910
"author": "",
1011
"license": "",

docker/sync-wrap/src/app.slowapp.spec.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,31 @@ describe("express with slowap", function () {
134134
.expect(504, done);
135135
}).timeout(10000);
136136

137+
it("GET /slow, completes multiple polling cycles ", (done) => {
138+
request(server)
139+
.get(`/slow?final_status=200&complete_in=3`)
140+
.set("x-sync-wait", "5")
141+
.expect(200)
142+
.then(({ headers }) => {
143+
const pollCount = parseInt(headers["set-cookie"][0].split("=")[1]);
144+
assert.isAbove(pollCount, 1);
145+
done();
146+
})
147+
}).timeout(10000);
148+
149+
150+
it("GET /slow?nocl=1, don't set content location on poll", (done) => {
151+
request(server)
152+
.get(`/slow?final_status=200&complete_in=3&nocl=1`)
153+
.set("x-sync-wait", "5")
154+
.expect(200)
155+
.then(({ headers }) => {
156+
const pollCount = parseInt(headers["set-cookie"][0].split("=")[1]);
157+
assert.isAbove(pollCount, 1);
158+
done();
159+
})
160+
}).timeout(10000);
161+
137162
});
138163

139164

@@ -211,6 +236,18 @@ describe("express with slowap with sub path", function () {
211236
.expect(504, done);
212237
}).timeout(10000);
213238

239+
it("GET /slow, completes multiple polling cycles ", (done) => {
240+
request(server)
241+
.get(`/slow?final_status=200&complete_in=3`)
242+
.set("x-sync-wait", "5")
243+
.expect(200)
244+
.then(({ headers }) => {
245+
const pollCount = parseInt(headers["set-cookie"][0].split("=")[1]);
246+
assert.isAbove(pollCount, 1)
247+
done();
248+
})
249+
}).timeout(10000)
250+
214251
// it("slowapp patch request", (done) => {
215252
// request(server)
216253
// .patch("/slow?final_status=500&complete_in=5")

docker/sync-wrap/src/handlers.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,11 @@ async function proxy(req, res, next) {
471471
.then(async (outcome) => {
472472
let response = outcome.response;
473473
let headers = outcome.headers.withPreviousCookies(outcome.options.received_cookies);
474-
if (outcome.response.statusCode === 202 && headers.has("content-location")) {
474+
if (outcome.response.statusCode === 202) {
475+
if (headers.has('content-location')) {
476+
let poll_location = new URL(headers.get("content-location"));
477+
outcome.options.path = poll_location.pathname + poll_location.search;
478+
}
475479
outcome.options.last_response = response;
476480
outcome.options.last_headers = headers;
477481
outcome.options.received_cookies = headers.cookies("set-cookie");
@@ -514,7 +518,7 @@ async function proxy(req, res, next) {
514518
await send_response(response.statusCode, {headers: headers, response: response});
515519
})
516520
.catch(async (fin) => {
517-
await send_response(fin.error === "timeout" ? 504 : 502, {headers: headers, error: fin.error});
521+
await send_response(fin.error === "timeout" ? 504 : 502, {headers: headers, error: fin.error || fin});
518522
});
519523

520524
}

0 commit comments

Comments
 (0)