@sync-in/server
Version:
The secure, open-source platform for file storage, sharing, collaboration, and sync
89 lines (88 loc) • 2.94 kB
JavaScript
/*
* 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