import { ifNoneMatchBlocks, strongEtagMatches } from "@/worker/dav/etag"; import { ifHeaderMatchesStateAndEtags, type ParsedIfHeader } from "@/worker/dav/if-header"; export interface DavConditionalInput { ifMatch: string | null; ifNoneMatch: string | null; ifHeader: ParsedIfHeader; targetHref: string; targetEtag: string | null; getEtag: (href: string) => string | null; getStateToken: (href: string) => string | null; } export function davConditionalFailure(input: DavConditionalInput): string | null { if (input.ifMatch && !strongEtagMatches(input.ifMatch, input.targetEtag)) { return "If-Match precondition failed"; } if (input.ifNoneMatch && input.targetEtag !== null && ifNoneMatchBlocks(input.ifNoneMatch, input.targetEtag)) { return "If-None-Match precondition failed"; } if ( !ifHeaderMatchesStateAndEtags({ header: input.ifHeader, targetHref: input.targetHref, targetEtag: input.targetEtag, getEtag: input.getEtag, getStateToken: input.getStateToken, }) ) { return "If precondition failed"; } return null; }