Pruebas de conectividad avanzadas con cURL
Ahora que comprende las pruebas de conectividad básicas, exploremos las funciones más avanzadas de cURL que pueden ayudar con la solución de problemas y las pruebas detalladas.
Uso del modo detallado (Verbose Mode) para la depuración detallada
El modo detallado (opción -v) es invaluable para solucionar problemas de conectividad, ya que muestra todo el proceso de solicitud y respuesta:
curl -v https://example.com
La salida será completa, mostrando la resolución de DNS, el protocolo de enlace TLS, los encabezados de solicitud, los encabezados de respuesta y más:
* Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
* subject: C=US; ST=California; L=Los Angeles; O=Internet Corporation for Assigned Names and Numbers; CN=www.example.org
* start date: Nov 24 00:00:00 2022 GMT
* expire date: Nov 24 23:59:59 2023 GMT
* subjectAltName: host "example.com" matched cert's "example.com"
* issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
* SSL certificate verify ok.
* using HTTP/2
* h2 [:method: GET]
* h2 [:path: /]
* h2 [:scheme: https]
* h2 [:authority: example.com]
* h2 [user-agent: curl/7.81.0]
* h2 [accept: */*]
* Using Stream ID: 1
> GET / HTTP/2
> Host: example.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< age: 587269
< cache-control: max-age=604800
< content-type: text/html; charset=UTF-8
< date: Tue, 28 Mar 2023 12:40:01 GMT
< etag: "3147526947+ident"
< expires: Tue, 04 Apr 2023 12:40:01 GMT
< last-modified: Thu, 17 Oct 2019 07:18:26 GMT
< server: ECS (nyb/1D2B)
< vary: Accept-Encoding
< x-cache: HIT
< content-length: 1256
<
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<!-- More HTML content -->
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents...</p>
<!-- More content -->
</div>
</body>
</html>
* Connection #0 to host example.com left intact
Esta salida detallada le ayuda a identificar exactamente dónde podría estar fallando una conexión.
Prueba de diferentes métodos HTTP
Probemos una solicitud POST a un punto final (endpoint) de API de prueba:
curl -X POST -d "name=test&email=test@example.com" https://httpbin.org/post
Este comando:
-X POST: Especifica una solicitud POST
-d "name=test&email=test@example.com": Envía datos de formulario en la solicitud
Debería recibir una respuesta JSON que muestre sus datos enviados:
{
"args": {},
"data": "",
"files": {},
"form": {
"email": "test@example.com",
"name": "test"
},
"headers": {
"Accept": "*/*",
"Content-Length": "32",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.81.0",
"X-Amzn-Trace-Id": "Root=1-642295b1-0d2340ef34f2e8ea6270241a"
},
"json": null,
"origin": "198.51.100.42",
"url": "https://httpbin.org/post"
}
Prueba con encabezados personalizados
Muchas API requieren encabezados específicos para la autenticación o para especificar el tipo de contenido. Probemos esto:
curl -H "User-Agent: MyCustomAgent" -H "Authorization: Bearer test-token" https://httpbin.org/headers
Este comando:
-H "User-Agent: MyCustomAgent": Establece un encabezado User-Agent personalizado
-H "Authorization: Bearer test-token": Establece un encabezado Authorization
La respuesta mostrará los encabezados enviados en su solicitud:
{
"headers": {
"Accept": "*/*",
"Authorization": "Bearer test-token",
"Host": "httpbin.org",
"User-Agent": "MyCustomAgent",
"X-Amzn-Trace-Id": "Root=1-642295c3-73cac0a73b34b1c93a8ce520"
}
}
Prueba de tiempos de respuesta para diferentes puntos finales
Creemos un script para comparar los tiempos de respuesta de diferentes servidores:
nano response_time.sh
Agregue el siguiente contenido:
#!/bin/bash
echo "Testing response times..."
for site in google.com bing.com baidu.com duckduckgo.com yahoo.com; do
echo -n "$site: "
curl -s -o /dev/null -w "%{time_total}s" "https://$site"
echo ""
done
echo "Testing complete!"
Guarde el archivo y hágalo ejecutable:
chmod +x response_time.sh
Ejecute el script:
./response_time.sh
La salida mostrará el tiempo de respuesta para cada sitio:
Testing response times...
google.com: 0.187s
bing.com: 0.232s
baidu.com: 0.412s
duckduckgo.com: 0.298s
yahoo.com: 0.342s
Testing complete!
Esto es útil para comparar el rendimiento de diferentes servidores o para monitorear el rendimiento de un servidor a lo largo del tiempo.
Prueba de conectividad TCP a puertos específicos
A veces, necesita probar si un puerto específico está abierto en un servidor. cURL también se puede usar para esto:
curl -v telnet://example.com:80
Si el puerto está abierto, verá un mensaje de conexión exitosa:
* Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80 (#0)
Presione Ctrl+C para finalizar la conexión.
De manera similar, puede probar conexiones seguras:
curl -v https://example.com:443
La salida detallada mostrará si la conexión fue exitosa o si hubo algún problema.