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