Aller au contenu

HTTP ​

L’écran HTTP est à la fois un inspecteur de requêtes et un outil de charge :

  • envoyer une seule requête et voir le statut, le temps qu’elle a pris, les en-têtes et le corps ;
  • s’authentifier avec Basic, un jeton Bearer ou Digest ;
  • conserver les cookies qu’un serveur définit, comme le fait un navigateur ;
  • envoyer la même requête de nombreuses fois en même temps — une Rafale de charge — et lire le débit et les percentiles de latence.

Envoyer une requête ​

  1. Ouvrez HTTP.
  2. Choisissez la méthode et saisissez l’URL, par exemple http://127.0.0.1:8080/health.
  3. Ajoutez des En-têtes si le serveur en a besoin ; + en-tête ajoute une ligne, ✕ en supprime une. Une ligne sans nom n’est pas envoyée.
  4. Pour une méthode autre que GET et HEAD, écrivez le Corps. Le texte reste dans le champ pendant que vous passez à GET ou HEAD et revient avec l’autre méthode, mais n’est pas envoyé entre-temps.
  5. Appuyez sur Envoyer.

La ligne sous les boutons donne le verdict aussitôt — statut, temps et taille, ou pourquoi il n’y a pas eu de réponse — et le panneau Réponse montre le reste. La requête (méthode, URL, en-têtes, corps, délai d’attente et Conserver les cookies) est conservée quand vous changez d’écran et quand vous redémarrez l’application ; les identifiants ne le sont pas.

ToucheOùFait
Enterl’URL, un en-tête, un identifiant, le délai d’attenteenvoie
Ctrl+Entern’importe quel champ de la requête, le corps comprisenvoie
Ctrl+Sn’importe quel champ de la requêtel’enregistre comme signal (ci-dessous)

Champs de la requête ​

ChampQuoiPar défaut
MéthodeGET, POST, PUT, PATCH, DELETE, HEAD ou OPTIONSGET
URLUne URL http:// ou https://http://127.0.0.1:8080/
En-têtesDes paires nom et valeur, envoyées telles quelles. Sans User-Agent à vous, Signal Lab envoie SignalLab/0.1.Accept: application/json
AuthentificationComment la requête s’authentifie (ci-dessous)Aucune
Conserver les cookiesRenvoyer les cookies que les serveurs définissent (ci-dessous)activé
CorpsEnvoyé exactement tel qu’écrit ; aucun Content-Type n’est ajouté, donc ajoutez l’en-tête qui correspond. Un corps vide n’est pas envoyé. Le champ n’est pas affiché pour GET et HEAD, et la requête ne porte alors aucun corps — ni dans l’envoi, ni dans un signal enregistré, ni dans Ajouter à l’expérience — même si vous en avez saisi un sous une autre méthode.vide
Délai d’attente (ms)Combien de temps l’échange entier peut prendre, réponse et corps compris10 000

Authentification ​

AuthentificationChampsCe qui est envoyé
Aucune—aucun en-tête Authorization
BasicNom d’utilisateur, Mot de passeAuthorization: Basic …, le nom et le mot de passe en base64, avec la première requête
Jeton BearerJetonAuthorization: Bearer <token>
DigestNom d’utilisateur, Mot de passerien au début ; la réponse au challenge du serveur (ci-dessous)

Passer de Basic à Digest conserve le nom et le mot de passe.

Digest ​

Avec Digest, Signal Lab envoie la requête sans identifiants. Quand le serveur répond 401 avec un challenge Digest, Signal Lab calcule la réponse à partir du challenge et de votre mot de passe et renvoie la requête. La réponse que vous voyez est celle de cette seconde requête, marquée Digest : défi résolu, et la latence compte les deux échanges — ce qu’un client attend.

  • Algorithmes : MD5 et SHA-256, et leurs variantes -sess. Quand un serveur propose les deux, SHA-256 est utilisé.
  • Qualité de protection : auth et auth-int, et l’ancienne réponse sans qop.
  • Quand le serveur dit que le nonce est épuisé (stale), ou en demande un nouveau, la requête est de nouveau répondue, jusqu’à 3 fois de plus. Quand il refuse la réponse au nonce qu’il a donné en dernier, le 401 tient : le nom ou le mot de passe est faux.
  • Les redirections sont suivies par Signal Lab lui-même, si bien que l’URL qui demande est celle à laquelle il est répondu. Un challenge d’une autre origine n’est pas répondu : des identifiants saisis pour un hôte ne vont à aucun autre. Passer de http:// à https:// sur le même hôte et les ports par défaut compte comme le même hôte.

Quand le challenge ne peut pas être répondu, le 401 tient et le panneau indique pourquoi :

MessageSignification
Le serveur a répondu 401 sans demander DigestLe serveur veut un autre schéma ; essayez Basic ou Bearer.
Le serveur a demandé Digest avec …Un algorithme que Signal Lab ne parle pas ; il parle MD5 et SHA-256.
Le serveur a demandé Digest sans realm ni nonceLe challenge du serveur est incomplet.
La requête a été transmise à …, qui a demandé DigestUne redirection a mené à une autre origine, dont le challenge n’est pas répondu.

Où vont les identifiants ​

Les identifiants ne vont que dans l’en-tête Authorization de la requête, au moment où elle est envoyée. L’Inspecteur, la console et les rapports d’expérience ne montrent jamais cet en-tête. Sur cet écran, ils ne sont conservés qu’en mémoire et disparaissent après un redémarrage — sauf si la requête est liée à un signal enregistré, qui les fait revenir.

WARNING

Une requête enregistrée comme signal conserve ses identifiants dans le fichier de bibliothèque, signals.json, en texte clair. Dans une expérience, écrivez un mot de passe comme {{secret.NAME}} ; voir Données et modèles.

Cookies ​

Avec Conserver les cookies activé, ce qu’un serveur définit avec Set-Cookie est conservé dans la réserve de cookies de l’écran et renvoyé avec les requêtes ultérieures vers ce serveur, selon les règles des navigateurs (domaine, chemin, Secure, expiration). La réserve est utilisée par les requêtes de cet écran, sa rafale et les signaux HTTP que vous envoyez depuis la bibliothèque. Désactivez-la pour envoyer des requêtes sans cookies et n’en conserver aucun.

Le panneau des cookies sous la requête et la réponse liste ce que la réserve contient : Nom, Valeur, Domaine et chemin (un domaine commençant par . couvre aussi ses sous-domaines), Expire (avec la session pour un cookie sans expiration) et Attributs (Secure, HttpOnly, SameSite). Les cookies expirés ne sont pas listés. Effacer vide la réserve.

La réserve vit aussi longtemps que l’application : un redémarrage repart avec une réserve vide. Sur un serveur, il y a une réserve pour chaque page connectée. Une exécution d’expérience a sa propre réserve (voir Expériences), et signallab send http n’en utilise aucune.

La réponse ​

PartieQuoi
StatutLe code de statut et sa raison ; ERR quand aucune réponse n’est venue
LatenceDe l’envoi au dernier octet du corps, en millisecondes
TailleLa taille du corps
En-têtes de réponseCliquez sur la ligne avec leur nombre pour les afficher ou les masquer
CorpsFormaté quand c’est du JSON ; Afficher brut et Formater le JSON basculent. Jusqu’à 256 Kio est affiché, puis … (truncated).

Quand il n’y a pas de réponse, le panneau indique pourquoi, dans les mêmes mots que partout dans Signal Lab : refusée, pas de réponse à temps, le nom ne se résout pas, un problème de certificat, etc. Le détail technique du système est replié en dessous.

Redirections ​

Les redirections (301, 302, 303, 307, 308) sont suivies, jusqu’à 10 ; la réponse affichée est la dernière. Après 301, 302 et 303, la requête continue en GET sans corps (HEAD reste HEAD) ; après 307 et 308, telle quelle. Authorization et les cookies saisis pour un hôte ne sont pas envoyés à un autre.

Connexions sécurisées ​

Le certificat d’un serveur https:// est vérifié par rapport aux certificats auxquels ce système fait confiance. Un certificat auto-signé ou expiré est refusé avec « A secure connection to … could not be made » ; il n’y a pas de réglage pour ignorer la vérification. Pour tester un serveur avec votre propre certificat, ajoutez-le aux certificats de confiance du système.

Rafale de charge ​

La Rafale de charge envoie la requête à l’écran — avec son authentification et, tant que Conserver les cookies est activé, la réserve de cookies — de nombreuses fois, et la mesure.

  1. Réglez Parallélisme, Total, Durée, s et Débit, req/s.
  2. Appuyez sur Lancer la rafale. La rafale est une tâche : Arrêter la rafale, ou l’arrêter dans le bandeau de la console, y met fin.
ChampQuoiPar défaut
ParallélismeRequêtes en vol en même temps, 1–51220
TotalRequêtes à envoyer ; 0 — continuer d’envoyer jusqu’à la fin de la durée500
Durée, sSecondes d’exécution ; 0 — s’arrêter quand le total est envoyé0
Débit, req/sRequêtes lancées par seconde, 0,1–100 000 ; 0 — aussi vite que les travailleurs y arrivent0

Avec Total et Durée, s tous deux à 0, la rafale tourne jusqu’à ce que vous l’arrêtiez.

Il y a deux façons d’envoyer :

  • Débit, req/s 0. Chacun des travailleurs renvoie dès qu’il a une réponse. Cela trouve combien le serveur encaisse, mais un serveur lent ralentit aussi la rafale.
  • Un débit. Les requêtes démarrent selon un calendrier fixe — à 10 par seconde, une toutes les 100 ms depuis le début — quelle que soit la lenteur des réponses. Une requête dont le moment arrive alors que tous les travailleurs sont occupés attend au plus 50 ms l’un d’eux ; après quoi elle est sautée et comptée comme Manquées, jamais envoyée en retard. Les requêtes manquées signifient que la simultanéité est trop faible pour ce débit, ou que le serveur est plus lent que le débit ne l’exige.
NombreQuoi
EnvoyéesRequêtes qui ont obtenu une réponse ou échoué
OKRépondues avec un statut 2xx
ÉchouéesAucune réponse, ou un statut hors de 200–299
ManquéesSautées, comme ci-dessus (seulement avec un débit)
Req/sRequêtes par seconde sur le dernier dixième de seconde ; quand la rafale est terminée, sur toute la rafale. Avec un débit, l’étiquette nomme le débit demandé.
p50, p90, p95, p99Le temps dans lequel cette part des requêtes s’est terminée, échecs compris ; précis à 0,5 % près
Moy., Min, MaxLa moyenne, la plus rapide et la plus lente

Les nombres sont mis à jour environ 10 fois par seconde. Le graphique à côté trace les requêtes par seconde sur les 24 dernières secondes environ.

Avec Digest, le challenge de la première requête est répondu une fois et cette réponse sert à toutes les requêtes de la rafale.

WARNING

Une rafale est une vraie charge. Ne la dirigez que vers des serveurs que vous possédez ou êtes autorisé à tester.

Pour les rampes, les paliers, les pics et les seuils de réussite/échec, exécutez la requête sous charge dans une expérience.

Dans l’Inspecteur ​

Quand la capture est armée, chaque échange apparaît comme une trame avec le protocole http et la source http : la méthode, l’URL, le statut et le temps dans le résumé, les en-têtes de réponse et le début du corps (2000 caractères) dans son détail, le statut comme verdict (failed quand aucune réponse n’est venue, · digest after 401 quand un challenge a été répondu). La trame enregistre la taille du corps, pas ses octets. L’en-tête Authorization de la requête n’y est jamais. Une rafale place au plus un échange toutes les 100 ms dans la capture. Voir Inspecteur.

Enregistrer et réutiliser ​

  • Enregistrer comme signal. Enregistrer… conserve la requête — méthode, URL, en-têtes, corps, délai d’attente et authentification — dans la bibliothèque de signaux. L’écran reste lié à elle : Enregistrer (Ctrl+S) la met à jour, Enregistrer sous… la copie, la pastille l’ouvre dans Signaux. Ouvrir un signal HTTP depuis la bibliothèque le recharge ici, identifiants compris. Voir Signaux.
  • Ajouter à une expérience. Ajouter à l’expérience ajoute une étape Requête HTTP avec la même requête à l’expérience ouverte, juste avant Fin ou après l’étape sélectionnée, et l’ouvre.
  • Émuler ceci. Sous une réponse, Émuler ceci fabrique une route d’émulateur qui répond à cette méthode et à ce chemin avec ce statut, ces en-têtes et ce corps. Choisissez un émulateur HTTP dans Ajouter à, ou Un nouvel émulateur, et appuyez sur Ajouter la route ; la route passe en premier dans cet émulateur, et l’écran Émulateurs s’ouvre dessus. Voir Émulateurs.

Dans les expériences ​

ÉtapeCe qu’elle fait
Requête HTTPEnvoie une requête ; son URL, ses en-têtes, son corps et ses identifiants prennent des {{templates}}. Elle peut s’exécuter sous charge. Détails
Statut HTTP, Texte de la réponse, En-tête de réponse, Temps de réponseVérifient la dernière réponse. Détails
Extraire une valeurGarde un champ JSON, un en-tête, le statut, le corps ou la correspondance d’une expression régulière comme variable. Détails
Branche sur statutContinue par Oui ou Non selon le statut. Détails
Attente de requête HTTPAttend qu’une requête arrive — du système que vous testez — à l’écouteur ou à l’émulateur propre à l’exécution. Détails
ÉmulateurUne API HTTP qui répond par routes pendant toute l’exécution. Détails

Depuis la ligne de commande ​

signallab send http envoie une requête, comme cet écran le fait :

bash
signallab send http GET http://127.0.0.1:8080/health --expect-status 200
signallab send http POST http://127.0.0.1:8080/api/items \
  -H 'Content-Type: application/json' --body '{"name":"lamp"}'
signallab send http GET http://127.0.0.1:8080/private -u admin:secret --digest

La ligne de statut va vers l’erreur standard et le corps vers la sortie standard :

text
HTTP 200 OK · 3 ms · 15 B
{"status":"ok"}
OptionQuoiPar défaut
-H, --header 'Name: value'Un en-tête ; répétez pour en ajouter—
--body TEXT, --body @FILELe corps, ou le contenu d’un fichier—
--expect-status NSortir avec 1 sauf si le statut est N—
--timeout MSCombien de temps attendre la réponse10 000
-u, --user NAME:PASSWORDAuthentification Basic—
--digestAvec --user : répondre plutôt au challenge Digest du serveur—
--bearer TOKENAuthorization: Bearer TOKEN—
--jsonImprimer toute la réponse en JSON sur la sortie standard—

Il sort avec 0 quand une réponse est venue (et avait le statut attendu), 1 quand aucune n’est venue, que le statut n’était pas celui attendu ou qu’un challenge Digest n’a pas pu être répondu, et 2 quand une option est invalide. Il ne conserve aucun cookie. Voir Ligne de commande.

Problèmes ​

Ce que vous voyezCause habituelle
… refused the connection — nothing is listening on that portLe serveur ne tourne pas, ou écoute sur un autre port ou une autre adresse.
No answer from … in timeLe serveur est lent ou injoignable ; vérifiez l’adresse, ou augmentez Délai d’attente (ms).
Cannot resolve …Le nom d’hôte ne se résout pas sur cet ordinateur — une faute de frappe, ou un nom que seul un autre réseau connaît.
A secure connection to … could not be madeLe certificat n’est pas de confiance ici (auto-signé, expiré, un autre nom), ou TLS a échoué. Voir Connexions sécurisées.
… is not a valid addressL’URL est mal formée ou ne commence pas par http:// ou https://.
Le serveur dit que le corps manque ou a un mauvais typeAucun en-tête Content-Type qui correspond au corps, ou un corps vide.
401 avec DigestLisez le message sous le statut : voir Digest.
Manquées au-dessus de 0Augmentez Parallélisme, ou baissez le débit : le serveur répond plus lentement que le débit ne l’exige.
Échouées élevé alors que le serveur répondTout statut hors de 200–299 compte comme échoué, 404 et 500 compris.

Sur un serveur, les requêtes partent du serveur : 127.0.0.1 est le serveur lui-même. Voir Serveur.

Chaque message d’erreur est listé dans Messages d’erreur.