diff --git a/packages/sirv/index.js b/packages/sirv/index.js index fe01068..9a6c8f6 100644 --- a/packages/sirv/index.js +++ b/packages/sirv/index.js @@ -160,6 +160,11 @@ export default function (dir, opts={}) { let lookup = opts.dev ? viaLocal.bind(0, dir, isEtag) : viaCache.bind(0, FILES); return function (req, res, next) { + // only handle GET requests that are not WebSocket requests + if (req.method !== 'GET' || req.headers.upgrade) { + return next ? next() : isNotFound(req, res); + } + let extns = ['']; let pathname = parse(req).pathname; let val = req.headers['accept-encoding'] || ''; diff --git a/tests/sirv.js b/tests/sirv.js index 9aa4597..1604c67 100644 --- a/tests/sirv.js +++ b/tests/sirv.js @@ -31,6 +31,36 @@ types.run(); const basic = suite('basics'); +basic('should only handle GET requests', async () => { + let server = utils.http(); + + try { + let res = await server.send('POST', '/contact').catch(err => { + assert.is(err.statusCode, 404); + }) + assert.is(res, undefined) + } + finally { + server.close(); + } +}) + +basic('should not handle WebSocket requests', async () => { + let server = utils.http(); + + try { + // mock a websocket upgrade request + const headers = {'Upgrade': 'websocket' } + let res = await server.send('GET', '/contact', { headers }).catch(err => { + assert.is(err.statusCode, 404); + }) + assert.is(res, undefined) + } + finally { + server.close(); + } +}) + basic('should return the file if found', async () => { let server = utils.http();