Proxy credentials in the proxy URL are not percent-decoded

Abierto Apto para principiantes
#1,761 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
74/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
networking

Línea de trabajo

Comienza con el punto de entrada parse_proxy() en websockets.proxy y sigue cómo sus credenciales llegan a connect_socks_proxy() y connect_http_proxy(). Verifica la URL de reproducción con una contraseña codificada en porcentaje y confirma después que ambas rutas del proxy reciben los valores decodificados de nombre de usuario y contraseña, y que las pruebas existentes del proxy pasan.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug
Description

parse_proxy() takes username and password from urllib.parse.urlparse(...) as they are, without percent-decoding them. A password that contains a reserved character has to be percent-encoded to be representable in the URL at all (socks5://alice:p%40ss@host:1080 for the password p@ss), but websockets then sends the literal string p%40ss to the proxy: connect_socks_proxy() hands proxy.username / proxy.password to python-socks unchanged, and connect_http_proxy() base64-encodes them unchanged for Proxy-Authorization.

python-socks itself (python_socks._helpers.parse_proxy_url) applies unquote() to both, so the same URL works with python-socks directly and with other clients that build on it, but not through websockets' proxy= parameter. RFC 3986 section 3.2.1 defines userinfo as percent-encoded.

Reproduction
>>> from websockets.proxy import parse_proxy
>>> p = parse_proxy("socks5://alice:p%40ss@127.0.0.1:1080")
>>> p.password
'p%40ss'

Against a SOCKS5 proxy with user/password auth the connection is rejected (ProxyError: failed to connect to SOCKS proxy), against an HTTP CONNECT proxy with basic auth it is answered with 407.

Environment

websockets 16.0, Python 3.13.5, python-socks 3.1.1, Linux x86_64.

Expected

parse_proxy() percent-decodes username and password (e.g. urllib.parse.unquote), like python-socks and requests do for proxy URLs, so that credentials with @, :, / or % can be used.

Lenguaje dominante
Python
Estrellas
5.7k
Forks
613
Merge medio
23 h 5 min
PR fusionados (30 d)
9

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de python-websockets/websockets

Todos los issues de python-websockets/websockets

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.