Skip to content

Commit 68d1922

Browse files
authored
fix: forward 405 Allow header (#138)
1 parent f27c5dc commit 68d1922

File tree

2 files changed

+91
-1
lines changed

2 files changed

+91
-1
lines changed

lib/index.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,17 @@ internals.handler = function (route, handlerOptions) {
213213
return settings.onResponse.call(bind, null, res, request, h, settings, ttl);
214214
}
215215

216-
return h.response(res)
216+
const response = h.response(res)
217217
.ttl(ttl)
218218
.code(res.statusCode)
219219
.passThrough(!!settings.passThrough);
220220

221+
if (!settings.passThrough && res.statusCode === 405 && 'allow' in res.headers) {
222+
response.header('allow', res.headers.allow);
223+
}
224+
225+
return response;
226+
221227
};
222228
};
223229

test/index.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,4 +2215,88 @@ describe('h2o2', () => {
22152215
await server.stop();
22162216
await upstream.stop();
22172217
});
2218+
2219+
it('propagates the allow header in case of 405 (with passthrough)', async () => {
2220+
2221+
const upstream = Hapi.server();
2222+
upstream.route({
2223+
method: 'POST',
2224+
path: '/item',
2225+
handler(request, h) {
2226+
2227+
throw Boom.methodNotAllowed('Not allowed', {}, ['GET']);
2228+
}
2229+
});
2230+
2231+
await upstream.start();
2232+
2233+
const server = Hapi.server();
2234+
await server.register(H2o2);
2235+
2236+
server.route({ method: 'POST', path: '/item', handler: { proxy: { host: upstream.info.address, port: upstream.info.port, passThrough: true } } });
2237+
await server.start();
2238+
2239+
const res = await server.inject({ method: 'POST', url: '/item' });
2240+
expect(res.statusCode).to.equal(405);
2241+
expect(res.headers.allow).to.equal('GET');
2242+
2243+
await server.stop();
2244+
await upstream.stop();
2245+
});
2246+
2247+
it('propagates the allow header in case of 405 (without passthrough)', async () => {
2248+
2249+
const upstream = Hapi.server();
2250+
upstream.route({
2251+
method: 'POST',
2252+
path: '/item',
2253+
handler(request, h) {
2254+
2255+
throw Boom.methodNotAllowed('Not allowed', {}, ['GET']);
2256+
}
2257+
});
2258+
2259+
await upstream.start();
2260+
2261+
const server = Hapi.server();
2262+
await server.register(H2o2);
2263+
2264+
server.route({ method: 'POST', path: '/item', handler: { proxy: { host: upstream.info.address, port: upstream.info.port } } });
2265+
await server.start();
2266+
2267+
const res = await server.inject({ method: 'POST', url: '/item' });
2268+
expect(res.statusCode).to.equal(405);
2269+
expect(res.headers.allow).to.equal('GET');
2270+
2271+
await server.stop();
2272+
await upstream.stop();
2273+
});
2274+
2275+
it('does not propagate a missing allow header in case of malformed 405', async () => {
2276+
2277+
const upstream = Hapi.server();
2278+
upstream.route({
2279+
method: 'POST',
2280+
path: '/item',
2281+
handler(request, h) {
2282+
2283+
throw Boom.methodNotAllowed('Not allowed');
2284+
}
2285+
});
2286+
2287+
await upstream.start();
2288+
2289+
const server = Hapi.server();
2290+
await server.register(H2o2);
2291+
2292+
server.route({ method: 'POST', path: '/item', handler: { proxy: { host: upstream.info.address, port: upstream.info.port } } });
2293+
await server.start();
2294+
2295+
const res = await server.inject({ method: 'POST', url: '/item' });
2296+
expect(res.statusCode).to.equal(405);
2297+
expect(res.headers.allow).to.not.exist();
2298+
2299+
await server.stop();
2300+
await upstream.stop();
2301+
});
22182302
});

0 commit comments

Comments
 (0)