Exemple #1
0
function HTTPGetResponse($fp, $debug, $options, $startts, $timeout)
{
    $recvstart = microtime(true);
    $rawdata = $data = "";
    $rawsize = $rawrecvheadersize = 0;
    do {
        $autodecode = !isset($options["auto_decode"]) || $options["auto_decode"];
        // Process the response line.
        while (strpos($data, "\n") === false && ($data2 = fgets($fp, 116000)) !== false) {
            if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
            }
            $rawsize += strlen($data2);
            $data .= $data2;
            if (isset($options["recvratelimit"])) {
                HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
            }
            if (isset($options["debug_callback"])) {
                $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
            } else {
                if ($debug) {
                    $rawdata .= $data2;
                }
            }
            if (feof($fp)) {
                break;
            }
        }
        $pos = strpos($data, "\n");
        if ($pos === false) {
            return array("success" => false, "error" => HTTPTranslate("Unable to retrieve response line."), "errorcode" => "get_response_line");
        }
        $line = trim(substr($data, 0, $pos));
        $data = substr($data, $pos + 1);
        $rawrecvheadersize += $pos + 1;
        $response = explode(" ", $line, 3);
        $response = array("line" => $line, "httpver" => strtoupper($response[0]), "code" => $response[1], "meaning" => $response[2]);
        // Process the headers.
        $headers = array();
        $lastheader = "";
        do {
            while (strpos($data, "\n") === false && ($data2 = fgets($fp, 116000)) !== false) {
                if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                    return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                }
                $rawsize += strlen($data2);
                $data .= $data2;
                if (isset($options["recvratelimit"])) {
                    HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                }
                if (isset($options["debug_callback"])) {
                    $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                } else {
                    if ($debug) {
                        $rawdata .= $data2;
                    }
                }
                if (feof($fp)) {
                    break;
                }
            }
            $pos = strpos($data, "\n");
            if ($pos === false) {
                $pos = strlen($data);
            }
            $header = rtrim(substr($data, 0, $pos));
            $data = substr($data, $pos + 1);
            $rawrecvheadersize += $pos + 1;
            if ($header != "") {
                if ($lastheader != "" && substr($header, 0, 1) == " " || substr($header, 0, 1) == "\t") {
                    $headers[$lastheader][count($headers[$lastheader]) - 1] .= $header;
                } else {
                    $pos = strpos($header, ":");
                    if ($pos === false) {
                        $pos = strlen($header);
                    }
                    $lastheader = HTTPHeaderNameCleanup(substr($header, 0, $pos));
                    if (!isset($headers[$lastheader])) {
                        $headers[$lastheader] = array();
                    }
                    $headers[$lastheader][] = ltrim(substr($header, $pos + 1));
                }
            }
        } while ($header != "");
        if ($response["code"] != 100 && isset($options["read_headers_callback"])) {
            if (!$options["read_headers_callback"]($response, $headers, $options["read_headers_callback_opts"])) {
                return array("success" => false, "error" => HTTPTranslate("Read headers callback returned with a failure condition."), "errorcode" => "read_header_callback");
            }
        }
        // Determine if decoding the content is possible and necessary.
        if ($autodecode && !isset($headers["Content-Encoding"]) || strtolower($headers["Content-Encoding"][0]) != "gzip" && strtolower($headers["Content-Encoding"][0]) != "deflate") {
            $autodecode = false;
        }
        if (!$autodecode) {
            $autodecode_ds = false;
        } else {
            require_once str_replace("\\", "/", dirname(__FILE__)) . "/deflate_stream.php";
            // Since servers and browsers do everything wrong, ignore the encoding claim and attempt to auto-detect the encoding.
            $autodecode_ds = new DeflateStream();
            $autodecode_ds->Init("rb", -1, array("type" => "auto"));
        }
        // Process the body.
        $body = "";
        if (isset($headers["Transfer-Encoding"]) && strtolower($headers["Transfer-Encoding"][0]) == "chunked") {
            do {
                // Calculate the next chunked size and ignore chunked extensions.
                while (strpos($data, "\n") === false && ($data2 = fgets($fp, 116000)) !== false) {
                    if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                        return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                    }
                    $rawsize += strlen($data2);
                    $data .= $data2;
                    if (isset($options["recvratelimit"])) {
                        HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                    }
                    if (isset($options["debug_callback"])) {
                        $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                    } else {
                        if ($debug) {
                            $rawdata .= $data2;
                        }
                    }
                    if (feof($fp)) {
                        break;
                    }
                }
                $pos = strpos($data, "\n");
                if ($pos === false) {
                    $pos = strlen($data);
                }
                $line = trim(substr($data, 0, $pos));
                $data = substr($data, $pos + 1);
                $pos = strpos($line, ";");
                if ($pos === false) {
                    $pos = strlen($line);
                }
                $size = hexdec(substr($line, 0, $pos));
                if ($size < 0) {
                    $size = 0;
                }
                // Retrieve content.
                $size2 = $size;
                $size3 = min(strlen($data), $size);
                if ($size3 > 0) {
                    $data2 = substr($data, 0, $size3);
                    $data = substr($data, $size3);
                    $size2 -= $size3;
                    if ($response["code"] == 100 || !isset($options["read_body_callback"])) {
                        $body .= HTTPGetDecodedBody($autodecode_ds, $data2);
                    } else {
                        if (!$options["read_body_callback"]($response, HTTPGetDecodedBody($autodecode_ds, $data2), $options["read_body_callback_opts"])) {
                            return array("success" => false, "error" => HTTPTranslate("Read body callback returned with a failure condition."), "errorcode" => "read_body_callback");
                        }
                    }
                }
                while ($size2 > 0 && ($data2 = fread($fp, $size2 > 65536 ? 65536 : $size2)) !== false) {
                    if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                        return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                    }
                    $tempsize = strlen($data2);
                    $rawsize += $tempsize;
                    $size2 -= $tempsize;
                    if ($response["code"] == 100 || !isset($options["read_body_callback"])) {
                        $body .= HTTPGetDecodedBody($autodecode_ds, $data2);
                    } else {
                        if (!$options["read_body_callback"]($response, HTTPGetDecodedBody($autodecode_ds, $data2), $options["read_body_callback_opts"])) {
                            return array("success" => false, "error" => HTTPTranslate("Read body callback returned with a failure condition."), "errorcode" => "read_body_callback");
                        }
                    }
                    if (isset($options["recvratelimit"])) {
                        HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                    }
                    if (isset($options["debug_callback"])) {
                        $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                    } else {
                        if ($debug) {
                            $rawdata .= $data2;
                        }
                    }
                    if (feof($fp)) {
                        break;
                    }
                }
                // Ignore one newline.
                while (strpos($data, "\n") === false && ($data2 = fgets($fp, 116000)) !== false) {
                    if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                        return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                    }
                    $rawsize += strlen($data2);
                    $data .= $data2;
                    if (isset($options["recvratelimit"])) {
                        HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                    }
                    if (isset($options["debug_callback"])) {
                        $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                    } else {
                        if ($debug) {
                            $rawdata .= $data2;
                        }
                    }
                    if (feof($fp)) {
                        break;
                    }
                }
                $pos = strpos($data, "\n");
                if ($pos === false) {
                    $pos = strlen($data);
                }
                $data = substr($data, $pos + 1);
            } while ($size);
            // Process additional headers.
            $lastheader = "";
            do {
                while (strpos($data, "\n") === false && ($data2 = fgets($fp, 116000)) !== false) {
                    if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                        return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                    }
                    $rawsize += strlen($data2);
                    $data .= $data2;
                    if (isset($options["recvratelimit"])) {
                        HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                    }
                    if (isset($options["debug_callback"])) {
                        $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                    } else {
                        if ($debug) {
                            $rawdata .= $data2;
                        }
                    }
                    if (feof($fp)) {
                        break;
                    }
                }
                $pos = strpos($data, "\n");
                if ($pos === false) {
                    $pos = strlen($data);
                }
                $header = rtrim(substr($data, 0, $pos));
                $data = substr($data, $pos + 1);
                $rawrecvheadersize += $pos + 1;
                if ($header != "") {
                    if ($lastheader != "" && (substr($header, 0, 1) == " " || substr($header, 0, 1) == "\t")) {
                        $headers[$lastheader][count($headers[$lastheader]) - 1] .= $header;
                    } else {
                        $pos = strpos($header, ":");
                        if ($pos === false) {
                            $pos = strlen($header);
                        }
                        $lastheader = HTTPHeaderNameCleanup(substr($header, 0, $pos));
                        if (!isset($headers[$lastheader])) {
                            $headers[$lastheader] = array();
                        }
                        $headers[$lastheader][] = ltrim(substr($header, $pos + 1));
                    }
                }
            } while ($header != "");
            if ($response["code"] != 100 && isset($options["read_headers_callback"])) {
                if (!$options["read_headers_callback"]($response, $headers, $options["read_headers_callback_opts"])) {
                    return array("success" => false, "error" => HTTPTranslate("Read headers callback returned with a failure condition."), "errorcode" => "read_header_callback");
                }
            }
        } else {
            if (isset($headers["Content-Length"])) {
                $size = (int) $headers["Content-Length"][0];
                $datasize = 0;
                while ($datasize < $size && ($data2 = fread($fp, $size > 65536 ? 65536 : $size)) !== false) {
                    if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                        return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                    }
                    $tempsize = strlen($data2);
                    $datasize += $tempsize;
                    $rawsize += $tempsize;
                    if ($response["code"] == 100 || !isset($options["read_body_callback"])) {
                        $body .= HTTPGetDecodedBody($autodecode_ds, $data2);
                    } else {
                        if (!$options["read_body_callback"]($response, HTTPGetDecodedBody($autodecode_ds, $data2), $options["read_body_callback_opts"])) {
                            return array("success" => false, "error" => HTTPTranslate("Read body callback returned with a failure condition."), "errorcode" => "read_body_callback");
                        }
                    }
                    if (isset($options["recvratelimit"])) {
                        HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                    }
                    if (isset($options["debug_callback"])) {
                        $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                    } else {
                        if ($debug) {
                            $rawdata .= $data2;
                        }
                    }
                    if (feof($fp)) {
                        break;
                    }
                }
            } else {
                if ($response["code"] != 100) {
                    while (($data2 = fread($fp, 65536)) !== false) {
                        if ($timeout !== false && HTTPGetTimeLeft($startts, $timeout) == 0) {
                            return array("success" => false, "error" => HTTPTranslate("HTTP timeout exceeded."), "errorcode" => "timeout_exceeded");
                        }
                        $tempsize = strlen($data2);
                        $rawsize += $tempsize;
                        if ($response["code"] == 100 || !isset($options["read_body_callback"])) {
                            $body .= HTTPGetDecodedBody($autodecode_ds, $data2);
                        } else {
                            if (!$options["read_body_callback"]($response, HTTPGetDecodedBody($autodecode_ds, $data2), $options["read_body_callback_opts"])) {
                                return array("success" => false, "error" => HTTPTranslate("Read body callback returned with a failure condition."), "errorcode" => "read_body_callback");
                            }
                        }
                        if (isset($options["recvratelimit"])) {
                            HTTPRateLimit($rawsize, $recvstart, $options["recvratelimit"]);
                        }
                        if (isset($options["debug_callback"])) {
                            $options["debug_callback"]("rawrecv", $data2, $options["debug_callback_opts"]);
                        } else {
                            if ($debug) {
                                $rawdata .= $data2;
                            }
                        }
                        if (feof($fp)) {
                            break;
                        }
                    }
                }
            }
        }
        if ($autodecode_ds !== false) {
            $autodecode_ds->Finalize();
            $data2 = $autodecode_ds->Read();
            if ($response["code"] == 100 || !isset($options["read_body_callback"])) {
                $body .= $data2;
            } else {
                if (!$options["read_body_callback"]($response, $data2, $options["read_body_callback_opts"])) {
                    return array("success" => false, "error" => HTTPTranslate("Read body callback returned with a failure condition."), "errorcode" => "read_body_callback");
                }
            }
        }
    } while ($response["code"] == 100);
    return array("success" => true, "rawrecv" => $rawdata, "rawrecvsize" => $rawsize, "rawrecvheadersize" => $rawrecvheadersize, "recvstart" => $recvstart, "response" => $response, "headers" => $headers, "body" => $body);
}
 function curl_exec($ch)
 {
     global $curl_init__map;
     $key = get_check_curl_init_key($ch);
     // Set allowed protocols.
     $allowedprotocols = array("http" => true, "https" => true);
     if (isset($curl_init__map[$key]["options"][CURLOPT_PROTOCOLS])) {
         $allowedprotocols["http"] = (bool) ($curl_init__map[$key]["options"][CURLOPT_PROTOCOLS] & CURLPROTO_HTTP);
         $allowedprotocols["https"] = (bool) ($curl_init__map[$key]["options"][CURLOPT_PROTOCOLS] & CURLPROTO_HTTPS);
     }
     $curl_init__map[$key]["browser"]->SetState(array("allowedprotocols" => $allowedprotocols));
     // Set allowed redirect protocols.
     $allowedprotocols = array("http" => true, "https" => true);
     if (isset($curl_init__map[$key]["options"][CURLOPT_REDIR_PROTOCOLS])) {
         $allowedprotocols["http"] = (bool) ($curl_init__map[$key]["options"][CURLOPT_REDIR_PROTOCOLS] & CURLPROTO_HTTP);
         $allowedprotocols["https"] = (bool) ($curl_init__map[$key]["options"][CURLOPT_REDIR_PROTOCOLS] & CURLPROTO_HTTPS);
     }
     $curl_init__map[$key]["browser"]->SetState(array("allowedredirprotocols" => $allowedprotocols));
     // Load cookies.  Violates the PHP/cURL definition a lot.  Whatever.
     if (isset($curl_init__map[$key]["options"][CURLOPT_COOKIEFILE]) && is_string($curl_init__map[$key]["options"][CURLOPT_COOKIEFILE]) && $curl_init__map[$key]["options"][CURLOPT_COOKIEFILE] != "") {
         $data = @unserialize(@file_get_contents($curl_init__map[$key]["options"][CURLOPT_COOKIEFILE]));
         if ($data !== false && is_array($data)) {
             // Load the WebBrowser() object with the cookies.
             $curl_init__map[$key]["browser"]->SetState(array("cookies" => $data));
         }
         $curl_init__map[$key]["options"][CURLOPT_COOKIEFILE] = "";
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_COOKIESESSION]) && $curl_init__map[$key]["options"][CURLOPT_COOKIESESSION]) {
         $curl_init__map[$key]["browser"]->DeleteSessionCookies();
     }
     // Set the autoreferer setting.
     $curl_init__map[$key]["browser"]->SetState(array("autoreferer" => isset($curl_init__map[$key]["options"][CURLOPT_AUTOREFERER]) && $curl_init__map[$key]["options"][CURLOPT_AUTOREFERER]));
     // Set the Referer.
     if (isset($curl_init__map[$key]["options"][CURLOPT_REFERER]) && is_string($curl_init__map[$key]["options"][CURLOPT_REFERER])) {
         $curl_init__map[$key]["browser"]->SetState(array("referer" => $curl_init__map[$key]["options"][CURLOPT_REFERER]));
     }
     // Set the followlocation and maxfollow settings.
     $curl_init__map[$key]["browser"]->SetState(array("followlocation" => isset($curl_init__map[$key]["options"][CURLOPT_FOLLOWLOCATION]) && $curl_init__map[$key]["options"][CURLOPT_FOLLOWLOCATION]));
     $curl_init__map[$key]["browser"]->SetState(array("maxfollow" => isset($curl_init__map[$key]["options"][CURLOPT_MAXREDIRS]) ? $curl_init__map[$key]["options"][CURLOPT_MAXREDIRS] : 20));
     // Set up the options array.
     $options = array();
     // Set connect and total timeout options.
     if (isset($curl_init__map[$key]["options"][CURLOPT_CONNECTTIMEOUT]) || isset($curl_init__map[$key]["options"][CURLOPT_CONNECTTIMEOUT_MS])) {
         $timeout = (isset($curl_init__map[$key]["options"][CURLOPT_CONNECTTIMEOUT]) ? $curl_init__map[$key]["options"][CURLOPT_CONNECTTIMEOUT] : 0) + (isset($curl_init__map[$key]["options"][CURLOPT_CONNECTTIMEOUT_MS]) ? $curl_init__map[$key]["options"][CURLOPT_CONNECTTIMEOUT_MS] : 0) / 1000;
         if ($timeout > 0) {
             $options["connecttimeout"] = $timeout;
             $options["proxyconnecttimeout"] = $timeout;
         }
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_TIMEOUT]) || isset($curl_init__map[$key]["options"][CURLOPT_TIMEOUT_MS])) {
         $timeout = (isset($curl_init__map[$key]["options"][CURLOPT_TIMEOUT]) ? $curl_init__map[$key]["options"][CURLOPT_TIMEOUT] : 0) + (isset($curl_init__map[$key]["options"][CURLOPT_TIMEOUT_MS]) ? $curl_init__map[$key]["options"][CURLOPT_TIMEOUT_MS] : 0) / 1000;
         if ($timeout > 0) {
             $options["connecttimeout"] = $timeout;
             $options["proxyconnecttimeout"] = $timeout;
         }
     }
     // Set proxy options.
     if (isset($curl_init__map[$key]["options"][CURLOPT_PROXY])) {
         if (isset($curl_init__map[$key]["options"][CURLOPT_PROXYTYPE]) && $curl_init__map[$key]["options"][CURLOPT_PROXYTYPE] != CURLPROXY_HTTP) {
             $curl_init__map[$key]["errorno"] = CURLE_UNSUPPORTED_PROTOCOL;
             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("CURLOPT_PROXYTYPE option is unsupported.");
             return false;
         }
         $proxyurl = $curl_init__map[$key]["options"][CURLOPT_PROXY];
         $proxyport = (int) (isset($curl_init__map[$key]["options"][CURLOPT_PROXYPORT]) ? $curl_init__map[$key]["options"][CURLOPT_PROXYPORT] : false);
         if ($proxyport < 1 || $proxyport > 65535) {
             $proxyport = false;
         }
         if (strpos($proxyurl, "://") === false) {
             $proxyurl = ($proxyport == 443 ? "https://" : "http://") . $proxyurl;
         }
         $proxyurl = ExtractURL($proxyurl);
         if ($proxyport !== false) {
             $proxyurl["port"] = $proxyport;
         }
         if (isset($curl_init__map[$key]["options"][CURLOPT_PROXYUSERPWD])) {
             $userpass = explode(":", $curl_init__map[$key]["options"][CURLOPT_PROXYUSERPWD]);
             if (count($userpass) == 2) {
                 $proxyurl["loginusername"] = urldecode($userpass[0]);
                 $proxyurl["loginpassword"] = urldecode($userpass[1]);
             }
         }
         $options["proxyurl"] = CondenseURL($proxyurl);
         if (isset($curl_init__map[$key]["options"][CURLOPT_HTTPPROXYTUNNEL])) {
             $options["proxyconnect"] = $curl_init__map[$key]["options"][CURLOPT_HTTPPROXYTUNNEL];
         }
     }
     // Set SSL options.
     $options["sslopts"] = array();
     $options["sslopts"]["verify_peer"] = isset($curl_init__map[$key]["options"][CURLOPT_SSL_VERIFYPEER]) ? $curl_init__map[$key]["options"][CURLOPT_SSL_VERIFYPEER] : true;
     if (isset($curl_init__map[$key]["options"][CURLOPT_CAINFO])) {
         $options["sslopts"]["cafile"] = $curl_init__map[$key]["options"][CURLOPT_CAINFO];
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_CAPATH])) {
         $options["sslopts"]["capath"] = $curl_init__map[$key]["options"][CURLOPT_CAPATH];
     }
     if (!isset($options["sslopts"]["cafile"]) && !isset($options["sslopts"]["capath"])) {
         $options["sslopts"]["auto_cainfo"] = true;
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_SSLCERT]) && isset($curl_init__map[$key]["options"][CURLOPT_SSLKEY])) {
         if ($curl_init__map[$key]["options"][CURLOPT_SSLCERT] !== $curl_init__map[$key]["options"][CURLOPT_SSLKEY]) {
             $curl_init__map[$key]["errorno"] = CURLE_SSL_CONNECT_ERROR;
             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("CURLOPT_SSLCERT and CURLOPT_SSLKEY must be identical.");
             return false;
         }
         $certpass = isset($curl_init__map[$key]["options"][CURLOPT_SSLCERTPASSWD]) ? $curl_init__map[$key]["options"][CURLOPT_SSLCERTPASSWD] : false;
         $keypass = isset($curl_init__map[$key]["options"][CURLOPT_SSLKEYPASSWD]) ? $curl_init__map[$key]["options"][CURLOPT_SSLKEYPASSWD] : false;
         if ($certpass !== $keypass) {
             $curl_init__map[$key]["errorno"] = CURLE_SSL_CONNECT_ERROR;
             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("CURLOPT_SSLCERTPASSWD and CURLOPT_SSLKEYPASSWD must be identical.");
             return false;
         }
         $certtype = strtoupper(isset($curl_init__map[$key]["options"][CURLOPT_SSLCERTTYPE]) ? $curl_init__map[$key]["options"][CURLOPT_SSLCERTTYPE] : "PEM");
         $keytype = strtoupper(isset($curl_init__map[$key]["options"][CURLOPT_SSLKEYTYPE]) ? $curl_init__map[$key]["options"][CURLOPT_SSLKEYTYPE] : "PEM");
         if ($certpass !== $keypass || $cert !== "PEM") {
             $curl_init__map[$key]["errorno"] = CURLE_SSL_CONNECT_ERROR;
             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("CURLOPT_SSLCERTTYPE and CURLOPT_SSLKEYTYPE must be PEM format.");
             return false;
         }
         $options["sslopts"]["local_cert"] = $curl_init__map[$key]["options"][CURLOPT_SSLCERT];
         if ($certpass !== false) {
             $options["sslopts"]["passphrase"] = $certpass;
         }
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_SSL_CIPHER_LIST])) {
         $options["sslopts"]["ciphers"] = $curl_init__map[$key]["options"][CURLOPT_SSL_CIPHER_LIST];
     }
     $options["sslopts"]["auto_cn_match"] = true;
     $options["sslopts"]["auto_sni"] = true;
     $options["sslopts"]["capture_peer_cert"] = isset($curl_init__map[$key]["options"][CURLOPT_CERTINFO]) ? $curl_init__map[$key]["options"][CURLOPT_CERTINFO] : false;
     // Set the method.
     if (isset($curl_init__map[$key]["options"][CURLOPT_UPLOAD]) && (bool) $curl_init__map[$key]["options"][CURLOPT_UPLOAD]) {
         $options["method"] = "PUT";
     } else {
         $options["method"] = $curl_init__map[$key]["method"];
     }
     // Set the HTTP version.
     if (isset($curl_init__map[$key]["options"][CURLOPT_HTTP_VERSION])) {
         if ($curl_init__map[$key]["options"][CURLOPT_HTTP_VERSION] == CURL_HTTP_VERSION_1_0) {
             $options["httpver"] = "1.0";
         } else {
             if ($curl_init__map[$key]["options"][CURLOPT_HTTP_VERSION] == CURL_HTTP_VERSION_1_1) {
                 $options["httpver"] = "1.1";
             }
         }
     }
     // Set rate limits.
     if (isset($curl_init__map[$key]["options"][CURLOPT_MAX_RECV_SPEED_LARGE])) {
         $options["recvratelimit"] = $curl_init__map[$key]["options"][CURLOPT_MAX_RECV_SPEED_LARGE];
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_MAX_SEND_SPEED_LARGE])) {
         $options["sendratelimit"] = $curl_init__map[$key]["options"][CURLOPT_MAX_SEND_SPEED_LARGE];
     }
     // Set headers.
     $options["headers"] = array();
     $options["headers"]["Accept"] = "*/*";
     if (isset($curl_init__map[$key]["options"][CURLOPT_HTTPHEADER]) && is_array($curl_init__map[$key]["options"][CURLOPT_HTTPHEADER])) {
         foreach ($curl_init__map[$key]["options"][CURLOPT_HTTPHEADER] as $header) {
             $pos = strpos($header, ":");
             if ($pos !== false) {
                 $val = ltrim(substr($header, $pos + 1));
                 if ($val == "") {
                     unset($options["headers"][HTTPHeaderNameCleanup(substr($header, 0, $pos))]);
                 } else {
                     $options["headers"][HTTPHeaderNameCleanup(substr($header, 0, $pos))] = $val;
                 }
             }
         }
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_USERAGENT])) {
         $options["headers"]["User-Agent"] = $curl_init__map[$key]["options"][CURLOPT_USERAGENT];
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_COOKIE])) {
         $options["headers"]["Cookie"] = $curl_init__map[$key]["options"][CURLOPT_COOKIE];
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_RANGE])) {
         $options["headers"]["Range"] = "bytes=" . $curl_init__map[$key]["options"][CURLOPT_RANGE];
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_RESUME_FROM])) {
         $options["headers"]["Range"] = "bytes=" . $curl_init__map[$key]["options"][CURLOPT_RESUME_FROM] . "-";
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_TIMECONDITION]) && isset($curl_init__map[$key]["options"][CURLOPT_TIMEVALUE])) {
         if ($curl_init__map[$key]["options"][CURLOPT_TIMECONDITION] == CURL_TIMECOND_IFMODSINCE) {
             $options["headers"]["If-Modified-Since"] = gmdate("D, d M Y H:i:s", $curl_init__map[$key]["options"][CURLOPT_TIMEVALUE]) . " GMT";
         } else {
             if ($curl_init__map[$key]["options"][CURLOPT_TIMECONDITION] == CURL_TIMECOND_IFUNMODSINCE) {
                 $options["headers"]["If-Unmodified-Since"] = gmdate("D, d M Y H:i:s", $curl_init__map[$key]["options"][CURLOPT_TIMEVALUE]) . " GMT";
             }
         }
     }
     // Set POST variables and files.
     if (isset($curl_init__map[$key]["options"][CURLOPT_POSTFIELDS])) {
         $postvars = $curl_init__map[$key]["options"][CURLOPT_POSTFIELDS];
         if (is_string($postvars)) {
             $postvars2 = array();
             $postvars = explode("&", $postvars);
             foreach ($postvars as $postvar) {
                 $pos = strpos($postvar, "=");
                 if ($pos === false) {
                     $name = urldecode($postvar);
                     $val = "";
                 } else {
                     $name = urldecode(substr($postvar, 0, $pos));
                     $val = urldecode(substr($postvar, $pos + 1));
                 }
                 if (!isset($postvars2[$name])) {
                     $postvars2[$name] = array();
                 }
                 $postvars2[$name][] = $val;
             }
             $postvars = $postvars2;
             unset($postvars2);
         }
         foreach ($postvars as $name => $vals) {
             if (is_string($vals) || is_numeric($vals)) {
                 $vals = array($vals);
             }
             foreach ($vals as $num => $val) {
                 // Move files to their own array.
                 if (substr($val, 0, 1) == "@") {
                     $pos = strrpos($val, ";type=");
                     if ($pos === false) {
                         $mimetype = "";
                     } else {
                         $mimetype = substr($val, $pos + 6);
                         $val = substr($val, 0, $pos);
                     }
                     $val = substr($val, 1);
                     if (file_exists($val)) {
                         if (!isset($options["files"])) {
                             $options["files"] = array();
                         }
                         $options["files"][] = array("name" => $name, "filename" => HTTPFilenameSafe(HTTPExtractFilename($val)), "type" => $mimetype, "datafile" => $val);
                         unset($vals[$num]);
                     }
                 }
             }
             if (!count($vals)) {
                 unset($postvars[$name]);
             } else {
                 $postvars[$name] = $vals;
             }
         }
         $options["postvars"] = $postvars;
         $options["method"] = "POST";
     }
     // Process the URL.
     if (!isset($curl_init__map[$key]["options"][CURLOPT_URL]) || !is_string($curl_init__map[$key]["options"][CURLOPT_URL]) || $curl_init__map[$key]["options"][CURLOPT_URL] == "") {
         $curl_init__map[$key]["errorno"] = CURLE_URL_MALFORMAT;
         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("No CURLOPT_URL option specified.");
         return false;
     }
     $url = ExtractURL($curl_init__map[$key]["options"][CURLOPT_URL]);
     if ($url["scheme"] == "") {
         $curl_init__map[$key]["errorno"] = CURLE_URL_MALFORMAT;
         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("CURLOPT_URL does not have a scheme.");
         return false;
     }
     if ($url["host"] == "") {
         $curl_init__map[$key]["errorno"] = CURLE_URL_MALFORMAT;
         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("CURLOPT_URL does not specify a valid host.");
         return false;
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_PORT]) && (int) $curl_init__map[$key]["options"][CURLOPT_PORT] > 0 && (int) $curl_init__map[$key]["options"][CURLOPT_PORT] < 65536) {
         $url["port"] = (int) $curl_init__map[$key]["options"][CURLOPT_PORT];
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_USERPWD])) {
         $userpass = explode(":", $curl_init__map[$key]["options"][CURLOPT_USERPWD]);
         if (count($userpass) == 2) {
             $url["loginusername"] = urldecode($userpass[0]);
             $url["loginpassword"] = urldecode($userpass[1]);
         }
     } else {
         if (isset($curl_init__map[$key]["options"][CURLOPT_NETRC]) && $curl_init__map[$key]["options"][CURLOPT_NETRC]) {
             $data = @file_get_contents("~/.netrc");
             if ($data !== false) {
                 $lines = explode("\n", $data);
                 unset($data);
                 $host = false;
                 $user = false;
                 $password = false;
                 foreach ($lines as $line) {
                     $line = trim($line);
                     if (substr($line, 0, 8) == "machine ") {
                         $host = trim(substr($line, 8));
                     }
                     if (substr($line, 0, 6) == "login ") {
                         $user = trim(substr($line, 6));
                     }
                     if (substr($line, 0, 9) == "password ") {
                         $password = trim(substr($line, 9));
                     }
                     if ($host !== false && $user !== false && $password !== false) {
                         if ($host === $url["host"] || isset($options["headers"]["Host"]) && $host === $options["headers"]["Host"]) {
                             $url["loginusername"] = $user;
                             $url["loginpassword"] = $password;
                         }
                         $host = false;
                         $user = false;
                         $password = false;
                     }
                 }
                 unset($lines);
             }
         }
     }
     // Condense URL.
     $url = CondenseURL($url);
     // Set up internal callbacks.
     $options["read_headers_callback"] = "internal_curl_read_headers_callback";
     $options["read_headers_callback_opts"] = $key;
     if (!isset($curl_init__map[$key]["options"][CURLOPT_NOBODY]) || !$curl_init__map[$key]["options"][CURLOPT_NOBODY]) {
         $options["read_body_callback"] = "internal_curl_read_body_callback";
         $options["read_body_callback_opts"] = $key;
     }
     if ($options["method"] != "GET" && $options["method"] != "POST") {
         $options["write_body_callback"] = "internal_curl_write_body_callback";
         $options["write_body_callback_opts"] = $key;
     }
     $options["debug_callback"] = "internal_curl_debug_callback";
     $options["debug_callback_opts"] = $key;
     // Remove weird callback results.
     unset($curl_init__map[$key]["rawproxyheaders"]);
     unset($curl_init__map[$key]["rawheaders"]);
     unset($curl_init__map[$key]["returnresponse"]);
     unset($curl_init__map[$key]["returnheader"]);
     unset($curl_init__map[$key]["returnbody"]);
     unset($curl_init__map[$key]["filetime"]);
     $curl_init__map[$key]["outputbody"] = false;
     // Process the request.
     $result = $curl_init__map[$key]["browser"]->Process($url, "", $options);
     $curl_init__map[$key]["lastresult"] = $result;
     // Deal with cookies.
     if (!isset($curl_init__map[$key]["options"][CURLOPT_COOKIEFILE]) || !is_string($curl_init__map[$key]["options"][CURLOPT_COOKIEFILE])) {
         // Delete all cookies for another run later.
         $curl_init__map[$key]["browser"]->SetState(array("cookies" => array()));
     } else {
         if (isset($curl_init__map[$key]["options"][CURLOPT_COOKIEJAR])) {
             // Write out cookies here.  Another violation of how cURL does things.  Another - whatever.
             $state = $curl_init__map[$key]["browser"]->GetState();
             file_put_contents($curl_init__map[$key]["options"][CURLOPT_COOKIEJAR], serialize($state["cookies"]));
         }
     }
     // Process the response.
     if (!$result["success"]) {
         if ($result["errorcode"] == "allowed_protocols") {
             $curl_init__map[$key]["errorno"] = CURLE_UNSUPPORTED_PROTOCOL;
             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("The cURL emulation layer does not support the protocol or was redirected to an unsupported protocol by the host.  %s", $result["error"]);
         } else {
             if ($result["errorcode"] == "allowed_redir_protocols") {
                 $curl_init__map[$key]["errorno"] = CURLE_UNSUPPORTED_PROTOCOL;
                 $curl_init__map[$key]["errorinfo"] = HTTPTranslate("The cURL emulation layer was redirected to an unsupported protocol by the host.  %s", $result["error"]);
             } else {
                 if ($result["errorcode"] == "retrievewebpage") {
                     if ($result["info"]["errorcode"] == "timeout_exceeded") {
                         $curl_init__map[$key]["errorno"] = CURLE_OPERATION_TIMEDOUT;
                         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("The operation timed out.  %s", $result["error"]);
                     } else {
                         if ($result["info"]["errorcode"] == "get_response_line") {
                             $curl_init__map[$key]["errorno"] = CURLE_READ_ERROR;
                             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("Unable to get the response line.  %s", $result["error"]);
                         } else {
                             if ($result["info"]["errorcode"] == "read_header_callback") {
                                 $curl_init__map[$key]["errorno"] = CURLE_READ_ERROR;
                                 $curl_init__map[$key]["errorinfo"] = HTTPTranslate("A read error occurred in the read header callback.  %s", $result["error"]);
                             } else {
                                 if ($result["info"]["errorcode"] == "read_body_callback") {
                                     $curl_init__map[$key]["errorno"] = CURLE_READ_ERROR;
                                     $curl_init__map[$key]["errorinfo"] = HTTPTranslate("A read error occurred in the read body callback.  %s", $result["error"]);
                                 } else {
                                     if ($result["info"]["errorcode"] == "function_check") {
                                         $curl_init__map[$key]["errorno"] = CURLE_FUNCTION_NOT_FOUND;
                                         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("A required function was not found.  %s", $result["error"]);
                                     } else {
                                         if ($result["info"]["errorcode"] == "protocol_check") {
                                             $curl_init__map[$key]["errorno"] = CURLE_UNSUPPORTED_PROTOCOL;
                                             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("The cURL emulation layer does not support the protocol or was redirected to an unsupported protocol by the host.  %s", $result["error"]);
                                         } else {
                                             if ($result["info"]["errorcode"] == "transport_not_installed") {
                                                 $curl_init__map[$key]["errorno"] = CURLE_NOT_BUILT_IN;
                                                 $curl_init__map[$key]["errorinfo"] = HTTPTranslate("The cURL emulation layer attempted to use a required transport to connect to a host but failed.  %s", $result["error"]);
                                             } else {
                                                 if ($result["info"]["errorcode"] == "proxy_transport_not_installed") {
                                                     $curl_init__map[$key]["errorno"] = CURLE_NOT_BUILT_IN;
                                                     $curl_init__map[$key]["errorinfo"] = HTTPTranslate("The cURL emulation layer attempted to use a required transport to connect to a proxy but failed.  %s", $result["error"]);
                                                 } else {
                                                     if ($result["info"]["errorcode"] == "proxy_connect") {
                                                         $curl_init__map[$key]["errorno"] = CURLE_COULDNT_CONNECT;
                                                         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("Unable to connect to the proxy.  %s", $result["error"]);
                                                     } else {
                                                         if ($result["info"]["errorcode"] == "proxy_connect_tunnel") {
                                                             $curl_init__map[$key]["errorno"] = CURLE_COULDNT_CONNECT;
                                                             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("Unable to open a tunnel through the connected proxy.  %s", $result["error"]);
                                                         } else {
                                                             if ($result["info"]["errorcode"] == "connect_failed") {
                                                                 $curl_init__map[$key]["errorno"] = CURLE_COULDNT_CONNECT;
                                                                 $curl_init__map[$key]["errorinfo"] = HTTPTranslate("Unable to connect to the host.  %s", $result["error"]);
                                                             } else {
                                                                 if ($result["info"]["errorcode"] == "write_body_callback") {
                                                                     $curl_init__map[$key]["errorno"] = CURLE_WRITE_ERROR;
                                                                     $curl_init__map[$key]["errorinfo"] = HTTPTranslate("A write error occurred in the write body callback.  %s", $result["error"]);
                                                                 } else {
                                                                     if ($result["info"]["errorcode"] == "file_open") {
                                                                         $curl_init__map[$key]["errorno"] = CURLE_FILE_COULDNT_READ_FILE;
                                                                         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("Unable to open file for upload.  %s", $result["error"]);
                                                                     } else {
                                                                         if ($result["info"]["errorcode"] == "file_read") {
                                                                             $curl_init__map[$key]["errorno"] = CURLE_READ_ERROR;
                                                                             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("A read error occurred while uploading a file.  %s", $result["error"]);
                                                                         } else {
                                                                             $curl_init__map[$key]["errorno"] = CURLE_HTTP_RETURNED_ERROR;
                                                                             $curl_init__map[$key]["errorinfo"] = HTTPTranslate("An error occurred.  %s", $result["error"]);
                                                                         }
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
         return false;
     }
     if (isset($curl_init__map[$key]["returnresponse"]) && $curl_init__map[$key]["returnresponse"]["code"] >= 400 && isset($curl_init__map[$key]["options"][CURLOPT_FAILONERROR]) && $curl_init__map[$key]["options"][CURLOPT_FAILONERROR]) {
         $curl_init__map[$key]["errorno"] = CURLE_HTTP_RETURNED_ERROR;
         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("A HTTP error occurred.  %s", $curl_init__map[$key]["returnresponse"]["line"]);
         return false;
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_FOLLOWLOCATION]) && $curl_init__map[$key]["options"][CURLOPT_FOLLOWLOCATION] && isset($result["headers"]["Location"])) {
         $curl_init__map[$key]["errorno"] = CURLE_TOO_MANY_REDIRECTS;
         $curl_init__map[$key]["errorinfo"] = HTTPTranslate("Too many redirects took place.");
         return false;
     }
     if (isset($curl_init__map[$key]["options"][CURLOPT_RETURNTRANSFER]) && $curl_init__map[$key]["options"][CURLOPT_RETURNTRANSFER]) {
         return (isset($curl_init__map[$key]["returnheader"]) ? $curl_init__map[$key]["returnheader"] . "\r\n" : "") . (isset($curl_init__map[$key]["returnbody"]) ? $curl_init__map[$key]["returnbody"] : "");
     }
     return true;
 }