reply.fromParameters() drops query params after a second "?"

Ouverte Adaptée aux débutants
#491 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

@RaphaelFakhri y travaille déjà.

Depuis le 5/11/2026.

  • #492 par @RaphaelFakhri — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
78/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
javascript, node.js

Piste de recherche

L’issue identifie extractUrlComponents() et l’appel défectueux urlString.split('?', 2) ; repérez cette fonction et lisez le code autour qui gère les URL. Reproduisez le problème avec la requête fournie contenant un second ?, puis vérifiez que les deux paramètres de requête parviennent à l’upstream. Le travail est terminé lorsque la chaîne de requête est préservée et que les tests pertinents couvrent ce cas.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Prerequisites
  • I have written a descriptive issue title
  • I have searched existing issues to ensure the bug has not already been reported
Fastify version

5.x

Plugin version

11.6.6

Node.js version

22.x

Description

reply.fromParameters() truncates the query string at the second ?. Everything after it, including later &key=value pairs, is lost.

A literal ? is valid inside a query string (RFC 3986, section 3.4), and it is common in redirect parameters such as ?next=/a?b=1.

The cause is urlString.split('?', 2) in extractUrlComponents(). String.prototype.split with a limit discards the rest of the string instead of keeping it in the last element.

The default handler is not affected, because it removes the query string from the destination and @fastify/reply-from forwards the original one. The problem appears when you use reply.fromParameters() as documented in the README and pass its url to reply.from().

Steps to reproduce
const Fastify = require('fastify')
const proxy = require('@fastify/http-proxy')

const origin = Fastify()
origin.get('/api2/echo', async (request) => request.query)

const server = Fastify()
server.register(proxy, {
  upstream: 'http://localhost:3001',
  prefix: '/api',
  rewritePrefix: '/api2',
  preHandler (request, reply, done) {
    const { url, options } = reply.fromParameters(request.url, request.params, '/api')
    reply.from(url, options)
  }
})

await origin.listen({ port: 3001 })
await server.listen({ port: 3000 })
curl 'http://localhost:3000/api/echo?next=/a?b=1&c=2'
Expected behavior

The upstream receives {"next":"/a?b=1","c":"2"}.

The actual response is {"next":"/a"}.

Langage dominant
JavaScript
Étoiles
394
Forks
105
Merge moyen
9 h 34 min
PR mergées (30 j)
2

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de fastify/fastify-http-proxy

Toutes les issues de fastify/fastify-http-proxy

Issues similaires

Plus d'issues JavaScript

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.