@@ -2,6 +2,7 @@ import StorageErrorFactory from "../errors/StorageErrorFactory";
22import { ModifiedAccessConditions } from "../generated/artifacts/models" ;
33import Context from "../generated/Context" ;
44import { BlobModel , ContainerModel } from "../persistence/IBlobMetadataStore" ;
5+ import { generateQueryBlobWithTagsWhereFunction } from "../persistence/QueryInterpreter/QueryInterpreter" ;
56import ConditionalHeadersAdapter from "./ConditionalHeadersAdapter" ;
67import ConditionResourceAdapter from "./ConditionResourceAdapter" ;
78import { IConditionalHeaders } from "./IConditionalHeaders" ;
@@ -11,12 +12,14 @@ import IConditionResource from "./IConditionResource";
1112export function validateReadConditions (
1213 context : Context ,
1314 conditionalHeaders ?: ModifiedAccessConditions ,
14- model ?: BlobModel | ContainerModel | null
15+ model ?: BlobModel | ContainerModel | null ,
16+ isSourceBlob ?: boolean
1517) {
1618 new ReadConditionalHeadersValidator ( ) . validate (
1719 context ,
1820 new ConditionalHeadersAdapter ( context , conditionalHeaders ) ,
19- new ConditionResourceAdapter ( model )
21+ new ConditionResourceAdapter ( model ) ,
22+ isSourceBlob
2023 ) ;
2124}
2225
@@ -30,11 +33,13 @@ export default class ReadConditionalHeadersValidator
3033 * @param context
3134 * @param conditionalHeaders
3235 * @param resource
36+ * @param isSourceBlob
3337 */
3438 public validate (
3539 context : Context ,
3640 conditionalHeaders : IConditionalHeaders ,
37- resource : IConditionResource
41+ resource : IConditionResource ,
42+ isSourceBlob ?: boolean
3843 ) : void {
3944 // If-Match && If-Unmodified-Since && (If-None-Match || If-Modified-Since)
4045
@@ -66,7 +71,7 @@ export default class ReadConditionalHeadersValidator
6671 // If-Match
6772 const ifMatchPass = conditionalHeaders . ifMatch
6873 ? conditionalHeaders . ifMatch . includes ( resource . etag ) ||
69- conditionalHeaders . ifMatch [ 0 ] === "*"
74+ conditionalHeaders . ifMatch [ 0 ] === "*"
7075 : undefined ;
7176
7277 // If-Unmodified-Since
@@ -107,6 +112,16 @@ export default class ReadConditionalHeadersValidator
107112 if ( isModifiedSincePass === false && ifNoneMatchPass !== true ) {
108113 throw StorageErrorFactory . getNotModified ( context . contextId ! ) ;
109114 }
115+
116+ if ( conditionalHeaders . ifTags ) {
117+ const againstSourceBlob = isSourceBlob === undefined ? false : isSourceBlob ;
118+ const validateFunction = generateQueryBlobWithTagsWhereFunction ( context , conditionalHeaders . ifTags , againstSourceBlob ? 'x-ms-source-if-tags' : 'x-ms-if-tags' ) ;
119+
120+ if ( conditionalHeaders ?. ifTags !== undefined
121+ && validateFunction ( resource . blobItemWithTags ) . length === 0 ) {
122+ throw StorageErrorFactory . getConditionNotMet ( context . contextId ! ) ;
123+ }
124+ }
110125 }
111126 }
112127}
0 commit comments