diff --git a/spec/batch.spec.js b/spec/batch.spec.js index d12eb481..db284d0c 100644 --- a/spec/batch.spec.js +++ b/spec/batch.spec.js @@ -9,6 +9,7 @@ const serverURL1 = 'http://localhost:1234/1'; const serverURLNaked = 'http://localhost:1234/'; const publicServerURL = 'http://domain.com/parse'; const publicServerURLNaked = 'http://domain.com/'; +const publicServerURLLong = 'https://domain.com/something/really/long'; const headers = { 'Content-Type': 'application/json', @@ -24,6 +25,26 @@ describe('batch', () => { expect(internalURL).toEqual('/classes/Object'); }); + it('should return the proper url given a public url-only path', () => { + const originalURL = '/something/really/long/batch'; + const internalURL = batch.makeBatchRoutingPathFunction( + originalURL, + serverURL, + publicServerURLLong + )('/parse/classes/Object'); + expect(internalURL).toEqual('/classes/Object'); + }); + + it('should return the proper url given a server url-only path', () => { + const originalURL = '/parse/batch'; + const internalURL = batch.makeBatchRoutingPathFunction( + originalURL, + serverURL, + publicServerURLLong + )('/parse/classes/Object'); + expect(internalURL).toEqual('/classes/Object'); + }); + it('should return the proper url same public/local endpoint', () => { const originalURL = '/parse/batch'; const internalURL = batch.makeBatchRoutingPathFunction( diff --git a/src/batch.js b/src/batch.js index 9bf6da78..607c668a 100644 --- a/src/batch.js +++ b/src/batch.js @@ -36,12 +36,23 @@ function makeBatchRoutingPathFunction(originalUrl, serverURL, publicServerURL) { if (serverURL && publicServerURL && serverURL.path != publicServerURL.path) { const localPath = serverURL.path; const publicPath = publicServerURL.path; + // Override the api prefix apiPrefix = localPath; return function (requestPath) { - // Build the new path by removing the public path - // and joining with the local path - const newPath = path.posix.join('/', localPath, '/', requestPath.slice(publicPath.length)); + // Figure out which server url was used by figuring out which + // path more closely matches requestPath + const startsWithLocal = requestPath.startsWith(localPath); + const startsWithPublic = requestPath.startsWith(publicPath); + const pathLengthToUse = + startsWithLocal && startsWithPublic + ? Math.max(localPath.length, publicPath.length) + : startsWithLocal + ? localPath.length + : publicPath.length; + + const newPath = path.posix.join('/', localPath, '/', requestPath.slice(pathLengthToUse)); + // Use the method for local routing return makeRoutablePath(newPath); };