azurite
Version:
An open source Azure Storage API compatible server
92 lines • 5.04 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateReadConditions = void 0;
const tslib_1 = require("tslib");
const StorageErrorFactory_1 = tslib_1.__importDefault(require("../errors/StorageErrorFactory"));
const QueryInterpreter_1 = require("../persistence/QueryInterpreter/QueryInterpreter");
const ConditionalHeadersAdapter_1 = tslib_1.__importDefault(require("./ConditionalHeadersAdapter"));
const ConditionResourceAdapter_1 = tslib_1.__importDefault(require("./ConditionResourceAdapter"));
function validateReadConditions(context, conditionalHeaders, model, isSourceBlob) {
new ReadConditionalHeadersValidator().validate(context, new ConditionalHeadersAdapter_1.default(context, conditionalHeaders), new ConditionResourceAdapter_1.default(model), isSourceBlob);
}
exports.validateReadConditions = validateReadConditions;
// tslint:disable: max-line-length
class ReadConditionalHeadersValidator {
/**
* Validate Conditional Headers for Blob Service Read Operations in Version 2013-08-15 or Later.
* @link https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations#specifying-conditional-headers-for-blob-service-read-operations-in-version-2013-08-15-or-later
*
* @param context
* @param conditionalHeaders
* @param resource
* @param isSourceBlob
*/
validate(context, conditionalHeaders, resource, isSourceBlob) {
// If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since)
// Read against a non exist resource
if (!resource.exist) {
// If-Match
if (conditionalHeaders.ifMatch && conditionalHeaders.ifMatch.length > 0) {
throw StorageErrorFactory_1.default.getConditionNotMet(context.contextId);
}
// If If-Unmodified-Since
// Skip for nonexistent resource
// If-None-Match
if (conditionalHeaders.ifNoneMatch &&
conditionalHeaders.ifNoneMatch.length > 0 &&
conditionalHeaders.ifNoneMatch[0] === "*") {
throw StorageErrorFactory_1.default.getUnsatisfiableCondition(context.contextId);
}
// If-Modified-Since
// Skip for nonexistent resource
}
else {
// Read against an existing resource
// If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since)
// If-Match
const ifMatchPass = conditionalHeaders.ifMatch
? conditionalHeaders.ifMatch.includes(resource.etag) ||
conditionalHeaders.ifMatch[0] === "*"
: undefined;
// If-Unmodified-Since
const ifUnModifiedSincePass = conditionalHeaders.ifUnmodifiedSince
? resource.lastModified <= conditionalHeaders.ifUnmodifiedSince
: undefined;
// If-None-Match
if (conditionalHeaders.ifNoneMatch &&
conditionalHeaders.ifNoneMatch.length > 0 &&
conditionalHeaders.ifNoneMatch[0] === "*") {
throw StorageErrorFactory_1.default.getUnsatisfiableCondition(context.contextId);
}
const ifNoneMatchPass = conditionalHeaders.ifNoneMatch
? !conditionalHeaders.ifNoneMatch.includes(resource.etag)
: undefined;
// If-Modified-Since
const isModifiedSincePass = conditionalHeaders.ifModifiedSince
? conditionalHeaders.ifModifiedSince < resource.lastModified
: undefined;
if (ifMatchPass === false) {
throw StorageErrorFactory_1.default.getConditionNotMet(context.contextId);
}
if (ifUnModifiedSincePass === false) {
throw StorageErrorFactory_1.default.getConditionNotMet(context.contextId);
}
if (ifNoneMatchPass === false && isModifiedSincePass !== true) {
throw StorageErrorFactory_1.default.getNotModified(context.contextId);
}
if (isModifiedSincePass === false && ifNoneMatchPass !== true) {
throw StorageErrorFactory_1.default.getNotModified(context.contextId);
}
if (conditionalHeaders.ifTags) {
const againstSourceBlob = isSourceBlob === undefined ? false : isSourceBlob;
const validateFunction = (0, QueryInterpreter_1.generateQueryBlobWithTagsWhereFunction)(context, conditionalHeaders.ifTags, againstSourceBlob ? 'x-ms-source-if-tags' : 'x-ms-if-tags');
if (conditionalHeaders?.ifTags !== undefined
&& validateFunction(resource.blobItemWithTags).length === 0) {
throw StorageErrorFactory_1.default.getConditionNotMet(context.contextId);
}
}
}
}
}
exports.default = ReadConditionalHeadersValidator;
//# sourceMappingURL=ReadConditionalHeadersValidator.js.map
;