web-dev-qa-db-fra.com

Comment afficher les en-têtes de requête avec curl en ligne de commande

La ligne de commande curl peut afficher l'en-tête de réponse à l'aide de l'option -D, mais je veux voir quel en-tête de requête il envoie. Comment puis je faire ça?

444
wwwxml

l'option -v ou --verbose de curl affiche, entre autres, les en-têtes de requêtes HTTP Voici un exemple de sortie:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-Apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to Host google.com left intact
* Closing connection #0
653
Asaph
curl -sD - -o /dev/null http://example.com
  • -s - Évitez d'afficher la barre de progression
  • -D - - Sauvegarde les en-têtes dans un fichier, mais - l'envoie à stdout
  • -o /dev/null - Ignorer le corps de la réponse

C'est mieux que -I car il n'envoie pas de requête HEAD, qui peut produire des résultats différents.

C'est mieux que -v parce que vous n'avez pas besoin de tant de hacks pour le disséminer.

132
Jaffa The Cake

Je crois que le commutateur de ligne de commande que vous recherchez pour passer à curl est -I.

Exemple d'utilisation:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

En outre, si vous rencontrez un code d'état HTTP de réponse de 301, vous voudrez peut-être également passer un argument -L pour indiquer à curl qu'il suive les redirections d'URL et, dans ce cas, imprimer les en-têtes de toutes les pages (y compris les redirections d'URL), illustré ci-dessous:

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html
86
evandrix

L'option verbose est pratique, mais si vous voulez voir tout que curl voit (y compris le corps HTTP transmis, et pas seulement les en-têtes), je suggère d'utiliser l'une des options ci-dessous:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # fichier
66
William Denniss

Vous obtenez une sortie d'en-tête Nice avec la commande suivante:

 curl -L -v -s -o /dev/null google.de
  • -L, --location suivre les redirections
  • -v, --verbose plus de sortie, indique la direction
  • -s, --silent ne pas afficher de barre de progression
  • -o, --output /dev/null ne pas montrer le corps reçu

Ou la version plus courte:

 curl -Lvso /dev/null google.de

Résulte en:

* Rebuilt URL to: google.de/
*   Trying 2a00:1450:4008:802::2003...
* Connected to google.de (2a00:1450:4008:802::2003) port 80 (#0)
> GET / HTTP/1.1
> Host: google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15:45:36 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
* Ignoring the response-body
{ [218 bytes data]
* Connection #0 to Host google.de left intact
* Issue another request to this URL: 'http://www.google.de/'
*   Trying 2a00:1450:4008:800::2003...
* Connected to www.google.de (2a00:1450:4008:800::2003) port 80 (#1)
> GET / HTTP/1.1
> Host: www.google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat, 11-Feb-2017 15:45:36 GMT; path=/; domain=.google.de; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [11080 bytes data]
* Connection #1 to Host www.google.de left intact

Comme vous pouvez le constater, curl génère les en-têtes sortant et entrant et saute le bodydata, même si cela vous indique la taille du corps.

De plus, pour chaque ligne, la direction est indiquée, ce qui facilite la lecture. J'ai trouvé particulièrement utile de retracer de longues chaînes de redirections.

45
Benibr

J'ai dû surmonter ce problème moi-même lors du débogage d'applications Web. -v est génial, mais un peu aussi verbeux à mon goût. Voici la solution (uniquement pour bash) que j'ai proposée:

curl -v http://example.com/ 2> >(sed '/^*/d')

Cela fonctionne car la sortie de -v est envoyée à stderr, pas à stdout. En redirigeant cela vers un sous-shell, nous pouvons sed le supprimer pour supprimer les lignes commençant par *. Comme la sortie réelle ne passe pas par le sous-shell, elle n’est pas affectée. L'utilisation d'un sous-shell est un peu lourde, mais c'est le moyen le plus simple de rediriger stderr vers une autre commande. (Comme je l'ai noté, je ne l'utilise que pour les tests, donc cela fonctionne bien pour moi.)

6
jpfx1342

l'option -v pour curl est trop détaillée dans la sortie d'erreur qui contient le * (ligne d'état) ou le > (champ d'en-tête de requête) ou le _< (le champ d'en-tête de réponse). pour obtenir uniquement le champ d'en-tête de la requête:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

pour obtenir uniquement le champ d'en-tête de la requête:

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

ou le vider dans le fichier /tmp/test.txt avec l'option -D

curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null

afin de filtrer la sortie -v, vous devez diriger la sortie d'erreur vers le terminal et la sortie std vers/dev/null, l'option -s permet d'interdire la mesure de la progression.

3
toolchainX

Une commande comme celle ci-dessous affichera trois sections: les en-têtes de requête, les en-têtes de réponse et les données (séparées par CRLF). Cela évite les informations techniques et les bruits syntaxiques ajoutés par curl.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

La commande produira la sortie suivante:

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

La description:

  • -vs - ajoute des en-têtes (-v) mais supprime la barre de progression (-s)
  • 2>&1 - combine stdout et stderr en un seul stdout
  • sed - éditer la réponse produite par curl en utilisant les commandes ci-dessous
  • /^* /d - supprime les lignes commençant par '*' (informations techniques)
  • /bytes data]$/d - supprime les lignes se terminant par 'octets de données]' (informations techniques)
  • s/> // - supprime le préfixe '>'
  • s/< // - supprime le préfixe '<'
0
igorpcholkin