Prefix modifier crashes on non-string values; reserved expansion stops encoding once the value contains a percent-escape
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 85/100
Línea de trabajo
Empieza en uritemplate/variable.py, donde el issue señala el manejo de prefijos y las rutas de entrecomillado de la expansión reservada. Lee las secciones pertinentes de RFC 6570 y localiza las pruebas que cubren {var:N}, {+var} y {#var}. Añade pruebas de regresión para valores de prefijo que no sean cadenas y para escapes porcentuales mezclados con caracteres no seguros; se considera terminado cuando ambos casos se expanden según RFC.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Two related problems in uritemplate/variable.py, reproduced on 4.2.0 (main 8e46228).
1. {var:N} with an int or float value raises TypeError
>>> from uritemplate import expand
>>> expand("{a:1}", {"a": 12})
TypeError: 'int' object is not subscriptable
>>> expand("{a}", {"a": 12})
'12'
Non-string scalars are accepted everywhere else (they are converted with str() in Operator.quote), but the prefix is applied before that conversion: value = value[:prefix] if prefix else value. Converting first (str(value)[:prefix]) fixes it; RFC 6570 §2.4.1 defines the prefix on the string form of the value.
2. Reserved (+) and fragment (#) expansion leave unsafe characters unencoded if the value contains any %XX
>>> from uritemplate import expand
>>> expand("{+a}", {"a": "a b"})
'a%20b'
>>> expand("{+a}", {"a": "a b%41"})
'a b%41' # expected 'a%20b%41'
Operator._only_quote_unquoted_characters returns the value unchanged whenever unquote(value) != value, so one pre-existing percent-escape disables encoding for the whole string, including the space. RFC 6570 §3.2.3 says reserved expansion keeps existing pct-encoded triplets and encodes everything else that is not in reserved/unreserved; the check needs to be per character (or per triplet), not per string.
Happy to send a PR with tests for both if you would take one.
- Lenguaje dominante
- Python
- Estrellas
- 246
- Forks
- 41
- Merge medio
- 8 h 20 min
- PR fusionados (30 d)
- 3
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de python-hyper/uritemplate
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
python-hyper/uritemplate#164 · 2 comentarios ·
-
Variable names are not validatedAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
python-hyper/uritemplate#51 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
python-hyper/uritemplate#34 · 4 comentarios ·
-
Provide an API for validating URI TemplatesPosiblemente ocupada @sigmavirus24 la tomó hace 3382 días. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
python-hyper/uritemplate#33 · 9 comentarios ·
-
Add Contributor CovenantAbiertoenhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 45/100
python-hyper/uritemplate#15 ·
Todos los issues de python-hyper/uritemplate
Issues similares
-
bug P2 rust
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
jscott3201/rusty-bacnet#2085 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
evarness-ai/iris-harness#401 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
sistemicorp/scripts#62 ·
-
area/mac help wanted needs-qa
Dificultad 1/5 Menos de una hora Aptitud para principiantes 76/100