From cfdc2a43607ba5e133d5bf5d9197f5102c11726d Mon Sep 17 00:00:00 2001 From: Kris West Date: Tue, 14 Oct 2025 18:01:10 +0100 Subject: [PATCH] fix: correct and simplify git push/pull request classification using content headers --- package-lock.json | 18 +--------------- .../processors/pre-processor/parseAction.ts | 21 ++++++++----------- test/testParseAction.test.js | 4 ++-- 3 files changed, 12 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcbd6cada..4b46c22d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -149,7 +149,6 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -2490,7 +2489,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2512,7 +2510,6 @@ "node_modules/@types/react": { "version": "17.0.74", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2691,7 +2688,6 @@ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", @@ -2972,7 +2968,6 @@ "version": "8.15.0", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3526,7 +3521,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -3696,7 +3690,6 @@ "version": "4.5.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -4814,7 +4807,6 @@ "version": "2.4.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -5151,7 +5143,6 @@ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5592,7 +5583,6 @@ "node_modules/express-session": { "version": "1.18.2", "license": "MIT", - "peer": true, "dependencies": { "cookie": "0.7.2", "cookie-signature": "1.0.7", @@ -8911,7 +8901,6 @@ "node_modules/mongodb": { "version": "5.9.2", "license": "Apache-2.0", - "peer": true, "dependencies": { "bson": "^5.5.0", "mongodb-connection-string-url": "^2.6.0", @@ -10307,7 +10296,6 @@ "node_modules/react": { "version": "16.14.0", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10320,7 +10308,6 @@ "node_modules/react-dom": { "version": "16.14.0", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -11748,7 +11735,6 @@ "version": "10.9.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -12322,7 +12308,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12593,7 +12578,6 @@ "version": "4.5.14", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -13051,7 +13035,7 @@ "yargs": "^17.7.2" }, "bin": { - "git-proxy-cli": "index.js" + "git-proxy-cli": "dist/index.js" }, "devDependencies": { "chai": "^4.5.0" diff --git a/src/proxy/processors/pre-processor/parseAction.ts b/src/proxy/processors/pre-processor/parseAction.ts index 0707d9240..619deea93 100644 --- a/src/proxy/processors/pre-processor/parseAction.ts +++ b/src/proxy/processors/pre-processor/parseAction.ts @@ -9,24 +9,21 @@ const exec = async (req: { }) => { const id = Date.now(); const timestamp = id; - const pathBreakdown = processUrlPath(req.originalUrl); let type = 'default'; - if (pathBreakdown) { - if (pathBreakdown.gitPath.endsWith('git-upload-pack') && req.method === 'GET') { - type = 'pull'; - } else if ( - pathBreakdown.gitPath.includes('git-receive-pack') && - req.method === 'POST' && - req.headers['content-type'] === 'application/x-git-receive-pack-request' - ) { - type = 'push'; - } - } // else failed to parse proxy URL path - which is logged in the parsing util + + //inspect content-type headers to classify requests as push or pull operations + // see git http protocol docs for more details: https://github.com/git/git/blob/master/Documentation/gitprotocol-http.adoc + if (req.headers['content-type'] === 'application/x-git-upload-pack-request') { + type = 'pull'; + } else if (req.headers['content-type'] === 'application/x-git-receive-pack-request') { + type = 'push'; + } // Proxy URLs take the form https://:// // e.g. https://git-proxy-instance.com:8443/github.com/finos/git-proxy.git // We'll receive /github.com/finos/git-proxy.git as the req.url / req.originalUrl // Add protocol (assume SSL) to reconstruct full URL - noting path will start with a / + const pathBreakdown = processUrlPath(req.originalUrl); let url = 'https:/' + (pathBreakdown?.repoPath ?? 'NOT-FOUND'); console.log(`Parse action calculated repo URL: ${url} for inbound URL path: ${req.originalUrl}`); diff --git a/test/testParseAction.test.js b/test/testParseAction.test.js index 02686fc1d..3592cc081 100644 --- a/test/testParseAction.test.js +++ b/test/testParseAction.test.js @@ -29,7 +29,7 @@ describe('Pre-processor: parseAction', async () => { const req = { originalUrl: '/github.com/finos/git-proxy.git/git-upload-pack', method: 'GET', - headers: {}, + headers: { 'content-type': 'application/x-git-upload-pack-request' }, }; const action = await preprocessor.exec(req); @@ -43,7 +43,7 @@ describe('Pre-processor: parseAction', async () => { const req = { originalUrl: '/finos/git-proxy.git/git-upload-pack', method: 'GET', - headers: {}, + headers: { 'content-type': 'application/x-git-upload-pack-request' }, }; const action = await preprocessor.exec(req);