Before you ask: I have already checked every similar question that already had an answer, and none of the proposed solutions work. So I'm hoping someone may be able to notice a mistake in my code.
When submitting a cURL post to Google, I am returned with a 411 error, "POST requests require a Content-length header"
//Info required to authenticate
$URL = "https://www.google.com/accounts/ClientLogin";
$POST = http_build_query(array(
'Email' => '[email protected]',
'Passwd' => 'XXXXXXXXXXXXXXX',
'source' => 'primary',
'service' => 'cl'
));
$ch = curl_init( $URL );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $POST);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); //returns SID=<sid code>nLSID=<lsid code>nAuth=<auth code> or ERROR=<message>
if ( curl_errno($ch) )
die( 'Error contacting server' );
//Successful auth results in http code 200
if ( curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200 )
die( 'Failed to authenticate' );
//Extract auth code - Authorization: GoogleLogin auth=yourAuthToken
$auth_code = substr($response, strpos($response, 'Auth=')+5);
//We're done here
curl_close($ch);
$url = "https://www.googleapis.com/calendar/v3/calendars/".urlencode('[email protected]')."/events?sendNotifications=true&pp=1&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx";
$post_data = http_build_query(array(
"end" => array("dateTime" => "2013-14-11T10:40:00.000-07:00"),
"start" => array("dateTime" => "2013-14-11T10:00:00.000-07:00"),
"summary" => "my_summary",
"description" => "my_description"
));
$headers = array(
'Authorization: GoogleLogin auth='.$auth_code.'',
'Content-Type: application/json'
);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch2);
curl_close($ch2);
echo '<pre>'.print_r($output).'</pre>';
Things I have tried:
-Adding the 'Content-length: '.strlen($post_data)
-Content-type of 'x-www-form-urlencoded'
-using a very simply json string for post_data so that I didn't use http_build_query
-Trying to make it send as a PUT instead of POST
-And a few other things over the course of the last few days that I can't quite recall right now
Intent: To add an event to only MY calendar using only PHP with no authentication steps required by the user. This must be able to run all within a php function, asynchronously (called via AJAX)
NOTE: Not using Wordpress or any other CMS
-Kyle
I was struggling for a while with a similar problem. In my case it was because one of the values I was setting in my headers ended with a newline character. This meant that the server receiving the post would see the double-newline and prematurely think the headers were finished (which stopped the Content-Length header from being read). Solution was to trim the newline char.
I think you need to set CURLOPT_HTTPHEADER
. You can try to pass data as a json string as stated below.
$post_data = array(
"end" => array("dateTime" => "2013-14-11T10:40:00.000-07:00"),
"start" => array("dateTime" => "2013-14-11T10:00:00.000-07:00"),
"summary" => "my_summary",
"description" => "my_description"
);
$post_data = json_encode($post_data);
curl_setopt($ch2, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($post_data),)
);
I was receiving the same content error as you and found that I had an erroneous line break in my header, caused by a variable I was including.
I tracked this down using curl_setopt($ch, CURLINFO_HEADER_OUT, true);
which makes curl_getinfo()
include the request's headers in its output.
Using trim()
on the variable fixed it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With