8
votes

I can view the headers of a request sent using php curl with the following:

curl_getinfo($ch, CURLINFO_HEADER_OUT);

I wish to see the body of what is being sent out as well but cannot for the life of me find any way to do so.

4

4 Answers

2
votes

I was unable to find any such option after extensively searching the PHP cURL documentation.

My solution was to use the web proxy tool Charles

Charles is an HTTP proxy / HTTP monitor / Reverse Proxy that enables a developer to view all of the HTTP and SSL / HTTPS traffic between their machine and the Internet. This includes requests, responses and the HTTP headers (which contain the cookies and caching information).

0
votes

router.php

<?=file_get_contents('php://input');

Start embedded server

php -S 127.0.0.0:8080 ./router.php

Test cURL:

<?php

$ch = curl_init("http://127.0.0.1:8080/");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Content-Type: application/json",
  "Expect: 100-Continue"
]);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

$fields = ["bri" => 255];
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode((object)$fields));

$response = curl_exec($ch);

print curl_getinfo($ch, CURLINFO_HEADER_OUT);
print $response;
-1
votes

Setting CURLOPT_HEADER to true will return the headers with the body of the response, this can then be parsed out of the response and processed seperately. Something like the following should work to print both the in and out headers:

$url = "https://www.example.com";
$ch = curl_init();

// Configure cURL handle
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_URL, $url);

$x = curl_exec($ch);

print "\nHeaders:\n";

// Get the out headers, explode into an array, and remove any empty string entries
$outHeaders = explode("\n", curl_getinfo($ch, CURLINFO_HEADER_OUT));
$outHeaders = array_filter($outHeaders, function($value) { return $value !== '' && $value !== ' ' && strlen($value) != 1; });
print_r($outHeaders);

// Seperate in headers from body of response
list($inHeaders, $content) = explode("\r\n\r\n", $x, 2);

// Break in headers into array and print_r them
$inHeaders = explode("\n", $inHeaders);
print_r($inHeaders);
-4
votes

Try this function:

function url_get_contents ($Url) {
    if (!function_exists('curl_init')){ 
        die('CURL is not installed!');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}