<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="function.curl-getinfo" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>curl_getinfo</refname>
  <refpurpose>Get information regarding a specific transfer</refpurpose>
 </refnamediv>
 
 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>mixed</type><methodname>curl_getinfo</methodname>
   <methodparam><type>CurlHandle</type><parameter>handle</parameter></methodparam>
   <methodparam choice="opt"><type class="union"><type>int</type><type>null</type></type><parameter>option</parameter><initializer>&null;</initializer></methodparam>
  </methodsynopsis>
  <para>
   Gets information about the last transfer. 
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    &curl.ch.description;
    <varlistentry>
     <term><parameter>option</parameter></term>
     <listitem>
      <para>
       This may be one of the following constants:
       <itemizedlist>
        <listitem>
         <simpara>
          <constant>CURLINFO_EFFECTIVE_URL</constant> - Last effective URL
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_HTTP_CODE</constant> -  The last response code.
          As of cURL 7.10.8, this is a legacy alias of
          <constant>CURLINFO_RESPONSE_CODE</constant>
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_FILETIME</constant> - Remote time of the retrieved document, with the <constant>CURLOPT_FILETIME</constant> enabled; if -1 is returned the time of the document is unknown
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_TOTAL_TIME</constant> - Total transaction time in seconds for last transfer
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_NAMELOOKUP_TIME</constant> - Time in seconds until name resolving was complete
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONNECT_TIME</constant> - Time in seconds it took to establish the connection
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PRETRANSFER_TIME</constant> - Time in seconds from start until just before file transfer begins
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_STARTTRANSFER_TIME</constant> - Time in seconds until the first byte is about to be transferred
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_REDIRECT_COUNT</constant> - Number of redirects, with the <constant>CURLOPT_FOLLOWLOCATION</constant> option enabled
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_REDIRECT_TIME</constant> - Time in seconds of all redirection steps before final transaction was started, with the <constant>CURLOPT_FOLLOWLOCATION</constant> option enabled
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_REDIRECT_URL</constant> - With the <constant>CURLOPT_FOLLOWLOCATION</constant> option disabled: redirect URL found in the last transaction, that should be requested manually next. With the <constant>CURLOPT_FOLLOWLOCATION</constant> option enabled: this is empty. The redirect URL in this case is available in <constant>CURLINFO_EFFECTIVE_URL</constant> 
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PRIMARY_IP</constant> - IP address of the most recent connection
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PRIMARY_PORT</constant> - Destination port of the most recent connection
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_LOCAL_IP</constant> - Local (source) IP address of the most recent connection
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_LOCAL_PORT</constant> - Local (source) port of the most recent connection
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SIZE_UPLOAD</constant> - Total number of bytes uploaded
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SIZE_DOWNLOAD</constant> - Total number of bytes downloaded
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SPEED_DOWNLOAD</constant> - Average download speed
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SPEED_UPLOAD</constant> - Average upload speed
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_HEADER_SIZE</constant> - Total size of all headers received
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_HEADER_OUT</constant> - The request string sent. For this to 
          work, add the <constant>CURLINFO_HEADER_OUT</constant> option to the handle by calling 
          <function>curl_setopt</function>
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_REFERER</constant> - The referrer header
         </simpara>
        </listitem>
        <listitem>
         <simpara>
        <constant>CURLINFO_REQUEST_SIZE</constant> - Total size of issued requests, currently only for HTTP requests
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_RETRY_AFTER</constant> - The information from the <literal>Retry-After:</literal> header, or zero if there was no valid header.
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SSL_VERIFYRESULT</constant> - Result of SSL certification verification requested by setting <constant>CURLOPT_SSL_VERIFYPEER</constant>
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONTENT_LENGTH_DOWNLOAD</constant> - Content length of download, read from <literal>Content-Length:</literal> field
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONTENT_LENGTH_UPLOAD</constant> - Specified size of upload
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONTENT_TYPE</constant> - <literal>Content-Type:</literal> of the requested document. NULL indicates server did not send valid <literal>Content-Type:</literal> header
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PRIVATE</constant> - Private data associated with this cURL handle, previously set with the <constant>CURLOPT_PRIVATE</constant> option of <function>curl_setopt</function>
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PROXY_ERROR</constant> - The detailed (SOCKS) proxy error code when the most recent
          transfer returned a <constant>CURLE_PROXY</constant> error. The returned value will be exactly one
          of the <constant>CURLPX_<replaceable>*</replaceable></constant> values.
          The error code will be <constant>CURLPX_OK</constant> if no
          response code was available.
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_RESPONSE_CODE</constant> - The last response code
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_HTTP_CONNECTCODE</constant> - The CONNECT response code
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_HTTPAUTH_AVAIL</constant> - Bitmask indicating the authentication method(s) available according to the previous response
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PROXYAUTH_AVAIL</constant> - Bitmask indicating the proxy authentication method(s) available according to the previous response
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_OS_ERRNO</constant> - Errno from a connect failure. The number is OS and system specific.
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_NUM_CONNECTS</constant> - Number of connections curl had to create to achieve the previous transfer
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SSL_ENGINES</constant> - OpenSSL crypto-engines supported
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_COOKIELIST</constant> - All known cookies
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_FTP_ENTRY_PATH</constant> - Entry path in FTP server
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_APPCONNECT_TIME</constant> - Time in seconds it took from the start until the SSL/SSH connect/handshake to the remote host was completed
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CERTINFO</constant> - TLS certificate chain
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONDITION_UNMET</constant> - Info on unmet time conditional
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_RTSP_CLIENT_CSEQ</constant> - Next RTSP client CSeq
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_RTSP_CSEQ_RECV</constant> - Recently received CSeq
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_RTSP_SERVER_CSEQ</constant> - Next RTSP server CSeq
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_RTSP_SESSION_ID</constant> - RTSP session ID
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONTENT_LENGTH_DOWNLOAD_T</constant> - The content-length of the download. This is the value read from the <literal>Content-Length:</literal> field. -1 if the size isn't known
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONTENT_LENGTH_UPLOAD_T</constant> - The specified size of the upload. -1 if the size isn't known
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_HTTP_VERSION</constant> - The version used in the last HTTP connection. The return value will be one of the defined <constant>CURL_HTTP_VERSION_*</constant> constants or 0 if the version can't be determined
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PROTOCOL</constant> - The protocol used in the last HTTP connection. The returned value will be exactly one of the <constant>CURLPROTO_*</constant> values
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PROXY_SSL_VERIFYRESULT</constant> - The result of the certificate verification that was requested (using the <constant>CURLOPT_PROXY_SSL_VERIFYPEER</constant> option). Only used for HTTPS proxies
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SCHEME</constant> - The URL scheme used for the most recent connection
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SIZE_DOWNLOAD_T</constant> - Total number of bytes that were downloaded. The number is only for the latest transfer and will be reset again for each new transfer
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SIZE_UPLOAD_T</constant> - Total number of bytes that were uploaded
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SPEED_DOWNLOAD_T</constant> - The average download speed in bytes/second that curl measured for the complete download
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_SPEED_UPLOAD_T</constant> - The average upload speed in bytes/second that curl measured for the complete upload 
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_APPCONNECT_TIME_T</constant> - Time, in microseconds, it took from the start until the SSL/SSH connect/handshake to the remote host was completed
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_CONNECT_TIME_T</constant> - Total time taken, in microseconds, from the start until the connection to the remote host (or proxy) was completed
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_FILETIME_T</constant> - Remote time of the retrieved document (as Unix timestamp), an alternative to <constant>CURLINFO_FILETIME</constant> to allow systems with 32 bit long variables to extract dates outside of the 32bit timestamp range
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_NAMELOOKUP_TIME_T</constant> - Time in microseconds from the start until the name resolving was completed
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_PRETRANSFER_TIME_T</constant> - Time taken from the start until the file transfer is just about to begin, in microseconds
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_REDIRECT_TIME_T</constant> - Total time, in microseconds, it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_STARTTRANSFER_TIME_T</constant> - Time, in microseconds, it took from the start until the first byte is received
         </simpara>
        </listitem>
        <listitem>
         <simpara>
          <constant>CURLINFO_TOTAL_TIME_T</constant> - Total time in microseconds for the previous transfer, including name resolving, TCP connect etc.
         </simpara>
        </listitem>
       </itemizedlist>
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   If <parameter>option</parameter> is given, returns its value.
   Otherwise, returns an associative array with the following elements 
   (which correspond to <parameter>option</parameter>), or &false; on failure:
   <itemizedlist>
    <listitem>
     <simpara>
      "url"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "content_type"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "http_code"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "header_size"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "request_size"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "filetime"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "ssl_verify_result"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "redirect_count"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "total_time"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "namelookup_time"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "connect_time"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "pretransfer_time"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "size_upload"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "size_download"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "speed_download"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "speed_upload"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "download_content_length"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "upload_content_length"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "starttransfer_time"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "redirect_time"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "certinfo"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "primary_ip"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "primary_port"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "local_ip"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "local_port"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "redirect_url"
     </simpara>
    </listitem>
    <listitem>
     <simpara>
      "request_header" (This is only set if the <constant>CURLINFO_HEADER_OUT</constant> 
      is set by a previous call to <function>curl_setopt</function>)
     </simpara>
    </listitem>
   </itemizedlist>
   Note that private data is not included in the associative array and must be retrieved individually with the <constant>CURLINFO_PRIVATE</constant> option.
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>8.2.0</entry>
       <entry>
        Introduced <constant>CURLINFO_PROXY_ERROR</constant>,
        <constant>CURLINFO_REFERER</constant>,
        <constant>CURLINFO_RETRY_AFTER</constant>.
       </entry>
      </row>
      &curl.changelog.handle-param;
      <row>
       <entry>8.0.0</entry>
       <entry>
        <parameter>option</parameter> is nullable now;
        previously, the default was <literal>0</literal>.
       </entry>
      </row>
      <row>
       <entry>7.3.0</entry>
       <entry>
        Introduced <constant>CURLINFO_CONTENT_LENGTH_DOWNLOAD_T</constant>,
        <constant>CURLINFO_CONTENT_LENGTH_UPLOAD_T</constant>, 
        <constant>CURLINFO_HTTP_VERSION</constant>,
        <constant>CURLINFO_PROTOCOL</constant>,
        <constant>CURLINFO_PROXY_SSL_VERIFYRESULT</constant>,
        <constant>CURLINFO_SCHEME</constant>,
        <constant>CURLINFO_SIZE_DOWNLOAD_T</constant>,
        <constant>CURLINFO_SIZE_UPLOAD_T</constant>,
        <constant>CURLINFO_SPEED_DOWNLOAD_T</constant>,
        <constant>CURLINFO_SPEED_UPLOAD_T</constant>,
        <constant>CURLINFO_APPCONNECT_TIME_T</constant>,
        <constant>CURLINFO_CONNECT_TIME_T</constant>,
        <constant>CURLINFO_FILETIME_T</constant>,
        <constant>CURLINFO_NAMELOOKUP_TIME_T</constant>,
        <constant>CURLINFO_PRETRANSFER_TIME_T</constant>,
        <constant>CURLINFO_REDIRECT_TIME_T</constant>,
        <constant>CURLINFO_STARTTRANSFER_TIME_T</constant>,
        <constant>CURLINFO_TOTAL_TIME_T</constant>.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </para>
 </refsect1>
 
 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title><function>curl_getinfo</function> example</title>
    <programlisting role="php">
<![CDATA[
<?php
// Create a cURL handle
$ch = curl_init('http://www.example.com/');

// Execute
curl_exec($ch);

// Check if any error occurred
if (!curl_errno($ch)) {
  $info = curl_getinfo($ch);
  echo 'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], "\n";
}

// Close handle
curl_close($ch);
?>
]]>
    </programlisting>
   </example>
  </para>
  <para>
   <example>
    <title><function>curl_getinfo</function> example with <parameter>option</parameter> parameter</title>
    <programlisting role="php">
<![CDATA[
<?php
// Create a cURL handle
$ch = curl_init('http://www.example.com/');

// Execute
curl_exec($ch);

// Check HTTP status code
if (!curl_errno($ch)) {
  switch ($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
    case 200:  # OK
      break;
    default:
      echo 'Unexpected HTTP code: ', $http_code, "\n";
  }
}

// Close handle
curl_close($ch);
?>
]]>
    </programlisting>
   </example>
  </para>
 </refsect1>
 
 <refsect1 role="notes">
  &reftitle.notes;
  <note>
   <para>
    Information gathered by this function is kept if the handle is re-used. This means 
    that unless a statistic is overridden internally by this function, the previous info 
    is returned.
   </para>
  </note>
 </refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
