Skip to content

feat(python-sdk): move template build-context uploads onto pyqwest#1603

Draft
mishushakov wants to merge 1 commit into
migrate-rest-to-pyqwestfrom
migrate-template-uploads-to-pyqwest
Draft

feat(python-sdk): move template build-context uploads onto pyqwest#1603
mishushakov wants to merge 1 commit into
migrate-rest-to-pyqwestfrom
migrate-template-uploads-to-pyqwest

Conversation

@mishushakov

Copy link
Copy Markdown
Member

What

Stacked on #1601. Migrates the template build-context uploads (streaming the build archive to S3 presigned URLs in build_api.upload_file) onto pyqwest via its httpx-compatible transport adapter.

Originally deferred from #1601 because S3 presigned URLs reject chunked transfer encoding and Content-Length framing through reqwest was unverified. Verified at the wire level (raw-socket capture server): httpx's Content-Length — derived from the spooled archive (sync) or set explicitly on the async-iterator body (async) — is forwarded by the adapter and reqwest keeps Content-Length framing for streamed bodies, no chunked fallback.

How

  • e2b/template_sync/build_api.py / template_async/build_api.py: upload_file uses a one-off pyqwest transport (ApiPyqwestTransport from feat(python-sdk): move the REST API client onto pyqwest's httpx transport adapter #1601) instead of the generated client's httpx transport.
  • verify_ssl=False on the generated client is no longer honored for uploads (pyqwest has no insecure-TLS option), and http2=False is gone (S3 negotiates HTTP/1.1 via ALPN anyway).
  • The 1-hour upload timeout now bounds the entire upload rather than each socket write — arguably the intended meaning for that endpoint.

Testing

Usage example

No API changes — template builds upload their context exactly as before:

from e2b import Template

template = Template().from_image("ubuntu:22.04").copy("data/", "/data")
Template.build(template, alias="my-template")   # archive upload now goes through pyqwest

🤖 Generated with Claude Code

build_api.upload_file uses a one-off pyqwest transport; Content-Length
framing verified at the wire level for both the spooled sync archive and
the async-iterator body (S3 rejects chunked encoding). The upload-file
regression tests compare header names case-insensitively since hyper
lowercases them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cla-bot cla-bot Bot added the cla-signed label Jul 23, 2026
@changeset-bot

changeset-bot Bot commented Jul 23, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6288fe5

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@e2b/python-sdk Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@cursor

cursor Bot commented Jul 23, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Upload path behavior changes (TLS verification, timeout semantics, new transport) affect large template builds to S3; regressions could break builds without API surface changes.

Overview
Template build-context PUTs to S3 presigned URLs in sync and async upload_file now use one-off httpx clients with pyqwest transports (ApiPyqwestTransport / AsyncApiPyqwestTransport) instead of the default httpx stack, with proxy passed through proxy_to_url and system TLS certs enabled. Explicit Content-Length on the streamed archive body is unchanged so uploads avoid chunked encoding that S3 rejects.

The default one-hour upload timeout now applies to the full transfer rather than per socket operation. verify_ssl=False on the API client is no longer applied to these uploads because pyqwest has no insecure-TLS option. Upload regression tests normalize request headers to lowercase because pyqwest/hyper sends lowercase names.

Reviewed by Cursor Bugbot for commit 6288fe5. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

Copy link
Copy Markdown
Contributor

Package Artifacts

Built from 595875d. Download artifacts from this workflow run.

JS SDK (e2b@2.35.4-migrate-template-uploads-to-pyqwest.0):

npm install ./e2b-2.35.4-migrate-template-uploads-to-pyqwest.0.tgz

CLI (@e2b/cli@2.15.1-migrate-template-uploads-to-pyqwest.0):

npm install ./e2b-cli-2.15.1-migrate-template-uploads-to-pyqwest.0.tgz

Python SDK (e2b==2.34.0+migrate.template.uploads.to.pyqwest):

pip install ./e2b-2.34.0+migrate.template.uploads.to.pyqwest-py3-none-any.whl

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant