2009-05-15 21 views

Respuesta

30

La opción --trace-ascii de curl mostrará los encabezados de solicitud, así como los encabezados de respuesta y el cuerpo de la respuesta.

Por ejemplo, el comando

curl --trace-ascii curl.trace http://www.google.com/ 

produce un archivo curl.trace que comienza como sigue:

== Info: About to connect() to www.google.com port 80 (#0) 
== Info: Trying 209.85.229.104... == Info: connected 
== Info: Connected to www.google.com (209.85.229.104) port 80 (#0) 
=> Send header, 145 bytes (0x91) 
0000: GET/HTTP/1.1 
0010: User-Agent: curl/7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 
0050: OpenSSL/0.9.7l zlib/1.2.3 
006c: Host: www.google.com 
0082: Accept: */* 
008f: 

También obtuvo una respuesta (una respuesta 302, para ser precisos pero irrelevante) que era registrado.


Si sólo desea guardar la respuesta cabeceras, utilice la opción --dump-header:

curl -D file url 
curl --dump-header file url 

Si necesita más información sobre las opciones disponibles, utilice curl --help | less (que produce un par de cientos de líneas de salida pero menciona muchas opciones). O encuentre el manual page donde hay más explicación de lo que significan las opciones.

+9

-D le da los encabezados _response_ (como lo hace -I, pero a STDIN). La pregunta solicitó los encabezados _request_. – pr1001

+0

Buen punto ... y la opción --trace-ascii hace el trabajo. –

29

rizo --trace-ascii {nombre del archivo} o utilizar un único guión en lugar del nombre del archivo conseguirlo envía a la salida estándar:

curl --trace-ascii - {URL} 

CURLOPT_DEBUGFUNCTION si está usando libcurl

Esto le muestra todo lo rizo envía y recibe, con algo de información adicional.

+0

Esto es muy detallado, pero ciertamente te muestra todo lo que debes saber. – tripleee

1

Puede usar wireshark o tcpdump para examinar cualquier tráfico de red (http también).

+11

si la carga es sobre HTTPS, son inútiles sin un proxy o monitor de capa de aplicación. – p00ya

43

La única manera me las arreglé para ver mis encabezados salientes (Curl con php) estaba usando las siguientes opciones:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 

conseguir su información de depuración:

$data = curl_exec($ch); 
var_dump($data); 
var_dump(curl_getinfo($ch)); 
+1

Para mí, parecía ser el encabezado de respuesta no el encabezado saliente. – Toby

+3

'var_dump $ data' devolverá los encabezados de respuesta y el cuerpo de la respuesta. El var_dump 'curl_getinfo ($ ch)' le dará los encabezados de solicitud. – Jrgns

+2

'CURLOPT_HEADER' es el encabezado de respuesta -' CURLINFO_HEADER_OUT' es el encabezado de la solicitud. Esto es lo que el OP está pidiendo :) –

394

Creo curl -v es la más fácil . Será escupir las cabeceras de petición (líneas con el prefijo '>') sin tener que escribir en un archivo:

$ curl -v -I -H "Testing: Test header so you see this works" http://stackoverflow.com/ 
* About to connect() to stackoverflow.com port 80 (#0) 
* Trying 69.59.196.211... connected 
* Connected to stackoverflow.com (69.59.196.211) port 80 (#0) 
> HEAD/HTTP/1.1 
> User-Agent: curl/7.16.3 (i686-pc-cygwin) libcurl/7.16.3 OpenSSL/0.9.8h zlib/1.2.3 libssh2/0.15-CVS 
> Host: stackoverflow.com 
> Accept: */* 
> Testing: Test header so you see this works 
> 
< HTTP/1.0 200 OK 
... 
+48

curl -v -D - stackoverflow.com -o/dev/null (para no mostrar todo el contenido del sitio, solo encabezados) –

+16

'curl -Ivs http: // example.com>/dev/null': '-I' para una solicitud' HEAD', '-v' para mostrar los encabezados enviados,' -s' para ocultar la barra de progreso, '>/dev/null' para mostrar solo el -v salida, evitando la duplicación. – here

+0

@PiotrekDe '-D -' estaba ordenado, pero no me fue útil ya que simplemente duplicaba los encabezados que' -v' ya mostraba. Si quiere que no estén prefijados para el consumo automático de la máquina, entonces tal vez sería mejor en ese caso, pero solo quería echar un vistazo a lo que era un problema con más detalle. – Pysis

3

Aquí es mi cliente HTTP en php para realizar consultas de correos con las galletas incluye:

function http_login_client($url, $params = "", $cookies_send = ""){ 

    // Vars 
    $cookies = array(); 
    $headers = getallheaders(); 

    // Perform a http post request to $ur1 using $params 
    $ch = curl_init($url); 
    $options = array( CURLOPT_POST => 1, 
         CURLINFO_HEADER_OUT => true, 
         CURLOPT_POSTFIELDS => $params, 
         CURLOPT_RETURNTRANSFER => 1, 
         CURLOPT_HEADER => 1, 
         CURLOPT_COOKIE => $cookies_send, 
         CURLOPT_USERAGENT => $headers['User-Agent'] 
        ); 

    curl_setopt_array($ch, $options); 

    $response = curl_exec($ch); 

// DEBUG info echo $ response; var_dump (curl_getinfo ($ ch)); ///

// Parse response and read cookies 
    preg_match_all('/^Set-Cookie: (.*?)=(.*?);/m', $response, $matches); 

    // Build an array with cookies 
    foreach($matches[1] as $index => $cookie) 
     $cookies[$cookie] = $matches[2][$index]; 

    return $cookies; 
} // end http_login_client 
129

La pregunta no especificó si el comando línea de comandos denominada curl estaba destinado o toda la biblioteca cURL.

El siguiente código PHP que utiliza la biblioteca cURL utiliza el primer parámetro como método HTTP (por ejemplo, "GET", "POST", "OPTIONS") y el segundo parámetro como URL. el uso

<?php 
$ch = curl_init(); 
$f = tmpfile(); # will be automatically removed after fclose() 
curl_setopt_array($ch, array(
    CURLOPT_CUSTOMREQUEST => $argv[1], 
    CURLOPT_URL   => $argv[2], 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_FOLLOWLOCATION => 0, 
    CURLOPT_VERBOSE  => 1, 
    CURLOPT_HEADER   => 0, 
    CURLOPT_CONNECTTIMEOUT => 5, 
    CURLOPT_TIMEOUT  => 30, 
    CURLOPT_STDERR   => $f, 
)); 
$response = curl_exec($ch); 
fseek($f, 0); 
echo fread($f, 32*1024); # output up to 32 KB cURL verbose log 
fclose($f); 
curl_close($ch); 
echo $response; 

Ejemplo:

php curl-test.php OPTIONS https://google.com 

Tenga en cuenta que los resultados son casi idénticos a siguiente línea de comandos

curl -v -s -o - -X OPTIONS https://google.com 
+0

Esta es la mejor respuesta, porque el archivo utilizado en este método contiene todo en curl_getinfo() al que se hace referencia a continuación, junto con más detalles sobre la solicitud y la respuesta. –

+0

¡Agradable! ¿Alguna forma de mejorar el código para mostrar los datos POST también? Es decir. eso agregado por curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ postData); –

+0

Esto no tiene sentido. 'CURLOPT_STDERR' hace curl write ** errors ** en la secuencia' $ f', no los datos de solicitud. Y es por eso que no funcionó para mí. A menos que me esté perdiendo algo importante? –

5

volcar los encabezados en un archivo y la carga útil de la respuesta en una archivo diferente

curl -k -v -u user:pass "url" --trace-ascii headers.txt >> response.txt 
5
curl -s -v -o/dev/null -H "Testheader: test" http://www.example.com

También puede usar la opción -I si desea enviar una solicitud HEAD y no una solicitud GET.

0

Realice una solicitud de muestra a https://http-tools.appspot.com/reflect-http-request/some-unique-id y compruebe lo que contiene esta solicitud (encabezado de solicitud, cuerpo de solicitud, parámetros de solicitud) por su correspondiente URL de buscador https://http-tools.appspot.com/reflect-http-request-finder/some-unique-id. Puede utilizar cualquier cadena en lugar de some-unique-id, consulte https://http-tools.appspot.com para obtener más información.

24

probé las respuestas aquí y nos pareció que el más útil y más fácil no aparece como una respuesta todavía, pero es:

curl -v https://example.com/path 

Esto muestra la SOLICITUD cabeceras, así como la RESPONSE encabezados más otros útiles como el certificado SSL y si se reutilizó una conexión TCP existente. la bandera -v se puede combinar con otras banderas, por supuesto, tal que sigue las redirecciones y rápido para la autenticación HTTP:

curl -vL --user my_username https://example.com/path 

Espero que esto ayude.

+1

aparece en el lugar más alto – Trix

2

Se puede ver mediante el uso de -iv

$> curl -ivH "apikey:ad9ff3d36888957" --form "[email protected]/home/mar/workspace/images/8.jpg" --form "language=eng" --form "isOverlayRequired=true" https://api.ocr.space/Parse/Image 
1

Sé que esto es un poco tarde, pero mi método favorito para hacer esto es netcat, tal como se obtiene exactamente lo envió curl; esto puede diferir de las opciones --trace o --trace-ascii que no mostrarán los caracteres no ASCII correctamente (solo se muestran como puntos o deben decodificarse).

Usted puede hacer esto muy fácilmente mediante la apertura de dos ventanas de terminal, en el primer tipo:

nc -l localhost 12345 

Esto abre un proceso de escucha en el puerto 12345 de la máquina local.

En la segunda ventana de terminal introduzca su comando curl, por ejemplo:

curl --form 'foo=bar' localhost:12345 

En la primera ventana de terminal verá exactamente lo rizo enviado en la solicitud.

Ahora, por supuesto, nc no enviará nada en respuesta (a menos que lo escriba en usted mismo), por lo que deberá interrumpir el comando curl (control-c) y repetir el proceso para cada prueba.

Sin embargo, esta es una opción útil para simplemente depurar su solicitud, ya que no implica un viaje de ida y vuelta a ninguna parte, o producir solicitudes falsas e iterativas en alguna parte hasta que lo haga bien; una vez que esté satisfecho con el comando, simplemente redirigirlo a una URL válida y listo.

Puede hacer lo mismo para cualquier biblioteca cURL, simplemente edite su solicitud para apuntar al oyente local nc hasta que esté satisfecho con ella.

Cuestiones relacionadas