2025-10-01 19:55:38 +02:00

142 lines
4.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var IResource_1 = require("../../resource/v1/IResource");
var Errors_1 = require("../../Errors");
var url = require("url");
function NoLock() {
return function (r, callback) {
r.getLocks(function (e, locks) {
if (e === Errors_1.Errors.MustIgnore)
callback(null, true);
else
callback(e, locks ? locks.length === 0 : false);
});
};
}
function Token(token) {
return function (r, callback) {
r.getLock(token, function (e, lock) {
if (e === Errors_1.Errors.MustIgnore)
callback(null, true);
else
callback(e, !!lock && !e);
});
};
}
function Tag(tag) {
return function (r, callback) {
r.lastModifiedDate(function (e, lastModifiedDate) {
if (e === Errors_1.Errors.MustIgnore)
callback(null, true);
else
callback(e, !e && IResource_1.ETag.createETag(lastModifiedDate) === tag);
});
};
}
function Not(filter) {
return function (r, callback) {
filter(r, function (e, v) {
callback(e, !v);
});
};
}
function parseInternal(group) {
var rex = /((not)|<([^>]+)>|\[([^\]]+)\]|<(DAV:no-lock)>)/ig;
var match = rex.exec(group);
var isNot = false;
var andArray = [];
function add(filter) {
andArray.push(isNot ? Not(filter) : filter);
isNot = false;
}
while (match) {
if (match[2]) { // not
isNot = true;
}
else if (match[3]) { // lock-token
add(Token(match[3]));
}
else if (match[4]) { // tag
add(Tag(match[4]));
}
else if (match[5]) { // DAV:no-lock
add(NoLock());
}
match = rex.exec(group);
}
if (andArray.length)
return function (r, callback) { return callback(null, true); };
return function (r, callback) {
var nb = andArray.length;
function done(error, result) {
if (nb <= 0)
return;
if (error) {
nb = -1;
callback(error, false);
return;
}
--nb;
if (nb === 0 || !result) {
nb = -1;
callback(null, result);
}
}
andArray.forEach(function (a) { return a(r, done); });
};
}
function extractOneToken(ifHeader) {
var match = /^[ ]*\([ ]*<([^>]+)>[ ]*\)[ ]*$/.exec(ifHeader);
if (!match)
return null;
else
return match[1];
}
exports.extractOneToken = extractOneToken;
function parseIfHeader(ifHeader) {
var rex = /(?:<([^>]+)>)?\s*\(([^\)]+)\)/g;
var match = rex.exec(ifHeader);
var orArray = [];
var oldPath = undefined;
while (match) {
if (match[1])
oldPath = url.parse(match[1]).path;
orArray.push({
path: oldPath,
actions: parseInternal(match[2])
});
match = rex.exec(ifHeader);
}
if (orArray.length)
return function (arg, r, callback) { return callback(null, true); };
return function (arg, r, callback) {
var nb = orArray.length;
function done(error, result) {
if (nb <= 0)
return;
if (error) {
nb = -1;
callback(error, false);
return;
}
--nb;
if (nb === 0 || result) {
nb = -1;
callback(null, result);
}
}
orArray.forEach(function (a) {
if (!a.path)
a.actions(r, done);
else
arg.server.getResourceFromPath(arg, a.path, function (e, resource) {
if (e)
done(e, null);
else
a.actions(resource, done);
});
});
};
}
exports.parseIfHeader = parseIfHeader;