Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP CURL: Manually setting the content-length header

Tags:

http

php

curl

Say I upload a file with PHP, CURL:

$postData = array();

$postData['file_name'] = "test.txt";
$postData['submit'] = "UPLOAD";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );

Now assume I have to manually set the content-length header.

$headers=array(
     "POST /rest/objects HTTP/1.1",
     'accept: */*',
     "content-length: 0" //instead of 0, how could I get the length of the body from curl?
    )
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers
$response = curl_exec($ch);

How would I measure the size of the body? (just specifying the filesize as content length doesn't seem to work)

In another example what if the body contains data that is not an actual file. (manually set by postfields) In that situation how would I get the content length of the body?

Thanks for any light shed on this, it appears to be a tough issue.

like image 855
stormist Avatar asked Dec 16 '09 18:12

stormist


People also ask

How do you give content-length in cURL?

To manually pass the Content-Length header, you need to add the Content-Length: [length] and Content-Type: [mime type] headers to your request, which describe the size and type of data in the body of the POST request.

How do I set the content-length in an HTTP header?

In PHP you would use something like this. header("Content-Length: ". filesize($filename)); In case of "Content-Type: application/x-www-form-urlencoded" the encoded data is sent to the processing agent designated so you can set the length or size of the data you are going to post.

Does cURL set content-length automatically?

By default curl sets appropriate Content-Length header for you when data is provided with -d parameter. In your case the server seems to wait for some data in the body. But for some reason you decided to pass the data in the url.

What is cURL setopt?

curl setopt($ch, option, value) sets a cURL session option defined by the ch parameter. The value specifies the value for the specified option, and the option specifies which option to set. Return page contents with curl setopt($ch, CURLOPT RETURNTRANSFER, 1). If the value is zero, no output will be returned.


1 Answers

To get the length of a post body, try formatting the fields int a GET style string (aka param1=value1&param2=value2) then setting that string as the CURL_POSTFIELDS with curl_setopt. An array does not have to be supplied. You can simply use strlen() to get the value to use for the content-length header.

If you are posting a file (or files) in addition to other fields, as you appear to be in the example above, you have to supply the value for the file as @/path/to/file, then get the filesize in bytes and add that to the total content-length.

So for the above example, assuming the file test.txt is in the /test dir of your server, the post value string would be file_name=@/test/text.txt&submit=UPLOAD. You MUST url_encode this string as well, before you assign it as the curl post value. To get the content length you get the length of that string (post url-encoding) and add it to the filesize of /test/test.txt.

like image 161
eCaroth Avatar answered Sep 18 '22 19:09

eCaroth