Skip to content

[vercel] fix: return 3xx responses when redirect is manual in client.fetch()#15953

Merged
bhrigu123 merged 3 commits into
mainfrom
bhrigu/cli-fetch-manual-redirect
Apr 15, 2026
Merged

[vercel] fix: return 3xx responses when redirect is manual in client.fetch()#15953
bhrigu123 merged 3 commits into
mainfrom
bhrigu/cli-fetch-manual-redirect

Conversation

@bhrigu123

@bhrigu123 bhrigu123 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Summary

  • client.fetch() now returns 3xx responses directly when redirect: 'manual' is passed, instead of entering the error/retry path
  • This is opt-in — no existing behavior changes since no code currently passes redirect: 'manual' through client.fetch()

Why

This enables CLI commands that need to extract Location headers from redirect-based API endpoints (e.g., endpoints that initialize server-side state and redirect to a browser URL).

Today, the 3xx response hits !res.ok (302 is outside 200-299), doesn't match the 400-499 bail condition, and falls through to throw error — causing infinite retries.

Test plan

  • New test: 302 with redirect: 'manual' returns raw response with Location header
  • New test: 302 without redirect: 'manual' follows the redirect (default behavior unchanged)
  • Existing proxy test still passes

🤖 Generated with Claude Code

…fetch()

`client.fetch()` treats any non-2xx response as an error and retries.
When `redirect: 'manual'` is passed, 3xx responses now return the raw
Response directly so callers can inspect the Location header.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Apr 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e88d540

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

This PR includes changesets to release 1 package
Name Type
vercel Patch

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

@vercel

vercel Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
vercel Ready Ready Preview, Comment Apr 14, 2026 10:00pm

Request Review

@github-actions

github-actions Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

📦 CLI Tarball Ready

The Vercel CLI tarball for this PR is now available!

Quick Test

You can test this PR's CLI directly by running:

npx https://vercel-8q0wsjbzm-melkeydevs-projects.vercel.app/tarballs/vercel.tgz --help

Use in vercel.json

To use this CLI version in your project builds, add to your vercel.json:

{
  "build": {
    "env": {
      "VERCEL_CLI_VERSION": "vercel@https://vercel-8q0wsjbzm-melkeydevs-projects.vercel.app/tarballs/vercel.tgz"
    }
  }
}

@vercel

vercel Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Low Risk — Opt-in behavior for redirect handling in CLI fetch utility — only activates when caller explicitly passes redirect: 'manual'.

  • client.ts: return 3xx responses directly when redirect: 'manual' is passed instead of entering error/retry path
  • client.test.ts: added tests for manual redirect behavior and default redirect following

Assessed at e88d540.

@github-actions

github-actions Bot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

🧪 Unit Test Strategy

Comparing: c27eedae88d540 (view diff)

Strategy: Code changed outside of a package - running all unit tests

⚠️ All unit tests will run because global code changes could impact all packages.

Affected packages - 15 (38%)
  1. vercel
  2. @vercel/build-utils
  3. @vercel/client
  4. @vercel/firewall
  5. @vercel/fs-detectors
  6. @vercel/go
  7. @vercel/hydrogen
  8. @vercel/next
  9. @vercel/node
  10. @vercel/python
  11. @vercel/remix-builder
  12. @vercel/ruby
  13. @vercel/rust
  14. @vercel/static-build
  15. examples
Unaffected packages - 25 (63%)
  1. @vercel-internals/get-package-json
  2. @vercel/backends
  3. @vercel/cervel
  4. @vercel/cli-auth
  5. @vercel/config
  6. @vercel/detect-agent
  7. @vercel/edge
  8. @vercel/elysia
  9. @vercel/error-utils
  10. @vercel/express
  11. @vercel/fastify
  12. @vercel/frameworks
  13. @vercel/functions
  14. @vercel/gatsby-plugin-vercel-builder
  15. @vercel/h3
  16. @vercel/hono
  17. @vercel/koa
  18. @vercel/nestjs
  19. @vercel/oidc
  20. @vercel/oidc-aws-credentials-provider
  21. @vercel/python-analysis
  22. @vercel/redwood
  23. @vercel/related-projects
  24. @vercel/routing-utils
  25. @vercel/static-config

Results

  • Unit tests: All affected packages will run unit tests
  • E2E tests: Running in parallel via E2E Tests workflow
  • Type checks: All affected packages will run type checks

This comment is automatically generated based on the affected testing strategy

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bhrigu123 bhrigu123 marked this pull request as ready for review April 14, 2026 22:01
@bhrigu123 bhrigu123 requested review from a team as code owners April 14, 2026 22:01
@bhrigu123 bhrigu123 requested a review from dvoytenko April 14, 2026 22:03
@bhrigu123 bhrigu123 enabled auto-merge (squash) April 14, 2026 22:53
@bhrigu123 bhrigu123 disabled auto-merge April 14, 2026 23:45
@bhrigu123 bhrigu123 merged commit fc5a29d into main Apr 15, 2026
352 of 356 checks passed
@bhrigu123 bhrigu123 deleted the bhrigu/cli-fetch-manual-redirect branch April 15, 2026 00:01
gscho pushed a commit that referenced this pull request Apr 15, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @vercel/build-utils@13.16.0

### Minor Changes

- Add shared deserialization and build-result collection utilities.
([#15961](#15961))

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

- Add a new flag to vercel deploy to let users deploy to hive
([#15892](#15892))

## vercel@51.3.0

### Minor Changes

- Add `vercel alerts inspect` to fetch a single alert group by id with
linked project, explicit `--project`, or `--all` scope.
([#15850](#15850))

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

- Add a new flag to vercel deploy to let users deploy to hive
([#15892](#15892))

### Patch Changes

- Return 3xx responses directly in `client.fetch()` when `redirect:
'manual'` is passed, instead of entering the error/retry path.
([#15953](#15953))

- Add JSON feature flag support to the CLI so flags can be created,
updated, listed, inspected, and set with JSON variant values just like
existing boolean, string, and number kinds.
([#15741](#15741))

This aligns the CLI with the recent API and dashboard changes for `json`
flags, including parsing raw JSON inputs and preserving structured
values in output.

- Display case-insensitive feature flag rule comparisons correctly in
the CLI. ([#15743](#15743))

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0
    -   @vercel/python@6.32.0
    -   @vercel/backends@0.0.61
    -   @vercel/elysia@0.1.64
    -   @vercel/express@0.1.74
    -   @vercel/fastify@0.1.67
    -   @vercel/go@3.5.0
    -   @vercel/h3@0.1.73
    -   @vercel/hono@0.2.67
    -   @vercel/hydrogen@1.3.6
    -   @vercel/koa@0.1.47
    -   @vercel/nestjs@0.2.68
    -   @vercel/next@4.16.7
    -   @vercel/node@5.7.6
    -   @vercel/redwood@2.4.12
    -   @vercel/remix-builder@5.7.2
    -   @vercel/ruby@2.3.2
    -   @vercel/rust@1.1.0
    -   @vercel/static-build@2.9.14

## @vercel/config@0.2.0

### Minor Changes

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

## @vercel/fs-detectors@5.17.0

### Minor Changes

- Add root to experimentalServices to set a service's working directory.
([#15929](#15929))

### Patch Changes

- fix(node): scope entrypoint filter to `api/` directory only
([#15954](#15954))

- Add actix framework preset
([#15752](#15752))

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`620c42ffa6d335c9a6e3e57a1e81c522696b7c2c`](620c42f),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0
    -   @vercel/frameworks@3.24.1

## @vercel/python@6.32.0

### Minor Changes

- Add a new flag to vercel deploy to let users deploy to hive
([#15892](#15892))

## @vercel/backends@0.0.61

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/cervel@0.0.48

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/backends@0.0.61

## @vercel/client@17.3.3

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/elysia@0.1.64

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/express@0.1.74

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6
    -   @vercel/cervel@0.0.48

## @vercel/fastify@0.1.67

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/frameworks@3.24.1

### Patch Changes

- Add actix framework preset
([#15752](#15752))

## @vercel/gatsby-plugin-vercel-builder@2.1.14

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/h3@0.1.73

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/hono@0.2.67

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/koa@0.1.47

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/nestjs@0.2.68

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/node@5.7.6

## @vercel/node@5.7.6

### Patch Changes

- Updated dependencies
\[[`86d1f5b3cbd520af2632d4a3d6a1f24557448c0e`](86d1f5b),
[`1056be976b6ba9b42cc1e2ffe895d255ab6c9850`](1056be9),
[`c27eedaa1b0e3f6e3770b578f62e5463d82f06e0`](c27eeda)]:
    -   @vercel/build-utils@13.16.0

## @vercel/static-build@2.9.14

### Patch Changes

-   Updated dependencies \[]:
    -   @vercel/gatsby-plugin-vercel-builder@2.1.14

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants