UNPKG

@sync-in/server

Version:

The secure, open-source platform for file storage, sharing, collaboration, and sync

89 lines (88 loc) 2.94 kB
/* * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com> * This file is part of Sync-in | The open source file sync and share solution * See the LICENSE file for licensing details */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: Object.getOwnPropertyDescriptor(all, name).get }); } _export(exports, { get extractAllTokens () { return extractAllTokens; }, get extractOneToken () { return extractOneToken; }, get parseIfHeader () { return parseIfHeader; } }); const _functions = require("../../../common/functions"); //IF HEADER Before : (<locktoken:a-write-lock-token> ["I am an ETag"]) (["I am another ETag"]) //IF HEADER After : [{"path":"/webdav/specs/","token":{"mustMatch":true,"value":"urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2"}, // "etag":{"mustMatch":true,"value":"W/\"A weak ETag\""}}, // {"path":"/webdav/specs/","etag":{"mustMatch":true,"value":"\"strong ETag\""}}] const ifHeaderRegExp = /(?:<([^>]+)>)?\s*\(([^)]+)\)/g; const ifHeaderInternalRegExp = /((not)|\[([^\]]+)\]|<(DAV:no-lock)>|<([^>]+)>|([^\s]+))/gi; function parseIfHeaderInternal(path, group) { let match = ifHeaderInternalRegExp.exec(group); let mustMatch = true; const state = path ? { path: path } : {}; while(match){ if (match[2]) { // not // inverse condition mustMatch = false; } else if (match[5] || match[6]) { // check if a lock token match state.token = { mustMatch, value: match[5] || match[6] }; mustMatch = true; } else if (match[3]) { // check if etag is matching state.etag = { mustMatch, value: match[3] }; mustMatch = true; } else if (match[4]) { // check if no lock exists (DAV:no-lock) state.haveLock = { mustMatch: !mustMatch }; mustMatch = true; } match = ifHeaderInternalRegExp.exec(group); } return state; } function parseIfHeader(ifHeader) { const orArray = []; let match = ifHeaderRegExp.exec(ifHeader); let path = undefined; while(match){ if (match[1]) { path = (0, _functions.urlToPath)(match[1]); } orArray.push(parseIfHeaderInternal(path, match[2])); match = ifHeaderRegExp.exec(ifHeader); } return orArray; } function extractOneToken(ifHeaders) { return ifHeaders[0].token.value; } function extractAllTokens(ifHeaders) { return ifHeaders ? ifHeaders.map((i)=>i.token?.value).filter(Boolean) : []; } //# sourceMappingURL=if-header.js.map