Saltar al contenido principal

Clase 05 — Debug y Diagnóstico con curl

Modo verbose (-v)

curl -v https://httpbin.org/get
# * = info de curl, > = enviado, < = recibido
PrefijoSignificado
*Info de curl (conexión, SSL, etc.)
>Datos ENVIADOS al servidor (request)
<Datos RECIBIDOS del servidor (response)

Formato de salida personalizado (-w)

# Solo código HTTP
curl -s -o /dev/null -w "%{http_code}" https://httpbin.org/get

# Múltiples métricas
curl -s -o /dev/null -w "\
HTTP Code: %{http_code}\n\
Total Time: %{time_total}s\n\
DNS Time: %{time_namelookup}s\n\
Connect Time: %{time_connect}s\n\
SSL Time: %{time_appconnect}s\n\
TTFB: %{time_starttransfer}s\n\
Download Size: %{size_download} bytes\n\
IP: %{remote_ip}:%{remote_port}\n\
" https://httpbin.org/get

# Formato JSON
curl -s -o /dev/null -w '{
"http_code": %{http_code},
"time_total": %{time_total},
"time_dns": %{time_namelookup},
"time_ttfb": %{time_starttransfer},
"size_download": %{size_download}
}\n' https://httpbin.org/get | jq '.'

Variables disponibles en -w

VariableDescripción
%{http_code}Código de estado HTTP
%{time_total}Tiempo total
%{time_namelookup}Resolución DNS
%{time_connect}Conexión TCP
%{time_appconnect}Conexión SSL/TLS
%{time_starttransfer}TTFB (Time To First Byte)
%{size_download}Bytes descargados
%{speed_download}Velocidad (bytes/s)
%{remote_ip}IP del servidor
%{ssl_verify_result}Verificación SSL (0=OK)

Diagnóstico SSL/TLS

# Info completa de SSL
curl -vI https://github.com 2>&1 | grep -E "SSL|TLS|certificate|issuer|expire"

# Ignorar errores de certificado (⚠️ solo para debug!)
curl -k https://self-signed.badssl.com/

# Especificar CA bundle
curl --cacert /path/to/ca-bundle.crt https://api.ejemplo.com

Script: Verificar expiración de certificados

#!/bin/bash
dominios=("github.com" "google.com" "aws.amazon.com")

for dominio in "${dominios[@]}"; do
expiry=$(echo | openssl s_client -servername "$dominio" -connect "$dominio:443" 2>/dev/null | \
openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
echo "$dominio: $expiry"
done

Test de latencia

#!/bin/bash
URL="${1:-https://httpbin.org/get}"
N="${2:-10}"
total=0

for i in $(seq 1 $N); do
time=$(curl -s -o /dev/null -w "%{time_total}" "$URL")
printf " #%02d: %ss\n" "$i" "$time"
total=$(echo "$total + $time" | bc)
done

promedio=$(echo "scale=3; $total / $N" | bc)
echo "Promedio: ${promedio}s ($N peticiones)"

Resolución DNS personalizada (--resolve)

# Forzar que un dominio resuelva a una IP específica
curl --resolve "api.ejemplo.com:443:127.0.0.1" https://api.ejemplo.com/health

# Útil para probar antes de cambiar DNS

Proxy

curl -x http://proxy:8080 https://api.ejemplo.com
curl --socks5 localhost:1080 https://api.ejemplo.com

Ejercicios

  1. Usá curl -v para analizar el handshake SSL de https://google.com
  2. Creá un script que mida TTFB de 5 sitios y los ordene de más rápido a más lento
  3. Usá -w para crear un reporte JSON de rendimiento de una URL
  4. Verificá la expiración del certificado SSL de 3 dominios