title: PHP CURL GET/POST Digest authentication
body: <p>I am using curl method to fetch data from REST API. API requires digest authenticate. I have done digest authenticate but not working for post method. Working fine for GET method.</p>
  
  <pre><code>$username = 'username';
  $password = 'password';
  
  $method = 'GET';
  // $method = 'POST';
  
  //  FOR POST METHOD. API REQUIRE THIS FORMAT
  // $fields = array('APIRquestData' =&gt; '{"name":"value","name1":["v4","v5"]}');
  
  $url = "http://apiurl/getmethodname";
  // $url = "http://apiurl/postmethodname";
  
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL, $url);
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch,CURLOPT_FOLLOWLOCATION, false);
  curl_setopt($ch,CURLOPT_TIMEOUT, 30);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 30);
  if($method == 'POST')
  {
    $fieldsData = http_build_query($fields);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $fieldsData);
  }
  
  curl_setopt($ch, CURLOPT_HEADER, 1)
  $first_response = curl_exec($ch);
  $info = curl_getinfo($ch);
  
  preg_match('/WWW-Authenticate: Digest (.*)/', $first_response, $matches);
  
  if(!empty($matches))
  {
    $auth_header = $matches[1];
    $auth_header_array = explode(',', $auth_header);
    $parsed = array();
  
    foreach ($auth_header_array as $pair)
    {
      $vals = explode('=', $pair);
      $parsed[trim($vals[0])] = trim($vals[1], '" ');
    }
  
    $response_realm     = (isset($parsed['realm'])) ? $parsed['realm'] : "";
    $response_nonce     = (isset($parsed['nonce'])) ? $parsed['nonce'] : "";
    $response_opaque    = (isset($parsed['opaque'])) ? $parsed['opaque'] : "";
  
    $authenticate1 = md5($username.":".$response_realm.":".$password);
    $authenticate2 = md5($method.":".$url);
  
    $authenticate_response = md5($authenticate1.":".$response_nonce.":".$authenticate2);
  
    $request = sprintf('Authorization: Digest username="%s", realm="%s", nonce="%s", opaque="%s", uri="%s", response="%s"',
    $username, $response_realm, $response_nonce, $response_opaque, $url, $authenticate_response);
  
    $request_header = array($request);
  
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION, false);
    curl_setopt($ch,CURLOPT_TIMEOUT, 30);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 30);
  
    if($method == 'POST')
    {
      $fieldsData = http_build_query($fields);
      curl_setopt($ch,CURLOPT_POSTFIELDS, $fieldsData);
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $request_header);
  
    $result['response']         = curl_exec($ch);
    $result['info']             = curl_getinfo ($ch);
    $result['info']['errno']    = curl_errno($ch);
    $result['info']['errmsg']   = curl_error($ch); 
  }
  
  
  /*
  I am getting this as response
  
  Array
  (
    [response] =&gt;  
  
    HTTP Status 404 - 
    type Status report
    message 
    description The requested resource () is not available.
    [info] =&gt; Array
      (
          [url] =&gt; http://apiurl/postmethodname
          [content_type] =&gt; text/html;charset=ISO-8859-1
          [http_code] =&gt; 404
          [header_size] =&gt; 361
          [request_size] =&gt; 551
          [filetime] =&gt; -1
          [ssl_verify_result] =&gt; 0
          [redirect_count] =&gt; 0
          [total_time] =&gt; 0.109
          [namelookup_time] =&gt; 0
          [connect_time] =&gt; 0.063
          [pretransfer_time] =&gt; 0.063
          [size_upload] =&gt; 114
          [size_download] =&gt; 956
          [speed_download] =&gt; 8770
          [speed_upload] =&gt; 1045
          [download_content_length] =&gt; 956
          [upload_content_length] =&gt; 114
          [starttransfer_time] =&gt; 0.109
          [redirect_time] =&gt; 0
          [redirect_url] =&gt; 
          [primary_ip] =&gt; XXX.X.XX.XX
          [certinfo] =&gt; Array
              (
              )
  
          [primary_port] =&gt; 80
          [local_ip] =&gt; XX.XX.XX.XXX
          [local_port] =&gt; 58850
          [errno] =&gt; 0
          [errmsg] =&gt; 
      )
  )
  */
  </code></pre>
  
  <p>Response says that, 404 means URL not found. But URL is correct.</p>
  
  <p>cURL Information 7.40.0</p>
  
  <p>Thanks in advance.</p>