diff --git a/src/utils/webdav.utils.ts b/src/utils/webdav.utils.ts index 28803f9..b11e4d6 100644 --- a/src/utils/webdav.utils.ts +++ b/src/utils/webdav.utils.ts @@ -2,6 +2,9 @@ import { Request } from 'express'; import path from 'path'; import { WebDavRequestedResource } from '../types/webdav.types'; export class WebDavUtils { + static getHref(...pathComponents: string[]): string { + return path.posix.join(...pathComponents); + } static getRequestedResource(req: Request): WebDavRequestedResource { const decodedUrl = decodeURI(req.url); const parsedPath = path.parse(decodedUrl); diff --git a/src/webdav/handlers/PROPFIND.handler.ts b/src/webdav/handlers/PROPFIND.handler.ts index 64ed813..fbb187a 100644 --- a/src/webdav/handlers/PROPFIND.handler.ts +++ b/src/webdav/handlers/PROPFIND.handler.ts @@ -1,7 +1,6 @@ import { WebDavMethodHandler, WebDavMethodHandlerOptions, WebDavRequestedResource } from '../../types/webdav.types'; import { XMLUtils } from '../../utils/xml.utils'; import { DriveFileItem, DriveFolderItem } from '../../types/drive.types'; -import path from 'path'; import { DriveFolderService } from '../../services/drive/drive-folder.service'; import { FormatUtils } from '../../utils/format.utils'; import { Request, Response } from 'express'; @@ -87,7 +86,7 @@ export class PROPFINDRequestHandler implements WebDavMethodHandler { const folderContent = await driveFolderService.getFolderContent(folderUuid); const foldersXML = folderContent.folders.map((folder) => { - const folderRelativePath = path.join(relativePath, folder.plainName, '/'); + const folderRelativePath = WebDavUtils.getHref(relativePath, folder.plainName, '/'); return this.driveFolderItemToXMLNode( { @@ -115,7 +114,10 @@ export class PROPFINDRequestHandler implements WebDavMethodHandler { ); const filesXML = folderContent.files.map((file) => { - const fileRelativePath = path.join(relativePath, file.type ? `${file.plainName}.${file.type}` : file.plainName); + const fileRelativePath = WebDavUtils.getHref( + relativePath, + file.type ? `${file.plainName}.${file.type}` : file.plainName, + ); return this.driveFileItemToXMLNode( { name: file.plainName, diff --git a/test/utils/webdav.utils.test.ts b/test/utils/webdav.utils.test.ts new file mode 100644 index 0000000..8fe4cd8 --- /dev/null +++ b/test/utils/webdav.utils.test.ts @@ -0,0 +1,34 @@ +import { expect } from 'chai'; +import { WebDavUtils } from '../../src/utils/webdav.utils'; +import { createWebDavRequestFixture } from '../fixtures/webdav.fixture'; + +describe('Webdav utils', () => { + it('When a list of path components are given, should generate a correct href', () => { + const href = WebDavUtils.getHref('/path', 'to', 'file'); + expect(href).to.equal('/path/to/file'); + }); + + it('When a list of path components are given, should generate a correct href and remove incorrect characters', () => { + const href = WebDavUtils.getHref('/path', 'to', 'folder/'); + expect(href).to.equal('/path/to/folder/'); + }); + + it('When a request is given, should generate the requested resource', () => { + const request = createWebDavRequestFixture({ + url: '/url/to/folder/', + }); + const resource = WebDavUtils.getRequestedResource(request); + expect(resource).to.deep.equal({ + url: '/url/to/folder/', + type: 'folder', + name: 'folder', + path: { + base: 'folder', + dir: '/url/to', + ext: '', + name: 'folder', + root: '/', + }, + }); + }); +}); diff --git a/test/webdav/handlers/PROPFIND.handler.test.ts b/test/webdav/handlers/PROPFIND.handler.test.ts index 393f077..356ae2b 100644 --- a/test/webdav/handlers/PROPFIND.handler.test.ts +++ b/test/webdav/handlers/PROPFIND.handler.test.ts @@ -105,7 +105,7 @@ describe('PROPFIND request handler', () => { sinon.assert.calledWith(response.status, 200); sinon.assert.calledWith( sendStub, - `${path.join('/', 'folder_1', '/')}HTTP/1.1 200 OKfolder_1Mon, 04 Mar 2024 15:11:01 GMT0`, + '/folder_1/HTTP/1.1 200 OKfolder_1Mon, 04 Mar 2024 15:11:01 GMT0', ); });