reply.fromParameters() drops query params after a second "?"
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 78/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- javascript, node.js
- Bereich
- backend-api-design
Rechercherichtung
Das Issue nennt extractUrlComponents() und den fehlerhaften Aufruf urlString.split('?', 2); finde diese Funktion und lies die umgebende URL-Verarbeitung. Reproduziere den Fehler mit der bereitgestellten Anfrage, die ein zweites ? enthält, und prüfe dann, ob beide Query-Parameter beim Upstream ankommen. Fertig ist die Änderung, wenn der Query-String erhalten bleibt und die relevanten Tests diesen Fall abdecken.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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"}.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 394
- Forks
- 105
- Ø Merge
- 9 Std. 34 Min.
- Gemergte PRs (30 T.)
- 2
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus fastify/fastify-http-proxy
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
fastify/fastify-http-proxy#493 ·
Alle Issues in fastify/fastify-http-proxy
Ähnliche Issues
-
status: needs triage
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 68/100
mastra-ai/mastra#29706 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 69/100
daniel-ospina/tortoise#11586 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug stock
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Maintainer antworten meist innerhalb von 1 Tag
-
druxt: getResource returns an empty object for a failed request, so the status is lostEvtl. vergeben @Decipher hat das vor 44 Tagen übernommen. Offenbug needs triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 77/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
Yu-tao-Li/dsh-computer-use-win#76 ·
Maintainer antworten meist innerhalb von 1 Tag