public validate()

in src/blob/conditions/ReadConditionalHeadersValidator.ts [38:126]


  public validate(
    context: Context,
    conditionalHeaders: IConditionalHeaders,
    resource: IConditionResource,
    isSourceBlob?: boolean
  ): void {
    // 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.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.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.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.getConditionNotMet(context.contextId!);
      }

      if (ifUnModifiedSincePass === false) {
        throw StorageErrorFactory.getConditionNotMet(context.contextId!);
      }

      if (ifNoneMatchPass === false && isModifiedSincePass !== true) {
        throw StorageErrorFactory.getNotModified(context.contextId!);
      }

      if (isModifiedSincePass === false && ifNoneMatchPass !== true) {
        throw StorageErrorFactory.getNotModified(context.contextId!);
      }

      if (conditionalHeaders.ifTags) {
        const againstSourceBlob = isSourceBlob === undefined ? false : isSourceBlob;
        const validateFunction = 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.getConditionNotMet(context.contextId!);
        }
      }
    }
  }