Skip to content

Commit

Permalink
[PB-1340]:(feature) Generate HREF for PROPFIND correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
PixoDev committed Mar 13, 2024
1 parent 2b687cf commit 052dc06
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 4 deletions.
3 changes: 3 additions & 0 deletions src/utils/webdav.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 5 additions & 3 deletions src/webdav/handlers/PROPFIND.handler.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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(
{
Expand Down Expand Up @@ -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,
Expand Down
34 changes: 34 additions & 0 deletions test/utils/webdav.utils.test.ts
Original file line number Diff line number Diff line change
@@ -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: '/',
},
});
});
});
2 changes: 1 addition & 1 deletion test/webdav/handlers/PROPFIND.handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ describe('PROPFIND request handler', () => {
sinon.assert.calledWith(response.status, 200);
sinon.assert.calledWith(
sendStub,
`<?xml version="1.0" encoding="utf-8" ?><multistatus xmlns:D="DAV:"><response><href>${path.join('/', 'folder_1', '/')}</href><propstat><status>HTTP/1.1 200 OK</status><prop><displayname>folder_1</displayname><getlastmodified>Mon, 04 Mar 2024 15:11:01 GMT</getlastmodified><getcontentlength>0</getcontentlength><resourcetype><collection></collection></resourcetype></prop></propstat></response></multistatus>`,
'<?xml version="1.0" encoding="utf-8" ?><multistatus xmlns:D="DAV:"><response><href>/folder_1/</href><propstat><status>HTTP/1.1 200 OK</status><prop><displayname>folder_1</displayname><getlastmodified>Mon, 04 Mar 2024 15:11:01 GMT</getlastmodified><getcontentlength>0</getcontentlength><resourcetype><collection></collection></resourcetype></prop></propstat></response></multistatus>',
);
});

Expand Down

0 comments on commit 052dc06

Please sign in to comment.