- Spegnimento
- 7 agosto 2026 alle ore 04:07 UTC
- Autore
- Kamo
- Impegno
- 3c24d32
Ogni URL che questo gateway costruisce è assemblato da getRequestURI() e getQueryString() — entrambi già codificati per cento — ed è stato poi consegnato a RestTemplate come String. I sovraccarichi di stringa di RestTemplate non prendono un URL; essi prendere un URI TEMPLATE, ampliato da un DefaultUriBuilderFactory che RestTemplate configura in EncodingMode.URI COMPONENT. Questa modalità codifica ogni componente, e "%" non è un pchar, quindi una fuga esistente è stata evasa di nuovo: %2C lasciato in %252C. Il servizio a monte decodificato una volta e ricevuto il token letterale A%2CB — uno valore in cui il chiamante ha inviato due. Avanti() è il singolo imbuto per ogni /api/ <x>/** percorso, quindi /api/docs, /api/security, /api/kb, /api/media e il resto sono stati tutti colpiti subito; i valori senza carattere riservato sono un punto fisso, che è ciò che lo ha reso intermittente e facile da perdere. toUpstreamUri() analizza l'URL e il sovraccarico URI di scambio() bypassa il modello handler interamente, così i bytes attraversano il hop intatto. Non è deliberatamente uno scambio diretto a URI.create. Questo metodo THROWS su un carattere illegale in un URI — uno spazio grezzo, '|', '{}', una fuga troncata — e tale richiesta funziona oggi proprio perché la seconda codifica la ripara. Su IllegalArgumentException l'aiutante restituisce null e il chiamante consegna il String to RestTemplate esattamente come prima, con un WARN che nomina l'URL così il caso è visibile invece di silenzioso. Il traffico corretto smette di essere strangolato; malformato il traffico si comporta esattamente come ha fatto. Tutti e cinque i siti di scambio in questa classe — avanti, avantiWebhook, avantiCallback e i due webhook POST helpers — andare attraverso uno scambioUpstream in modo che le due codifiche non possono derivare per sito di chiamata. I test affermano l'URI che effettivamente lascia RestTemplate, via MockRestServiceServer piuttosto che il valore di ritorno dell'aiutante da solo, dal momento che la codifica avviene dentro RestTemplate: status=PENDING%2CIN PROGRESS arriva con esattamente un livello codifica e nessun %25 ovunque; il sovraccarico di String è bloccato come la cosa che doppio codificato; uno spazio grezzo, un troncato %2 e un {id} brace ogni cadere indietro piuttosto che lanciare; e una query ripete-param ordinaria è invariata in entrambi i modi. mvn -o test: 29 test, 0 guasti.