[analytics-core] getQueryParams does not decode `+` as space and truncates values containing `=`
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 82/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- javascript, typescript
- Ambito
- analytics
Direzione di ricerca
Inizia da packages/analytics-core/src/query-params.ts, dove getQueryParams suddivide ogni coppia con split('=', 2) e decodifica tramite tryDecodeURIComponent. CampaignParser, nello stesso pacchetto, usa il suo output, quindi controllalo anche. È completato quando la query string d'esempio della issue produce utm_source 'news letter', utm_term 'running shoes', utm_content 'a=b=c' e gclid 'abc==', con un test che lo copre.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Expected Behavior
getQueryParams() and CampaignParser should decode + as a space per application/x-www-form-urlencoded (matching URLSearchParams and legacy amplitude-js's utils.getQueryParam) and preserve = characters inside parameter values.
For ?utm_source=news+letter&utm_term=running+shoes&utm_content=a%3Db=c&gclid=abc==, the parsed parameters should be:
{
utm_source: 'news letter',
utm_term: 'running shoes',
utm_content: 'a=b=c',
gclid: 'abc=='
}
Current Behavior
In packages/analytics-core/src/query-params.ts, getQueryParams() splits each pair with curr.split('=', 2) and decodes with decodeURIComponent() directly:
- In JavaScript,
String.prototype.split('=', 2)splits on every=and returns only the first two elements, discarding everything from the second=onward ('gclid=abc=='.split('=', 2)returns['gclid', 'abc']). decodeURIComponent()leaves+as a literal+, so?utm_term=running+shoesand?utm_term=running%20shoesare recorded as two distinct campaign terms.
Because CampaignParser and analytics-browser call getQueryParams(), default init() records the unparsed + and truncated values in both $identify (initial_utm_*, utm_*, initial_gclid, gclid) and [Amplitude] Page Viewed event properties.
Possible Solution
Split on the first = using indexOf('=') instead of split('=', 2), and replace + with ' ' before calling decodeURIComponent() in tryDecodeURIComponent:
const eqIndex = curr.indexOf('=');
if (eqIndex === -1) {
return acc;
}
const key = tryDecodeURIComponent(curr.slice(0, eqIndex).replace(/\+/g, ' '));
const value = tryDecodeURIComponent(curr.slice(eqIndex + 1).replace(/\+/g, ' '));
Steps to Reproduce
- Install
@amplitude/[email protected]:npm i @amplitude/[email protected] - Run:
node --input-type=module <<'EOF' import { CampaignParser, getQueryParams } from "@amplitude/analytics-core"; const search = "?utm_source=news+letter&utm_term=running+shoes&utm_content=a%3Db=c&gclid=abc=="; globalThis.location = { search, href: "https://example.com/" + search, hostname: "example.com" }; console.log(getQueryParams()); const c = await new CampaignParser().parse(); console.log(c.utm_source, "|", c.utm_term, "|", c.utm_content, "|", c.gclid); EOF - Actual output:
{ utm_source: 'news+letter', utm_term: 'running+shoes', utm_content: 'a=b', gclid: 'abc' } news+letter | running+shoes | a=b | abc
Environment
- JS SDK Version:
@amplitude/[email protected],@amplitude/[email protected], andmain(5b445aa) - Installation Method: npm
- Browser and Version: Node.js v26.13.0 (also affects all browsers via
@amplitude/analytics-browser)
Credit: https://ucsbplse.github.io/
- Lingua principale
- TypeScript
- Stelle
- 181
- Fork
- 66
- Merge medio
- 2g 21h
- PR unite (30g)
- 41
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di amplitude/Amplitude-TypeScript
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
amplitude/Amplitude-TypeScript#1615 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
amplitude/Amplitude-TypeScript#1367 · 5 commenti · 24 reazioni ·
I maintainer di solito rispondono entro 2 giorni
-
Session Replay keeps observing blocked iframes, retaining their documents until recording stopsApertabug customer-reported
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
amplitude/Amplitude-TypeScript#2119 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
amplitude/Amplitude-TypeScript#2027 · 2 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 1/100
amplitude/Amplitude-TypeScript#1736 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di amplitude/Amplitude-TypeScript
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
devswha/herdr-web-ui#3875 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
-
area: runtime chore cli consistency dependencies developer-experience difficulty: easy discovery documentation enhancement good first issue help wanted hygiene json-output packaging priority: P3 tests version
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
discovery:other factory-active task-identify-harness-labels-done task-identify-issue-type-done
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
vercel/ai#25068 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
create-strapi-app doesn't await writing license.txt, so a failed write skips its error handlingApertaflag: invalid template issue: bug severity: low source: cli status: pending reproduction version: 5
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
strapi/strapi#28637 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni