Skip to content

Commit c26a326

Browse files
fix: do not call the next middleware for 304 responses (#2155)
1 parent a613973 commit c26a326

File tree

3 files changed

+206
-3
lines changed

3 files changed

+206
-3
lines changed

src/index.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,8 @@ function honoWrapper(compiler, options) {
606606
body = data;
607607
};
608608

609+
let isFinished = false;
610+
609611
/**
610612
* @param {(string | Buffer)=} data data
611613
*/
@@ -618,6 +620,9 @@ function honoWrapper(compiler, options) {
618620
}
619621

620622
body = isDataExist ? data : null;
623+
isFinished = true;
624+
625+
resolve();
621626
};
622627

623628
devMiddleware(req, res, (err) => {
@@ -626,7 +631,9 @@ function honoWrapper(compiler, options) {
626631
return;
627632
}
628633

629-
resolve();
634+
if (!isFinished) {
635+
resolve();
636+
}
630637
});
631638
},
632639
);

src/middleware.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,6 @@ function wrapper(context) {
719719
removeResponseHeader(res, "Content-Type");
720720

721721
finish(res);
722-
await goNext();
723722
return;
724723
}
725724
}

test/middleware.test.js

Lines changed: 198 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ describe.each([
329329
let server;
330330
let req;
331331

332-
describe("aPI", () => {
332+
describe("API", () => {
333333
let compiler;
334334

335335
describe("constructor", () => {
@@ -5354,6 +5354,106 @@ describe.each([
53545354
});
53555355
});
53565356

5357+
describe("should work and generate etag with other middlewares", () => {
5358+
beforeAll(async () => {
5359+
const compiler = getCompiler(webpackConfig);
5360+
5361+
let isFirstRequest = true;
5362+
5363+
[server, req, instance] = await frameworkFactory(
5364+
name,
5365+
framework,
5366+
compiler,
5367+
{
5368+
etag: "weak",
5369+
},
5370+
{
5371+
setupMiddlewares: (middlewares) => {
5372+
if (name === "koa") {
5373+
middlewares.push(async (ctx, next) => {
5374+
await next();
5375+
5376+
if (!isFirstRequest) {
5377+
ctx.status = 500;
5378+
ctx.body = "shouldn't get there";
5379+
}
5380+
5381+
isFirstRequest = false;
5382+
});
5383+
} else if (name === "hapi") {
5384+
middlewares.push({
5385+
plugin: {
5386+
name: "myPlugin",
5387+
version: "1.0.0",
5388+
register(innerServer) {
5389+
innerServer.ext("onRequest", () => {
5390+
if (!isFirstRequest) {
5391+
throw new Error("shouldn't get there");
5392+
}
5393+
5394+
isFirstRequest = false;
5395+
});
5396+
},
5397+
},
5398+
});
5399+
} else if (name === "hono") {
5400+
middlewares.push(async (c, next) => {
5401+
await next();
5402+
5403+
if (!isFirstRequest) {
5404+
throw new Error("shouldn't get there");
5405+
}
5406+
5407+
isFirstRequest = false;
5408+
});
5409+
} else {
5410+
middlewares.push(async (req, res, next) => {
5411+
if (!isFirstRequest) {
5412+
next(new Error("shouldn't get there"));
5413+
return;
5414+
}
5415+
5416+
isFirstRequest = false;
5417+
5418+
next();
5419+
});
5420+
}
5421+
5422+
return middlewares;
5423+
},
5424+
},
5425+
);
5426+
});
5427+
5428+
afterAll(async () => {
5429+
await close(server, instance);
5430+
});
5431+
5432+
it('should return the "304" code for the "GET" request to the bundle file with etag and "if-none-match" header with additional middlewares', async () => {
5433+
const response1 = await req.get("/bundle.js");
5434+
5435+
expect(response1.statusCode).toBe(200);
5436+
expect(response1.headers.etag).toBeDefined();
5437+
expect(response1.headers.etag.startsWith("W/")).toBe(true);
5438+
5439+
const response2 = await req
5440+
.get("/bundle.js")
5441+
.set("if-none-match", response1.headers.etag);
5442+
5443+
expect(response2.statusCode).toBe(304);
5444+
expect(response2.headers.etag).toBeDefined();
5445+
expect(response2.headers.etag.startsWith("W/")).toBe(true);
5446+
5447+
const response3 = await req
5448+
.get("/bundle.js")
5449+
.set("if-none-match", response1.headers.etag);
5450+
5451+
expect(response3.statusCode).toBe(304);
5452+
expect(response3.headers.etag).toBeDefined();
5453+
expect(response3.headers.etag.startsWith("W/")).toBe(true);
5454+
});
5455+
});
5456+
53575457
describe("should work and generate strong etag without createReadStream", () => {
53585458
beforeEach(async () => {
53595459
const compiler = getCompiler(webpackConfig);
@@ -5593,6 +5693,103 @@ describe.each([
55935693
expect(response2.headers.etag).toBeDefined();
55945694
});
55955695
});
5696+
5697+
describe("should work and generate etag with other middlewares", () => {
5698+
beforeAll(async () => {
5699+
const compiler = getCompiler(webpackConfig);
5700+
5701+
let isFirstRequest = true;
5702+
5703+
[server, req, instance] = await frameworkFactory(
5704+
name,
5705+
framework,
5706+
compiler,
5707+
{
5708+
lastModified: true,
5709+
},
5710+
{
5711+
setupMiddlewares: (middlewares) => {
5712+
if (name === "koa") {
5713+
middlewares.push(async (ctx, next) => {
5714+
await next();
5715+
5716+
if (!isFirstRequest) {
5717+
ctx.status = 500;
5718+
ctx.body = "shouldn't get there";
5719+
}
5720+
5721+
isFirstRequest = false;
5722+
});
5723+
} else if (name === "hapi") {
5724+
middlewares.push({
5725+
plugin: {
5726+
name: "myPlugin",
5727+
version: "1.0.0",
5728+
register(innerServer) {
5729+
innerServer.ext("onRequest", () => {
5730+
if (!isFirstRequest) {
5731+
throw new Error("shouldn't get there");
5732+
}
5733+
5734+
isFirstRequest = false;
5735+
});
5736+
},
5737+
},
5738+
});
5739+
} else if (name === "hono") {
5740+
middlewares.push(async (c, next) => {
5741+
await next();
5742+
5743+
if (!isFirstRequest) {
5744+
throw new Error("shouldn't get there");
5745+
}
5746+
5747+
isFirstRequest = false;
5748+
});
5749+
} else {
5750+
middlewares.push(async (req, res, next) => {
5751+
if (!isFirstRequest) {
5752+
next(new Error("shouldn't get there"));
5753+
return;
5754+
}
5755+
5756+
isFirstRequest = false;
5757+
5758+
next();
5759+
});
5760+
}
5761+
5762+
return middlewares;
5763+
},
5764+
},
5765+
);
5766+
});
5767+
5768+
afterAll(async () => {
5769+
await close(server, instance);
5770+
});
5771+
5772+
it('should return the "304" code for the "GET" request to the bundle file with lastModified and "if-modified-since" header with additional middlewares', async () => {
5773+
const response1 = await req.get("/bundle.js");
5774+
5775+
expect(response1.statusCode).toBe(200);
5776+
expect(response1.headers["last-modified"]).toBeDefined();
5777+
5778+
const response2 = await req
5779+
.get("/bundle.js")
5780+
.set("if-modified-since", response1.headers["last-modified"]);
5781+
5782+
expect(response2.statusCode).toBe(304);
5783+
expect(response2.headers["last-modified"]).toBeDefined();
5784+
5785+
const response3 = await req
5786+
.get("/bundle.js")
5787+
.set("if-modified-since", response2.headers["last-modified"]);
5788+
5789+
expect(response3.statusCode).toBe(304);
5790+
expect(response3.headers["last-modified"]).toBeDefined();
5791+
});
5792+
});
55965793
});
55975794

55985795
describe("cacheControl", () => {

0 commit comments

Comments
 (0)