CURLINFO_CONTENT_LENGTH_DOWNLOAD contains zero in FTP request although Content-Length field is present.
Following workaround may helps:
<?php
$ch = curl_init($url);
... CURL OPTIONS ...
$result=curl_exec($ch);
$pu=parse_url($url);
if($pu['scheme']=='ftp'){
$regexp="/Content-Length: (\d*)/";
preg_match($regexp,$result,$matches);
$con_len=$matches[1];
}
else $con_len = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
?>
Its worth to keep using CURLINFO_CONTENT_LENGTH_DOWNLOAD in http requests, becouse there could be several headers pack if CURLOPT_FOLLOWLOCATION is fired, and regular expression for this case is a little bit complicated.
curl_getinfo
(PHP 4 >= 4.0.4, PHP 5)
curl_getinfo — Get information regarding a specific transfer
Description
Gets information about the last transfer,
Parameters
- ch
-
A cURL handle returned by curl_init().
- opt
-
This may be one of the following constants:
- CURLINFO_EFFECTIVE_URL - Last effective URL
- CURLINFO_HTTP_CODE - Last received HTTP code
- CURLINFO_FILETIME - Remote time of the retrieved document, if -1 is returned the time of the document is unknown
- CURLINFO_TOTAL_TIME - Total transaction time in seconds for last transfer
- CURLINFO_NAMELOOKUP_TIME - Time in seconds until name resolving was complete
- CURLINFO_CONNECT_TIME - Time in seconds it took to establish the connection
- CURLINFO_PRETRANSFER_TIME - Time in seconds from start until just before file transfer begins
- CURLINFO_STARTTRANSFER_TIME - Time in seconds until the first byte is about to be transferred
- CURLINFO_REDIRECT_TIME - Time in seconds of all redirection steps before final transaction was started
- CURLINFO_SIZE_UPLOAD - Total number of bytes uploaded
- CURLINFO_SIZE_DOWNLOAD - Total number of bytes downloaded
- CURLINFO_SPEED_DOWNLOAD - Average download speed
- CURLINFO_SPEED_UPLOAD - Average upload speed
- CURLINFO_HEADER_SIZE - Total size of all headers received
- CURLINFO_HEADER_OUT - The request string sent. Available since PHP 5.1.3
- CURLINFO_REQUEST_SIZE - Total size of issued requests, currently only for HTTP requests
- CURLINFO_SSL_VERIFYRESULT - Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER
- CURLINFO_CONTENT_LENGTH_DOWNLOAD - content-length of download, read from Content-Length: field
- CURLINFO_CONTENT_LENGTH_UPLOAD - Specified size of upload
- CURLINFO_CONTENT_TYPE - Content-type of downloaded object, NULL indicates server did not send valid Content-Type: header
Return Values
If opt is given, returns its value as a string. Otherwise, returns an associative array with the following elements (which correspond to opt ):
- "url"
- "content_type"
- "http_code"
- "header_size"
- "request_size"
- "filetime"
- "ssl_verify_result"
- "redirect_count"
- "total_time"
- "namelookup_time"
- "connect_time"
- "pretransfer_time"
- "size_upload"
- "size_download"
- "speed_download"
- "speed_upload"
- "download_content_length"
- "upload_content_length"
- "starttransfer_time"
- "redirect_time"
curl_getinfo
master-No-sp-aM at io dot ua
17-Jul-2008 12:40
17-Jul-2008 12:40
nemetral
17-Jun-2008 07:57
17-Jun-2008 07:57
Just a quick note: if you want to use curl_getinfo() with option CURLINFO_HEADER_OUT in order to debug your cURL request, you must add curl_setopt($handle, CURLINFO_HEADER_OUT, true); first while specifying the options.
luiheidsgoeroe at hotmail dot com
04-Feb-2008 03:02
04-Feb-2008 03:02
Keep in mind that for CURLOPT_RETURNTRANSFER it has to be set with curl_setopt() before execution:
This doesn't work:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>
This works:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>
Mark Evers
16-Jan-2008 10:14
16-Jan-2008 10:14
There is a constant missing from that list. CURLINFO_REDIRECT_COUNT will give you the number of redirects it went through if CURLOPT_FOLLOWLOCATION was set.
ssttoo at hotmail dot com
06-Apr-2004 12:13
06-Apr-2004 12:13
Here are the response codes ready for pasting in an ini-style file. Can be used to provide more descriptive message, corresponding to 'http_code' index of the arrray returned by curl_getinfo().
These are taken from the W3 consortium HTTP/1.1: Status Code Definitions, found at
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
[Informational 1xx]
100="Continue"
101="Switching Protocols"
[Successful 2xx]
200="OK"
201="Created"
202="Accepted"
203="Non-Authoritative Information"
204="No Content"
205="Reset Content"
206="Partial Content"
[Redirection 3xx]
300="Multiple Choices"
301="Moved Permanently"
302="Found"
303="See Other"
304="Not Modified"
305="Use Proxy"
306="(Unused)"
307="Temporary Redirect"
[Client Error 4xx]
400="Bad Request"
401="Unauthorized"
402="Payment Required"
403="Forbidden"
404="Not Found"
405="Method Not Allowed"
406="Not Acceptable"
407="Proxy Authentication Required"
408="Request Timeout"
409="Conflict"
410="Gone"
411="Length Required"
412="Precondition Failed"
413="Request Entity Too Large"
414="Request-URI Too Long"
415="Unsupported Media Type"
416="Requested Range Not Satisfiable"
417="Expectation Failed"
[Server Error 5xx]
500="Internal Server Error"
501="Not Implemented"
502="Bad Gateway"
503="Service Unavailable"
504="Gateway Timeout"
505="HTTP Version Not Supported"
And an example usage:
<?php
$ch = curl_init(); // create cURL handle (ch)
if (!$ch) {
die("Couldn't initialize a cURL handle");
}
// set some cURL options
$ret = curl_setopt($ch, CURLOPT_URL, "http://mail.yahoo.com");
$ret = curl_setopt($ch, CURLOPT_HEADER, 1);
$ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$ret = curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// execute
$ret = curl_exec($ch);
if (empty($ret)) {
// some kind of an error happened
die(curl_error($ch));
curl_close($ch); // close cURL handler
} else {
$info = curl_getinfo($ch);
curl_close($ch); // close cURL handler
if (empty($info['http_code'])) {
die("No HTTP code was returned");
} else {
// load the HTTP codes
$http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above");
// echo results
echo "The server responded: <br />";
echo $info['http_code'] . " " . $http_codes[$info['http_code']];
}
}
?>
12-Sep-2002 02:02
You can get some documentation about what these values mean in the libcurl C API documentation here:
http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html
