Skip to main content
Version: v1.4 (stable)

Storage

Azure REST API reference

This page tracks which Azure Storage REST API operations are implemented in Topaz, split by control plane (ARM resource management) and data plane (Blob Storage on port 8891, Table Storage on port 8890).

Legend

SymbolMeaning
Implemented
Not implemented

Control Plane

The control plane covers ARM operations available under management.azure.com — creating and managing storage accounts.

Storage Accounts

REST reference

OperationStatusNotes
CreateVia PUT (CreateOrUpdate)
Delete
Get Properties
ListGET /subscriptions/{subscriptionId}/providers/Microsoft.Storage/storageAccounts
List By Resource Group
List KeysPOST .../listKeys
Check Name AvailabilityPOST /subscriptions/{subscriptionId}/providers/Microsoft.Storage/checkNameAvailability
UpdatePATCH .../storageAccounts/{accountName}
Regenerate KeyPOST .../regenerateKey
List Account SASPOST .../ListAccountSas
List Service SASPOST .../ListServiceSas
Failover
Restore Blob Ranges
Revoke User Delegation Keys
Abort Hierarchical Namespace Migration
Hierarchical Namespace Migration
Customer Initiated Migration
Get Customer Initiated Migration

Data Plane — Blob Storage

Blob Storage is served on port 8891 (HTTP) in Topaz.

Containers

OperationStatusNotes
Create ContainerPUT /{containerName}?restype=container
Get Container
Delete Container
List ContainersGET /
Set Container MetadataPUT /{containerName}?restype=container&comp=metadata
Get Container MetadataGET /{containerName}?restype=container&comp=metadata
Get Container ACLGET /{containerName}?restype=container&comp=acl
Set Container ACLPUT /{containerName}?restype=container&comp=acl
Lease ContainerPUT /{containerName}?restype=container&comp=lease — acquire, renew, change, release, break

Blobs

OperationStatusNotes
Put BlobUpload blob
Get BlobGET /{containerName}/{blobName} — returns blob content with Content-Type, Content-Length, ETag, x-ms-blob-type headers
Delete Blob
Head Blob
Set Blob MetadataPUT /{containerName}/{blobName}?comp=metadata
Get Blob MetadataGET /{containerName}/{blobName}?comp=metadata
Get Blob PropertiesHEAD /{containerName}/{blobName} — returns Content-Type, Content-Length, ETag, Last-Modified, x-ms-blob-type, x-ms-creation-time, x-ms-meta-*
Set Blob PropertiesPUT /{containerName}/{blobName}?comp=properties
List BlobsGET /{containerName}
Copy BlobPUT /{containerName}/{blobName} with x-ms-copy-source header; synchronous within-emulator copy
Put BlockPUT /{containerName}/{blobName}?comp=block&blockid={blockId} — stages a block for later commit via Put Block List
Put Block ListPUT /{containerName}/{blobName}?comp=blocklist — assembles staged blocks into a committed blob
Get Block ListGET /{containerName}/{blobName}?comp=blocklistblocklisttype supports committed, uncommitted, all
Put PagePUT /{containerName}/{blobName}?comp=page — supports x-ms-page-write: update (write) and clear (zero-fill); range must be 512-byte aligned
Get Page RangesGET /{containerName}/{blobName}?comp=pagelist — supports Range/x-ms-range filtering and returns Azure-compatible PageList XML
Lease BlobPUT /{containerName}/{blobName}?comp=lease — acquire, renew, change, release, break
Snapshot Blob
Undelete Blob

Blob Service

OperationStatusNotes
Get Blob Service StatsGET /?restype=service&comp=stats — secondary endpoint only; returns 403 for non-RA-GRS accounts

Data Plane — Table Storage

Table Storage is served on port 8890 (HTTPS) in Topaz.

Service

OperationStatusNotes
Get Table Service PropertiesGET /
Set Table Service PropertiesPUT /?restype=service&comp=properties
Get Table Service StatsGET /?restype=service&comp=stats
Preflight Table RequestOPTIONS /{resourcePath}

Tables

OperationStatusNotes
Create TablePOST /Tables
Delete TableDELETE /Tables('{tableName}')
Query TablesGET /Tables
Get TableGET /Tables('{tableName}')
Get Table ACLGET /{tableName}?comp=acl
Set Table ACLPUT /{tableName}?comp=acl

Entities

OperationStatusNotes
Insert EntityPOST /{tableName}
Get EntityGET /{tableName}(PartitionKey='{pk}',RowKey='{rk}')
Upsert Entity (InsertOrReplace)PUT /{tableName}(...)
Merge Entity (InsertOrMerge)PATCH
Delete EntityDELETE /{tableName}(PartitionKey='{pk}',RowKey='{rk}')
Query EntitiesGET /{tableName} — supports $filter (OData v3: eq, ne, gt, ge, lt, le, and, or, not; string, int32, int64, bool, datetime, guid literals), $select, $top, and server-side paging via NextPartitionKey/NextRowKey continuation headers

Data Plane — Queue Storage

Queue Storage is served on port 8893 (HTTPS) in Topaz.

Service

OperationStatusNotes
Get Queue Service PropertiesGET /?restype=service&comp=properties
Set Queue Service PropertiesPUT /?restype=service&comp=properties
Get Queue Service StatsGET /?restype=service&comp=stats — secondary endpoint only; returns 403 for non-RA-GRS accounts

Queues

OperationStatusNotes
Create QueuePUT /{queue-name}
Delete QueueDELETE /{queue-name}
List QueuesGET /?comp=list
Get Queue MetadataGET /{queue-name}?comp=metadata
Set Queue MetadataPUT /{queue-name}?comp=metadata
Get Queue ACLGET /{queue-name}?comp=acl
Set Queue ACLPUT /{queue-name}?comp=acl

Messages

OperationStatusNotes
Send Message (Enqueue)POST /{queue-name}/messages
Get Messages (Dequeue)GET /{queue-name}/messages — retrieve with visibility timeout
Peek MessagesGET /{queue-name}/messages?peekonly=true — retrieve without hiding
Delete MessageDELETE /{queue-name}/messages/{messageId}?popreceipt={popReceipt}
Update MessagePUT /{queue-name}/messages/{messageId} — update visibility timeout and/or content
Clear MessagesDELETE /{queue-name}/messages

Service SAS Authentication

Topaz validates Service SAS tokens on all three data-plane services. The signature is verified using HMAC-SHA256 with the storage account key. Stored access policies (si= parameter) are resolved from the persisted ACL of each resource.

ServiceSAS resource type (sr=)StatusNotes
BlobContainer (c)StringToSign: 16 fields including sr, si, sip, spr, response header overrides
BlobBlob (b)Full blob-level SAS (read, write, delete, create, add)
BlobStored access policy (si=)Policy resolved from .container-acl.xml; expiry / permissions merged from stored policy
QueueQueue (q)StringToSign: 8 fields; add/process/read/update permissions
QueueStored access policy (si=)Policy resolved from .acl.xml
TableTable (t)StringToSign: 12 fields including spk/srk/epk/erk row-range fields
TableStored access policy (si=)Policy resolved from acl/{policyId}.xml
Known Limitations
  • IP range restriction (sip=): The sip parameter is detected and logged but not enforced. All source IPs are permitted regardless of the sip value in the SAS token.
  • Permission-letter enforcement (sp=): The sp permission letters are not checked against the HTTP verb of the incoming request (e.g. r→GET, w→PUT, d→DELETE). Any cryptographically valid SAS token is accepted regardless of the declared permissions. Verb-level enforcement is tracked in the backlog for a future release.

Account SAS Authentication

Topaz validates Account SAS tokens on all three data-plane services. The signature is verified using HMAC-SHA256 with the storage account key, with full support for the sv, ss, srt, sp, se, st, sip, spr, and ses parameters.

Detection: Account SAS tokens are identified by the simultaneous presence of sv=, sig=, ss=, and srt= query parameters. This distinguishes them from Service SAS tokens (which lack ss= and srt=).

ServiceResource type (srt=)StatusNotes
Blob (ss=b)Service (s)Service-level operations (list containers, get/set service properties)
Blob (ss=b)Container (c)Container-level operations (list blobs, create/delete container)
Blob (ss=b)Object (o)Blob-level operations (get, put, delete blob)
Queue (ss=q)Service (s)Service-level operations (list queues, get/set service properties)
Queue (ss=q)Container (c)Queue-level operations (create/delete queue, get metadata)
Queue (ss=q)Object (o)Message-level operations (send, receive, delete, update messages)
Table (ss=t)Service (s)Service-level operations (get/set service properties)
Table (ss=t)Container (c)Table-level operations (query tables, create/delete table)
Table (ss=t)Object (o)Entity-level operations (query, insert, update, delete entities)

The StringToSign format follows the spec:

  • For sv < 2020-12-06: accountName\nsp\nss\nsrt\nst\nse\nsip\nspr\nsv\n
  • For sv >= 2020-12-06: accountName\nsp\nss\nsrt\nst\nse\nsip\nspr\nsv\nses\n (adds signed encryption scope)
Known Limitations
  • IP range restriction (sip=): The sip parameter is detected and logged but not enforced.
  • HTTP method enforcement (sp=): Permission letters are validated against the HTTP method of the request (e.g. r→GET, w→PUT, d→DELETE, a→POST add, p→GET process). Enforcement is complete for standard CRUD operations.
  • Encryption scope (ses=): The ses field is included in the StringToSign for versions ≥ 2020-12-06 but the encryption scope is not applied to storage operations.
Star on GitHub