diff --git a/lib/handlers/compile.ts b/lib/handlers/compile.ts index 35b7ad31783..e9c20f2cad0 100644 --- a/lib/handlers/compile.ts +++ b/lib/handlers/compile.ts @@ -132,7 +132,7 @@ export class CompileHandler { // https://github.com/nodejitsu/node-http-proxy/blob/master/examples/middleware/bodyDecoder-middleware.js // We just keep the body as-is though: no encoding using queryString.stringify(), as we don't use a form // decoding middleware. - this.proxy.on('proxyReq', function (proxyReq, req) { + this.proxy.on('proxyReq', (proxyReq, req) => { // TODO ideally I'd work out if this is "ok" - IncomingMessage doesn't have a body, but pragmatically the // object we get here does. const body = (req as any).body; @@ -144,15 +144,28 @@ export class CompileHandler { if (contentType === 'application/json') { bodyData = JSON.stringify(body); - } - - if (contentType === 'application/x-www-form-urlencoded') { + } else if (contentType === 'application/x-www-form-urlencoded') { bodyData = body; + } else { + Sentry.captureException( + new Error(`Unexpected Content-Type received by /compiler/:compiler/compile: ${contentType}`), + ); + proxyReq.write('Unexpected Content-Type'); } - if (bodyData) { - proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); - proxyReq.write(bodyData); + try { + if (bodyData) { + proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData)); + proxyReq.write(bodyData); + } + } catch (e: any) { + Sentry.captureException(e); + let json = ''; + try { + json = JSON.stringify(bodyData); + } catch (e) {} + Sentry.captureMessage(`Unknown proxy bodyData: ${bodyData}, JSON.stringify: ${json}`); + proxyReq.write('Proxy error'); } }); } diff --git a/package-lock.json b/package-lock.json index 80e1ca1c911..e5290ac4b77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,9 @@ "@fortawesome/fontawesome-free": "^6.2.1", "@sentry/browser": "^7.28.1", "@sentry/node": "^7.28.1", + "@types/body-parser": "^1.19.2", "@types/file-saver": "^2.0.5", + "@types/http-proxy": "^1.17.9", "@types/request": "^2.48.8", "aws-sdk": "^2.1048.0", "big-integer": "^1.6.51", @@ -1699,7 +1701,6 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -1738,7 +1739,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -1823,7 +1823,6 @@ "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -16703,7 +16702,6 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -16742,7 +16740,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -16827,7 +16824,6 @@ "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, "requires": { "@types/node": "*" } diff --git a/package.json b/package.json index 57cf7c212f7..7b5383e0326 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,9 @@ "@fortawesome/fontawesome-free": "^6.2.1", "@sentry/browser": "^7.28.1", "@sentry/node": "^7.28.1", + "@types/body-parser": "^1.19.2", "@types/file-saver": "^2.0.5", + "@types/http-proxy": "^1.17.9", "@types/request": "^2.48.8", "aws-sdk": "^2.1048.0", "big-integer": "^1.6.51",