Skip to content

Commit 215973b

Browse files
committed
implemented OPTIONS operation
1 parent c0dd844 commit 215973b

2 files changed

Lines changed: 76 additions & 9 deletions

File tree

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
11
import { WebDavMethodHandler } from '../../types/webdav.types';
22
import { Request, Response } from 'express';
3+
import { WebDavUtils } from '../../utils/webdav.utils';
4+
import { webdavLogger } from '../../utils/logger.utils';
35

46
export class OPTIONSRequestHandler implements WebDavMethodHandler {
5-
handle = async (_: Request, res: Response) => {
6-
res.header('Allow', 'OPTIONS, GET, HEAD, POST, PUT, DELETE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK');
7-
res.header('DAV', '1, 2, ordered-collections');
8-
res.status(200).send();
7+
handle = async (req: Request, res: Response) => {
8+
const resource = await WebDavUtils.getRequestedResource(req);
9+
10+
webdavLogger.info(`[OPTIONS] Request received for ${resource.type} at ${resource.url}`);
11+
12+
if (resource.url === '/' || resource.url === '') {
13+
const allowedMethods = 'DELETE, GET, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND, PUT';
14+
webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
15+
res.header('Allow', 'DELETE, GET, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND, PUT');
16+
res.header('DAV', '1, 2, ordered-collections');
17+
res.status(200).send();
18+
return;
19+
}
20+
21+
if (resource.type === 'folder') {
22+
const allowedMethods = 'DELETE, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND';
23+
webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
24+
res.header('Allow', allowedMethods);
25+
res.header('DAV', '1, 2, ordered-collections');
26+
res.status(200).send();
27+
return;
28+
}
29+
30+
if (resource.type === 'file') {
31+
const allowedMethods = 'DELETE, GET, HEAD, MOVE, OPTIONS, PROPFIND, PUT';
32+
webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
33+
res.header('Allow', allowedMethods);
34+
res.header('DAV', '1, 2, ordered-collections');
35+
res.status(200).send();
36+
return;
37+
}
938
};
1039
}

test/webdav/handlers/OPTIONS.handler.test.ts

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ describe('OPTIONS request handler', () => {
88
vi.restoreAllMocks();
99
});
1010

11-
it('When a WebDav client sends an OPTIONS request, it should return the allowed methods', async () => {
11+
it('When the root folder is requested, it should return all of the server allowed methods', async () => {
1212
const requestHandler = new OPTIONSRequestHandler();
1313

1414
const request = createWebDavRequestFixture({
1515
method: 'OPTIONS',
1616
user: UserSettingsFixture,
17+
url: '/',
1718
});
1819
const response = createWebDavResponseFixture({
1920
header: vi.fn(),
@@ -23,10 +24,47 @@ describe('OPTIONS request handler', () => {
2324
await requestHandler.handle(request, response);
2425

2526
expect(response.status).toHaveBeenCalledWith(200);
26-
expect(response.header).toHaveBeenCalledWith(
27-
'Allow',
28-
'OPTIONS, GET, HEAD, POST, PUT, DELETE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK',
29-
);
27+
expect(response.header).toHaveBeenCalledWith('Allow', 'DELETE, GET, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND, PUT');
28+
expect(response.header).toHaveBeenCalledWith('DAV', '1, 2, ordered-collections');
29+
});
30+
31+
it('When a folder is requested, it should return all of the folder allowed methods', async () => {
32+
const requestHandler = new OPTIONSRequestHandler();
33+
34+
const request = createWebDavRequestFixture({
35+
method: 'OPTIONS',
36+
user: UserSettingsFixture,
37+
url: '/folder/',
38+
});
39+
const response = createWebDavResponseFixture({
40+
header: vi.fn(),
41+
status: vi.fn().mockReturnValue({ send: vi.fn() }),
42+
});
43+
44+
await requestHandler.handle(request, response);
45+
46+
expect(response.status).toHaveBeenCalledWith(200);
47+
expect(response.header).toHaveBeenCalledWith('Allow', 'DELETE, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND');
48+
expect(response.header).toHaveBeenCalledWith('DAV', '1, 2, ordered-collections');
49+
});
50+
51+
it('When a file is requested, it should return all of the file allowed methods', async () => {
52+
const requestHandler = new OPTIONSRequestHandler();
53+
54+
const request = createWebDavRequestFixture({
55+
method: 'OPTIONS',
56+
user: UserSettingsFixture,
57+
url: '/file',
58+
});
59+
const response = createWebDavResponseFixture({
60+
header: vi.fn(),
61+
status: vi.fn().mockReturnValue({ send: vi.fn() }),
62+
});
63+
64+
await requestHandler.handle(request, response);
65+
66+
expect(response.status).toHaveBeenCalledWith(200);
67+
expect(response.header).toHaveBeenCalledWith('Allow', 'DELETE, GET, HEAD, MOVE, OPTIONS, PROPFIND, PUT');
3068
expect(response.header).toHaveBeenCalledWith('DAV', '1, 2, ordered-collections');
3169
});
3270
});

0 commit comments

Comments
 (0)