apache / apache/opendal

tracking: Azure Blob Delete does not honor If-None-Match wildcard semantics

Open
#8,176 0 comments 1 reaction 0 assignees View on GitHub
services/azblob
Dominant language
Rust
Stars
5.4k
Forks
825
Avg merge
1d 14m
Merged PRs (30d)
127

Description

### Summary

Azure Blob Storage's `Delete Blob` API accepts `If-None-Match`, but the live service does not apply the documented wildcard semantics when the value is `*`. It deletes an existing blob instead of rejecting the request.

This is an Azure Blob Storage service behavior discrepancy, not an OpenDAL bug. OpenDAL forwards the standard `If-None-Match` header unchanged.

### Live service reproduction

Reproduced against the actual Azure Blob Storage service on 2026-08-27 using raw Shared Key REST requests, without OpenDAL or Azurite. The requests used `x-ms-version: 2022-11-02`.

Wildcard case:

1. Create a blob: `201 Created`.
2. Delete it with `If-None-Match: *`: `202 Accepted`.
3. Issue `HEAD` for the blob: `404 BlobNotFound`.

The wildcard DELETE request ID was `91443d9d-701e-0018-5cfc-354f9c000000`.

Control case using the blob's current ETag:

1. Create another blob: `201 Created`.
2. Delete it with `If-None-Match: `: `412 ConditionNotMet`.
3. Issue `HEAD` for the blob: `200 OK`.

The control DELETE request ID was `c1929a10-701e-006a-13fc-3548d3000000`.

The control confirms that Azure evaluates `If-None-Match` for `DELETE`, but does not recognize `*` with its documented wildcard meaning.

### Expected behavior

Azure documents that `If-None-Match` accepts `*`, and that the wildcard condition fails when the target resource exists. For a `DELETE` request, the service should return `412 Precondition Failed` and leave the blob intact.

This also follows the HTTP semantics in RFC 9110 Section 13.1.2.

- [Azure Blob Storage conditional headers](https://learn.microsoft.com/en-us/rest/api/storageservices/specifying-conditional-headers-for-blob-service-operations)
- [Delete Blob](https://learn.microsoft.com/en-us/rest/api/storageservices/delete-blob)
- [RFC 9110 Section 13.1.2](https://www.rfc-editor.org/rfc/rfc9110.html#section-13.1.2)

### OpenDAL impact

This issue tracks the external service limitation and any future Azure resolution. It does not propose an OpenDAL fix:

- OpenDAL already sends the caller-provided `If-None-Match` value as a standard HTTP header.
- Emulating the condition with `HEAD` followed by unconditional `DELETE` would introduce a race and would not provide atomic conditional-delete semantics.
- OpenDAL may document or test this provider limitation where relevant, but it should not claim that Azure honors wildcard conditional delete until the live service behavior changes.

Related to #8141 and #8157.

AI assisted with the live-service reproduction and drafting. The contributor directed the scope and conclusion.

Contributor guide

Open the contributing guide

Research direction

Review related issues #8141 and #8157 alongside the linked Azure Blob Storage and RFC 9110 documentation. The issue identifies no OpenDAL file or test to change; done would require documenting or testing the provider limitation only if maintainers define that scope, or tracking an Azure service correction.

Written by the indexing model from the issue text.

Assessment

Tech stack
azure
Domain
cloud
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.