qemu/qapi
Antoine Damhet 7b13fc97d7 block/curl: add support for S3 presigned URLs
S3 presigned URLs are signed for a specific HTTP method (typically GET
for our use cases). The curl block driver currently issues a HEAD
request to discover the web server features and the file size, which
fails with 'HTTP 403' (forbidden).

Add a 'force-range' option that skips the HEAD request and instead
issues a minimal GET request (querying 1 byte from the server) to
extract the file size from the 'Content-Range' response header. To
achieve this the 'curl_header_cb' is redesigned to generically parse
HTTP headers.

$ $QEMU -drive driver=https,\
             'url=https://s3.example.com/some.img?X-Amz-Security-Token=XXX',
             force-range=true

Enabling the 'force-range' option without the web server specified with
@url supporting it might cause the server to respond successfully with
'HTTP 200' and attempt to send the whole file body. With the
'CURLOPT_NOBODY' option set the libcurl will skip reading after the
headers and close the connection. QEMU still gracefully detects the
missing feature. This might waste a small number of TCP packets but is
otherwise transparent to the user.

Acked-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Antoine Damhet <adamhet@scaleway.com>
Message-ID: <20260227-fix-curl-v3-v3-3-eb8a4d88feef@scaleway.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2026-03-10 15:48:48 +01:00
..
accelerator.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
acpi-hest.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
acpi.json qapi: add cross-references to acpi.json 2025-07-14 12:52:46 +02:00
audio.json qapi/audio: Fix description markup of AudiodevDBusOptions @nsamples 2025-11-04 13:34:42 +01:00
authz.json qapi: add cross-references to authz.json 2025-07-14 12:52:46 +02:00
block-core.json block/curl: add support for S3 presigned URLs 2026-03-10 15:48:48 +01:00
block-export.json qapi/block-export: Document FUSE's multi-threading 2026-03-10 12:12:04 +01:00
block.json qapi: add cross-references to block layer 2025-07-14 12:55:17 +02:00
char.json chardev: add logtimestamp option 2026-02-13 10:00:02 +01:00
common.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
compat.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
control.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
crypto.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
cryptodev.json qapi: remove trivial "Returns:" sections 2025-07-14 12:35:29 +02:00
cxl.json hw/cxl/events: Updates for rev3.2 memory module event record 2026-02-20 13:04:45 -05:00
dump.json qapi: Add more cross-references 2025-07-29 14:51:20 +02:00
ebpf.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
error.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
introspect.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
job.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
machine-common.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
machine-s390x.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
machine.json Remove the qemu-system-microblazeel target from the build 2026-03-02 09:48:10 +01:00
meson.build qapi/acpi-hest: add an interface to do generic CPER error injection 2025-10-05 08:06:32 -04:00
migration.json migration: introduce MIGRATION_STATUS_FAILING 2026-03-09 08:53:30 -03:00
misc-arm.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
misc-i386.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
misc.json qapi: add cross-references to misc modules 2025-07-14 12:58:13 +02:00
net.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
opts-visitor.c qapi: Inline and remove QERR_INVALID_PARAMETER definition 2024-04-24 09:50:58 +02:00
pci.json qapi: add cross-references to pci.json 2025-07-14 12:58:13 +02:00
pragma.json qapi/migration: Don't document MigrationParameter 2025-12-23 09:24:34 -05:00
qapi-clone-visitor.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qapi-dealloc-visitor.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qapi-forward-visitor.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qapi-schema.json qapi/acpi-hest: add an interface to do generic CPER error injection 2025-10-05 08:06:32 -04:00
qapi-type-helpers.c qapi: New strv_from_str_list() 2024-03-04 07:12:40 +01:00
qapi-util.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qapi-visit-core.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qdev.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
qmp-dispatch.c block: rename block/aio.h to qemu/aio.h 2025-12-27 10:11:12 +01:00
qmp-event.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qmp-registry.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qobject-input-visitor.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qobject-output-visitor.c qapi: change 'unsigned special_features' to 'uint64_t features' 2025-02-10 15:45:04 +01:00
qom.json qom: add 'confidential-guest-reset' property for x86 confidential vms 2026-02-27 14:48:04 +01:00
replay.json qapi: add cross-references to replay.json 2025-07-14 12:58:13 +02:00
rocker.json qapi: remove trivial "Returns:" sections 2025-07-14 12:35:29 +02:00
run-state.json target/i386: convert SEV-ES termination requests to guest panic events 2026-02-07 14:31:38 +01:00
sockets.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
stats.json qapi: Refill doc comments to conform to conventions 2025-11-04 13:34:42 +01:00
string-input-visitor.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
string-output-visitor.c string-output-visitor: Fix (pseudo) struct handling 2024-01-26 11:16:58 +01:00
tpm.json qapi: remove trivial "Returns:" sections 2025-07-14 12:35:29 +02:00
trace-events qapi: Generalize struct member policy checking 2021-10-29 18:23:09 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
trace.json qapi: rephrase return docs to avoid type name 2025-07-14 12:35:39 +02:00
transaction.json qapi: add cross-references to block layer 2025-07-14 12:55:17 +02:00
uefi.json docs/sphinx: remove special parsing for freeform sections 2025-07-14 10:08:27 +02:00
ui.json qapi: Clean up whitespace between definitions 2025-11-04 13:34:42 +01:00
vfio.json vfio/migration: Send VFIO_MIGRATION event before PRE_COPY_P2P transition 2026-02-18 10:54:57 +01:00
virtio.json Support per-head resolutions with virtio-gpu 2026-03-06 17:25:47 +00:00
yank.json qapi: add cross-references to yank.json 2025-07-14 12:58:13 +02:00