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',
);
});