[Bug] OAuth2 authentication makes HTTP requests with no timeout, hanging the client indefinitely
Personne n'a encore pris cette issue.
- #609 par @david-streamlio — fermée sans fusion
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 78/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- cpp
- Domaine
- authentication, networking
Piste de recherche
Commencez par lib/CurlWrapper.h, en particulier par la valeur par défaut de options et la configuration de CURLOPT_TIMEOUT, puis examinez fetchTokenEndpoint() et fetchOauth2Token() dans lib/auth/AuthOauth2.cc. Comparez leur gestion du timeout avec lib/HTTPLookupService.cc et lib/auth/athenz/ZTSClient.cc, et exécutez le repro joint contre l’émetteur stub. C’est terminé lorsque les appels HTTP OAuth2 retournent dans un délai d’attente borné au lieu de rester bloqués indéfiniment.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Search before asking
- I searched in the issues and found nothing similar.
Version
pulsar-client-cpp v4.2.0 (also verified at master, commit 1d08b2b, 2026-07-21)
Reproduced through pulsar-client (Python) 3.13.0 from PyPI, which pins pulsar-cpp 4.2.0
via dependencies.yaml.
OS: Linux x86_64
Minimal reproduce step
Requires no Pulsar broker and no real OAuth2 issuer. The script below starts a stub TCP
listener that accepts the connection and then never replies — the behaviour of a
black-holed or overloaded issuer.
pip install pulsar-client==3.13.0
python3 repro_oauth_timeout.py 100
Script attached. It configures the client with operation_timeout_seconds=5 and
connection_timeout_ms=5000, points issuer_url at the stub, and calls create_producer().
What did you expect to see?
The OAuth2 flow fails within a bounded, ideally configurable, period — and at minimum
within the client's own configured timeouts.
What did you see instead?
The call never returns. Observed output:
[*] pulsar-client 3.13.0
[*] operation_timeout_seconds=5, connection_timeout_ms=5000
[*] Calling create_producer(); watchdog set to 100s
[stub:issuer] accepted TCP connection, now stalling (will never respond)
still blocked after 15.0s (no client-side timeout has fired)
still blocked after 30.0s (no client-side timeout has fired)
still blocked after 45.0s (no client-side timeout has fired)
still blocked after 60.0s (no client-side timeout has fired)
still blocked after 75.0s (no client-side timeout has fired)
still blocked after 90.0s (no client-side timeout has fired)
still blocked after 105.0s (no client-side timeout has fired)
[RESULT] REPRODUCED. Still blocked in OAuth2 discovery after 105.0s.
Both configured client timeouts were exceeded by more than 20x with no sign of returning.
Neither operationTimeoutSeconds nor connectionTimeoutMs bounds the auth flow's HTTP calls.
Anything else?
Root cause: CurlWrapper::Options::timeoutInSeconds defaults to 0 (lib/CurlWrapper.h:55) and
is applied unconditionally at lib/CurlWrapper.h:123:
curl_easy_setopt(handle_, CURLOPT_TIMEOUT, options.timeoutInSeconds);
CURLOPT_TIMEOUT of 0 means no timeout in libcurl. CURLOPT_CONNECTTIMEOUT is never set
anywhere in the repository, leaving only libcurl's 300s default for the connect phase and
nothing at all once connected.
Both OAuth2 call sites leave the default in place:
-
Issuer discovery — lib/auth/AuthOauth2.cc:277, in fetchTokenEndpoint(), passes a
default-constructed options object:
curl.get(wellKnownUrl, "Accept: application/json", {}, tlsContext); -
Token endpoint — lib/auth/AuthOauth2.cc:336-339, in fetchOauth2Token(), constructs
options but sets only postFields.
This looks specific to the OAuth2 path. Other components set a timeout on the same wrapper:
- lib/HTTPLookupService.cc:229 -> options.timeoutInSeconds = lookupTimeoutInSeconds_;
- lib/auth/athenz/ZTSClient.cc:369 -> options.timeoutInSeconds = REQUEST_TIMEOUT;
Impact, as hit in production by a user running OAuth2 in Kubernetes: pods hang rather than
fail, so the problem stays invisible to health checks; and a transient issuer fault cannot
self-heal because recovery never starts.
Suggested fix: set a default timeout at both OAuth2 call sites following the existing
HTTPLookupService/ZTSClient pattern, and set CURLOPT_CONNECTTIMEOUT in CurlWrapper. Ideally
expose the value as an OAuth2 parameter.
Are you willing to submit a PR?
- I'm willing to submit a PR!
- Langage dominant
- C++
- Étoiles
- 72
- Forks
- 93
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/pulsar-client-cpp
-
Difficulté 3/5 Une demi-journée Accessibilité débutants 62/100
apache/pulsar-client-cpp#623 ·
-
[Bug] MessageTest fails to build with GCC 15.3.0 and 16.2.1 (-Werror=stringop-truncation)Peut-être pris @davlgd l’a pris il y a 4 jours. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 25/100
apache/pulsar-client-cpp#621 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
apache/pulsar-client-cpp#620 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
apache/pulsar-client-cpp#619 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 20/100
apache/pulsar-client-cpp#618 ·
Toutes les issues de apache/pulsar-client-cpp
Issues similaires
-
bug module:nodes tests
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
rocketride-org/rocketride-server#3020 ·
Les mainteneurs répondent en général sous 2 jours
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
pocoproject/poco#5636 ·
Les mainteneurs répondent en général sous 2 jours
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
microsoft/cppwinrt#1646 · 7 commentaires ·
Les mainteneurs répondent en général sous 1 jour