Reading the body into a zero-length buffer returned io.EOF on an
already-exhausted reader, so empty files and directory markers always
failed. Use io.ReadFull and send an explicit Content-Length: 0 for
empty bodies instead of falling back to chunked encoding. Also fix an
error variable mix-up in the NewRequest error check.
S3-compatible services such as Alibaba Cloud OSS, Tencent COS and
Huawei OBS reject path-style URLs with 'SecondLevelDomainForbidden'
and only accept virtual-hosted style (https://bucket.endpoint/key).
This adds a UseVirtualHostedStyle field and SetVirtualHostedStyle()
setter. When enabled and a custom Endpoint is set, the first path
segment is treated as the bucket and prepended to the host as a
subdomain. AWS S3 and MinIO accept both styles, so this is a no-op
for them.
Includes tests for OSS-style endpoint, http/https scheme preservation
and the empty-path fallback used by ListBuckets-style operations.