Skip to main content

CI PyPI version PyPI downloads License: MIT Rust edition

<osp⚡> object-storage-proxy

A fast, in-process reverse proxy for AWS S3 and IBM Cloud Object Storage, built on Cloudflare's pingora. It exposes a Python interface so you can plug in your own credential fetching, request signing, and authorization logic without touching the Rust core.

Note: This project is under active development. APIs are likely to change before 1.0.

Why

Object storage backends like IBM COS assign one endpoint and one set of credentials per storage instance, which may contain many buckets. Managing credentials and endpoints across instances becomes cumbersome, especially when clients expect a single uniform endpoint.

This proxy solves that by:

  1. Translating path-style requests (http://proxy/bucket/key) to virtual-hosted-style (https://bucket.s3.region.host/key) on the way out.
  2. Re-signing requests with the correct backend credentials, so clients only need one keypair pointed at the proxy.
  3. Calling your Python functions for credential lookup and request authorization, with TTL-based caching.

Request lifecycle

Request stages

Features

  • Compatible with any AWS S3-compatible client: aws-cli, boto3, polars, spark, datafusion, presto, trino, ...
  • Normalises differences between S3-compatible backends so clients work regardless of whether the backend is AWS S3, MinIO, Garage, or IBM COS (see Backend compatibility below).
  • Decouples frontend authentication (what the client sends) from backend authentication (what the storage expects).
  • Python callables for credential fetching, HMAC key lookup, and per-request authorization.
  • TTL-based credential and authorization caching.
  • HTTP and HTTPS frontends (HTTPS supports HTTP/2).
  • Configurable thread count and per-URL request counting.
  • Presigned URL support with configurable max-usage limiting.
  • Built-in Prometheus metrics endpoint (/metrics) — on by default, opt-out via --no-default-features.

Installation

pip install object-storage-proxy

Or install from source (requires Rust stable and uv):

git clone https://github.com/opensourceworks-org/object-storage-proxy.git
cd object-storage-proxy
uv run maturin develop --release

See DEVELOP.md for full develop/build instructions including Nix and Taskfile usage.

Quick start

1. Configure your AWS client

~/.aws/config:

[profile osp]
region = eu-west-3
output = json
services = osp-services
s3 =
    addressing_style = path

[services osp-services]
s3 =
  endpoint_url = http://localhost:6190

~/.aws/credentials:

[osp]
aws_access_key_id = MYCLIENTID
aws_secret_access_key = myclientsecret

The aws_access_key_id is passed as the token argument to your Python callables. It can be any identifier meaningful to your auth system: an internal client ID, an OAuth2 subject, etc.

2. Write your server script

import json
import os
from object_storage_proxy import ProxyServerConfig, start_server

def fetch_credentials(token: str, bucket: str) -> str:
    # Return either an IBM COS API key string, or a JSON string:
    # '{"access_key": "...", "secret_key": "..."}'
    return json.dumps({
        "access_key": os.environ["BACKEND_ACCESS_KEY"],
        "secret_key": os.environ["BACKEND_SECRET_KEY"],
    })

def lookup_secret(access_key: str) -> str | None:
    # Called to verify incoming HMAC signatures.
    return os.getenv("MYCLIENTSECRET") if access_key == "MYCLIENTID" else None

def authorize(token: str, bucket: str, request: dict) -> bool:
    # Return True to allow, False to deny.
    return True

cos_map = {
    "my-bucket": {
        "host": "s3.eu-de.cloud-object-storage.appdomain.cloud",
        "region": "eu-de",
        "port": 443,
        "ttl": 300,
    },
}

config = ProxyServerConfig(
    cos_map=cos_map,
    bucket_creds_fetcher=fetch_credentials,
    hmac_fetcher=lookup_secret,
    validator=authorize,
    http_port=6190,
)

start_server(config)

3. Run it

uv run python my_server.py

4. Use it

aws s3 ls s3://my-bucket/ --profile osp
aws s3 cp file.txt s3://my-bucket/file.txt --profile osp

A fuller example with HTTPS, HMAC keystores, and IBM COS is in examples/minimal_server.py.

Configuration reference

ProxyServerConfig

Parameter Type Required Default Description
cos_map dict yes Bucket-to-backend mapping. See below.
hmac_keystore list[dict] no [] Static HMAC keypairs accepted on the frontend.
bucket_creds_fetcher callable(token, bucket) -> str no Called once per bucket to fetch backend credentials. Return an IBM COS API key string or {"access_key":...,"secret_key":...} JSON.
hmac_fetcher callable(access_key) -> str | None no Called per request to resolve a secret key from an access key, used to verify incoming signatures.
validator callable(token, bucket[, request]) -> bool no Called per request to authorize access. Cached by (token, bucket) for the bucket TTL.
http_port int one of http/https required HTTP listener port.
https_port int one of http/https required HTTPS listener port (HTTP/2 supported).
threads int no 1 Number of worker threads.
verify bool no None Disable TLS verification on upstream connections. Development only.
skip_signature_validation bool no False Skip verification of incoming request signatures. Development only.
max_presign_url_usage_attempts int no 3 Max times a presigned URL may be used before being rejected.
server_name str no "osp" Server name included in log output.
metrics_port int no None Port to expose the Prometheus /metrics scrape endpoint. When None no endpoint is started.

cos_map entries

Each key is the bucket name as the client addresses it. The value is a dict:

Field Required Description
host yes Backend hostname
port yes Backend port (typically 443)
region no AWS/COS region string
apikey no IBM COS IAM API key (mutually exclusive with access_key/secret_key)
access_key no Backend HMAC access key
secret_key no Backend HMAC secret key
ttl no Credential and auth cache TTL in seconds. Default 300. Set to 0 to disable.
addressing_style no "path" or "virtual" (default "virtual")
is_tls_enabled no Defaults to true when port is 443

Python callable signatures

# Fetch backend credentials for a bucket.
# token: the access key from the client's Authorization header.
# Return an IBM COS API key string, or JSON: '{"access_key":"...","secret_key":"..."}'
def fetch_credentials(token: str, bucket: str) -> str: ...

# Resolve the secret key for an access key (used to verify incoming signatures).
def lookup_secret(access_key: str) -> str | None: ...

# Authorize a request. request dict contains: method, path, query, headers.
def authorize(token: str, bucket: str, request: dict | None = None) -> bool: ...

Backend compatibility

S3-compatible backends differ in how strictly they follow the AWS S3 specification. OSP irons out these differences so clients don't need to care which backend is underneath.

Behaviour AWS S3 spec Garage MinIO OSP handling
Content-MD5 on DeleteObjects Required Accepted without it (lenient) Enforced (400 if missing) Forwarded when present; test suite injects it because botocore ≥ 1.43 no longer sends it by default
x-amz-tagging-directive on CopyObject COPY or REPLACE N/A (tagging not implemented) ✅ enforced Header is in OSP's forwarding allowlist — was previously stripped
PutObjectTagging / GetObjectTagging Supported NotImplemented Forwarded; backend limitation is transparent
If-Match / If-Unmodified-Since on GET Must return 412 Returns 200 (header ignored) ✅ Returns 412 Forwarded; backend limitation is transparent
ListMultipartUploads with Prefix ending in / Returns matching uploads ✅ works Returns empty list (MinIO bug) Forwarded; MinIO limitation documented as xfail in the test suite

botocore ≥ 1.43 note: Recent versions of boto3 switched from Content-MD5 to x-amz-checksum-crc32 for body integrity on DeleteObjects, regardless of the request_checksum_calculation setting. Content-MD5 is still required by MinIO. If you use boto3 ≥ 1.43 directly against MinIO through OSP you may need to inject Content-MD5 manually via a before-sign event hook — see DEVELOP.md for details and example code.

The integration test suite covers all of the above: every test runs parametrized over both Garage and MinIO backends, so regressions surface immediately. See DEVELOP.md for the full compliance table and the internal proxy fixes that enable it.

Prometheus metrics

The proxy ships with a built-in Prometheus scrape endpoint. Set metrics_port to enable it:

config = ProxyServerConfig(
    cos_map=cos_map,
    http_port=6190,
    metrics_port=9090,   # exposes http://localhost:9090/metrics
)

Then scrape it:

curl http://localhost:9090/metrics

Or add a Prometheus scrape config:

scrape_configs:
  - job_name: object-storage-proxy
    static_configs:
      - targets: ["localhost:9090"]

Exposed metrics (all prefixed osp_):

Metric Type Labels Description
osp_requests_total Counter method, bucket, status Total proxied requests
osp_request_errors_total Counter method, bucket, error 4xx / 5xx responses
osp_transfer_bytes_total Counter direction (rx/tx), bucket Bytes transferred
osp_presigned_url_hits_total Counter bucket Presigned URL uses
osp_presigned_url_rejected_total Counter bucket Presigned URLs rejected (over limit)
osp_active_connections Gauge In-flight connections
osp_memory_bytes Gauge Resident set size (Linux only)
osp_build_info Gauge version, rustc Static build metadata
osp_request_duration_seconds Histogram method, bucket End-to-end request latency
osp_response_size_bytes Histogram method, bucket Response body size

To build without the metrics endpoint:

maturin develop --no-default-features

HTTPS setup

Generate a self-signed certificate for local development:

openssl req -x509 -nodes -days 365 \
  -newkey rsa:4096 \
  -keyout key.pem \
  -out cert.pem \
  -config localhost.cnf

export TLS_CERT_PATH=/path/to/cert.pem
export TLS_KEY_PATH=/path/to/key.pem

Then pass https_port=8443 to ProxyServerConfig.

Environment variables

See .env.example for the full list. Key variables:

Variable Description
COS_API_KEY IBM COS IAM API key
AWS_ACCESS_KEY / AWS_SECRET_KEY AWS backend credentials
TLS_CERT_PATH / TLS_KEY_PATH Paths to TLS certificate and key
OSP_ENABLE_REQUEST_COUNTING Set to true to enable per-URL request counting
AWS_REQUEST_CHECKSUM_CALCULATION Set to WHEN_REQUIRED to avoid checksum errors with AWS CLI v2

Build targets

Pre-built wheels are published to PyPI for the following platforms:

Platform Architecture Libc Python
Linux (ubuntu-22.04) x86_64 glibc (manylinux) 3.x
Linux (ubuntu-22.04) aarch64 glibc (manylinux) 3.x
Linux (alpine 3.18) x86_64 musl (musllinux_1_2) 3.x
macOS (macos-14) aarch64 (Apple Silicon) 3.x
Source distribution any any 3.x

Windows builds are not currently active in CI. An sdist is always published so you can build from source on any platform with Rust stable installed.

Building from source

See BUILD.md.

Roadmap

These backlog items are currently not yet implemented:

  • Pass path and method to Python callbacks; cache by (token, bucket, path, method)
  • Expose pingora server and service configuration directly to Python
  • Spark streaming write support
  • AWS CLI checksum workaround (aws/aws-cli#9214)
  • Allow same bucket name on different providers
  • Pluggable distributed cache

Contributing

See CONTRIBUTING.md. Bug reports and feature requests go through GitHub Issues.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

object_storage_proxy-0.6.12.tar.gz (1.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

object_storage_proxy-0.6.12-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

object_storage_proxy-0.6.12-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

object_storage_proxy-0.6.12-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

object_storage_proxy-0.6.12-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

object_storage_proxy-0.6.12-cp314-cp314-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

object_storage_proxy-0.6.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

object_storage_proxy-0.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

object_storage_proxy-0.6.12-cp313-cp313-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

object_storage_proxy-0.6.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

object_storage_proxy-0.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

object_storage_proxy-0.6.12-cp312-cp312-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

object_storage_proxy-0.6.12-cp311-cp311-musllinux_1_2_x86_64.whl (7.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

object_storage_proxy-0.6.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

object_storage_proxy-0.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

object_storage_proxy-0.6.12-cp311-cp311-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

object_storage_proxy-0.6.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

object_storage_proxy-0.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

File details

Details for the file object_storage_proxy-0.6.12.tar.gz.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12.tar.gz
Algorithm Hash digest
SHA256 9dd915382704449d07c1c6ff524fb1634357e17607868a91176e0593a5c1428c
MD5 3e4c8af7f905efa66ac2279461142520
BLAKE2b-256 9b69e28d94dd6086a2e9386044b5058f47d8078846103db7cdad33b1b4452b0b

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 02f0ff0afb4b68a5e92e22e3ff42869bd3463eaebc9d14947b92fb3b97f95750
MD5 d09dd762876ce6f20404f28d7d70b52e
BLAKE2b-256 c18895c12ec3843170f40faa439de65bee3c2817b6135686e22f43ef83942e53

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 867c0eabd98964aea447cbb31b3aaca9559a706092da2b069fd14fdfe516a00d
MD5 0d01d549848cf2bb8251a11aba1bdbc1
BLAKE2b-256 5f48386d2bda33a8dc25bb42f6d611efbd6305adc2386c134644b7c94518b920

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8f4bbe75bd20a93fdc6a9e2e3ffb9cf1ee7cfaa83b74f2164d416f06e2c2e174
MD5 468cafebd9be68556ef8bbe6e869fecf
BLAKE2b-256 9f8524795c508c783b09fa9af1e3cd5c2a84407474100149a06db392151b519a

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4bc98c4a1d025f38ed017a68e450153d0d21e40747e547a898131c4c5cf19cd5
MD5 b779f1fd4a2be2aed47cfed34fff81dd
BLAKE2b-256 263dfbf9c8a89b3b04e62299b35f646dfec2f0025c735798a805bc99b39dee2c

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 013510ac28c047cd231e8433b830f4a3aef4817e79e67dbbdb2f2cb631e890d7
MD5 000bb067a98251de61f7602b638f1d41
BLAKE2b-256 b103f3e7472994467d011c321644a897067d823db4481811a775994d0e758a09

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 dda093b243165893c41b42cf7ef2bc90d9acb2c1235805c608578cb7e4d0b4c7
MD5 2a0129b0d815e7126887fc1d8aa3d193
BLAKE2b-256 60ad643c570a2a94f947add4665e483af21c5054794819f5588ed11972764e89

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6376255382fee7636c81ec481785b0891fc49eedca29ed2251f29c8abd02f707
MD5 8744805c432370a6b541c82c57062d55
BLAKE2b-256 0beb96fb53d01345ee55471f3b64fa801773ab478c6c35e48431a49034840e62

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e145a66626b7f9d9c9e5420e0b99aa6830d24a24d9927d35d64edd8dd1efc40c
MD5 7ec97e22e628cec5ddeb39c3c850f617
BLAKE2b-256 92d7c22b4f4548164b023c8acf34523ed5021b2166f494e4cd476feffdcc2488

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 74f62ef5668011611952723952b01555a92413bd13fab4791b32ac7efa3f68e7
MD5 538f59af6c4d5266f801c2c1f2be3bef
BLAKE2b-256 bbe346225f85e284f7cbb3465e33ea092e4767e11b1d1622c4fac061d3308816

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 af8d7f01f2e1ce6a7f4446d444ca38c4598ed239063e6a66c13d86f4991b7b9c
MD5 6953dc6909eef65755bebff4e7cc9fcd
BLAKE2b-256 aaa8b779a43b67583282560c60777c6046f2d51543b57ee3d6bcf6f4ebefa533

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd624c81885875ef0751fa80359f6a2dda74bc7897d238c0c24f2c355e7fb1cf
MD5 4edf9b0f5fc6e04e7caaa1c33ba01db9
BLAKE2b-256 dff0ac3dd397975f95081fcdab7203b3a73c642ea64b2efbfd2ab3570dbbd6fc

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 db0e4e3d07896a967b474edfd94708f8e5fc3d0ced581d308d0fb1733e594243
MD5 a9d8ae439136d1e44f8733199a0a9eb8
BLAKE2b-256 96e91b95e020a3bebe4b1a417b743a15510dc4d71da9fa7a73c92d834783c439

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5888d895da04f25ff42909c34469549a8b8420a38699d70925bd4697b43ceffe
MD5 8e6a1d9a6937bc3ad347191d6faae904
BLAKE2b-256 ebc97bc7c5c12cff29104bca301b4e716213a5c022f81ece349e099450c2c4f5

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f86b10bc3bdde40c7f0d7f2d18beb36e6b4a491df5da39cb91712624696d564f
MD5 5f4d0da373a4b41d880bb679f24a4800
BLAKE2b-256 446d2027a704ca8bca9030751841b5c986c7ab8bdeab65e899211d5042488cde

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8a397fbcdf8ed5037207d4460d6129fc8ac413b43ddf1267b4f06d64949ba36e
MD5 fe1af207f81571e6fca22dfc5e058b1f
BLAKE2b-256 72a7deb76c839505007d0bbf117a655074dd8a2907f3de48ba5430d40f35256a

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 edd530ba98fa58982624239a74a4e28d9bae74b98390f033f3e5a56e7b4076cb
MD5 c0f84575b2ec2601773f8feb111dca01
BLAKE2b-256 9066aa02ac8e7c0a7ddf2b8c4fe6cdc484ffdbb6f1464255cd949e0d70e69e3b

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e310264e3a9c392f9db603b8ab881d7a1767de54e3bf46696efa997587927a16
MD5 5e4d5145dab178991dd642d84e039e6f
BLAKE2b-256 d797a9b14e0cd763516c6b91805f65a88c1d22269f30245a5b95d9da071f293a

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 65e0d3861f0a5cbc633fd50977db2f7d4643bc06b6737fa5229aa51beb712cce
MD5 1daa7bb7b33df3db14c8e178760b9f58
BLAKE2b-256 87f1ebcd4460ea70a8aa4561b424c525916663185b3863d899c2f5fbfbfa4196

See more details on using hashes here.

File details

Details for the file object_storage_proxy-0.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for object_storage_proxy-0.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 41e0f0e08220238062efa713335355dff21d40d2bcd1c817713d59a486aebf03
MD5 db413d2aa4f5e5d782e43f224091905e
BLAKE2b-256 116c12b2cc0e012794ad1fb9198f4c270e6c2867c21c70df55406e40f7327929

See more details on using hashes here.

Release history Release notifications | RSS feed

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page