libcurlexternal.inc.php
上传用户:jamesxinda
上传日期:2022-07-31
资源大小:28k
文件大小:20k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

PHP

  1. <?php
  2. /* CURL Extension Emulation Library (Console Binary)
  3.  * Copyright 2004-2007, Steve Blinch
  4.  * http://code.blitzaffe.com
  5.  * ============================================================================
  6.  *
  7.  * DESCRIPTION
  8.  *
  9.  * Provides a pure-PHP implementation of the PHP CURL extension, for use on
  10.  * systems which do not already have the CURL extension installed.  It emulates
  11.  * all of the curl_* functions normally provided by the CURL extension itself
  12.  * by wrapping the CURL console binary.
  13.  *
  14.  * This library will automatically detect whether or not the "real" CURL
  15.  * extension is installed, and if so, it will not interfere.  Thus, it can be
  16.  * used to ensure that, one way or another, the CURL functions are available
  17.  * for use.
  18.  *
  19.  * This library is actually a wrapper for the CURL console application (usually
  20.  * found in /usr/bin/curl), so you must have the CURL binary installed in order
  21.  * to use this script.
  22.  *
  23.  *
  24.  * USAGE
  25.  *
  26.  * Please see the PHP documentation under the "CURL, Client URL Library 
  27.  * Functions" section for information about using this library.  Almost all of
  28.  * the documentation and examples in the PHP manual should work with this
  29.  * library.
  30.  *
  31.  *
  32.  * LICENSE
  33.  *
  34.  * This script is free software; you can redistribute it and/or modify it under the
  35.  * terms of the GNU General Public License as published by the Free Software
  36.  * Foundation; either version 2 of the License, or (at your option) any later
  37.  * version.
  38.  *
  39.  * This script is distributed in the hope that it will be useful, but WITHOUT ANY
  40.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  41.  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  42.  * details.
  43.  *
  44.  * You should have received a copy of the GNU General Public License along
  45.  * with this script; if not, write to the Free Software Foundation, Inc.,
  46.  * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  47.  */
  48.  
  49. // if the real CURL PHP extension is installed, exit without doing anything
  50. if (!extension_loaded("curl")) {
  51. // if the CURL path was not defined by the calling script, define it
  52. if (!defined("CURL_PATH")) define("CURL_PATH","/usr/bin/curl");
  53. // if the CURL binary was not found, do one of the following:
  54. //   - if CURLEXT_MISSING_ABORT was defined, then exit without implementing the CURL functions
  55. //   - if CURLEXT_MISSING_IGNORE was defined, then implement the CURL functions anyway (even
  56. //     though they won't work without the CURL binary installed)
  57. //   - otherwise, raise a fatal error and halt the script
  58. if (!is_executable(CURL_PATH)) {
  59.   if (defined("CURLEXT_MISSING_ABORT") && CURLEXT_MISSING_ABORT) {
  60.   return;
  61.   } elseif (defined("CURLEXT_MISSING_IGNORE") && CURLEXT_MISSING_IGNORE) {
  62.   // proceed and implement the CURL functions anyway, even though they won't work
  63.   } else {
  64. trigger_error("CURL extension is not loaded, and the commandline version of CURL was not found at ".CURL_PATH,E_USER_ERROR);
  65. }
  66. }
  67. define("CURLEXT_VERSION","1.0.0");
  68. define('CURLOPT_NOTHING',0);
  69. define('CURLOPT_FILE',10001);
  70. define('CURLOPT_URL',10002);
  71. define('CURLOPT_PORT',3);
  72. define('CURLOPT_PROXY',10004);
  73. define('CURLOPT_USERPWD',10005);
  74. define('CURLOPT_PROXYUSERPWD',10006);
  75. define('CURLOPT_RANGE',10007);
  76. define('CURLOPT_INFILE',10009);
  77. define('CURLOPT_ERRORBUFFER',10010);
  78. define('CURLOPT_WRITEFUNCTION',20011);
  79. define('CURLOPT_READFUNCTION',20012);
  80. define('CURLOPT_TIMEOUT',13);
  81. define('CURLOPT_INFILESIZE',14);
  82. define('CURLOPT_POSTFIELDS',10015);
  83. define('CURLOPT_REFERER',10016);
  84. define('CURLOPT_FTPPORT',10017);
  85. define('CURLOPT_USERAGENT',10018);
  86. define('CURLOPT_LOW_SPEED_LIMIT',19);
  87. define('CURLOPT_LOW_SPEED_TIME',20);
  88. define('CURLOPT_RESUME_FROM',21);
  89. define('CURLOPT_COOKIE',10022);
  90. define('CURLOPT_HTTPHEADER',10023);
  91. define('CURLOPT_HTTPPOST',10024);
  92. define('CURLOPT_SSLCERT',10025);
  93. define('CURLOPT_SSLCERTPASSWD',10026);
  94. define('CURLOPT_SSLKEYPASSWD',10026);
  95. define('CURLOPT_CRLF',27);
  96. define('CURLOPT_QUOTE',10028);
  97. define('CURLOPT_WRITEHEADER',10029);
  98. define('CURLOPT_COOKIEFILE',10031);
  99. define('CURLOPT_SSLVERSION',32);
  100. define('CURLOPT_TIMECONDITION',33);
  101. define('CURLOPT_TIMEVALUE',34);
  102. define('CURLOPT_HTTPREQUEST',10035);
  103. define('CURLOPT_CUSTOMREQUEST',10036);
  104. define('CURLOPT_STDERR',10037);
  105. define('CURLOPT_POSTQUOTE',10039);
  106. define('CURLOPT_WRITEINFO',10040);
  107. define('CURLOPT_VERBOSE',41);
  108. define('CURLOPT_HEADER',42);
  109. define('CURLOPT_NOPROGRESS',43);
  110. define('CURLOPT_NOBODY',44);
  111. define('CURLOPT_FAILONERROR',45);
  112. define('CURLOPT_UPLOAD',46);
  113. define('CURLOPT_POST',47);
  114. define('CURLOPT_FTPLISTONLY',48);
  115. define('CURLOPT_FTPAPPEND',50);
  116. define('CURLOPT_NETRC',51);
  117. define('CURLOPT_FOLLOWLOCATION',52);
  118. define('CURLOPT_FTPASCII',53);
  119. define('CURLOPT_TRANSFERTEXT',53);
  120. define('CURLOPT_PUT',54);
  121. define('CURLOPT_MUTE',55);
  122. define('CURLOPT_PROGRESSFUNCTION',20056);
  123. define('CURLOPT_PROGRESSDATA',10057);
  124. define('CURLOPT_AUTOREFERER',58);
  125. define('CURLOPT_PROXYPORT',59);
  126. define('CURLOPT_POSTFIELDSIZE',60);
  127. define('CURLOPT_HTTPPROXYTUNNEL',61);
  128. define('CURLOPT_INTERFACE',10062);
  129. define('CURLOPT_KRB4LEVEL',10063);
  130. define('CURLOPT_SSL_VERIFYPEER',64);
  131. define('CURLOPT_CAINFO',10065);
  132. define('CURLOPT_PASSWDFUNCTION',20066);
  133. define('CURLOPT_PASSWDDATA',10067);
  134. define('CURLOPT_MAXREDIRS',68);
  135. define('CURLOPT_FILETIME',10069);
  136. define('CURLOPT_TELNETOPTIONS',10070);
  137. define('CURLOPT_MAXCONNECTS',71);
  138. define('CURLOPT_CLOSEPOLICY',72);
  139. define('CURLOPT_CLOSEFUNCTION',20073);
  140. define('CURLOPT_FRESH_CONNECT',74);
  141. define('CURLOPT_FORBID_REUSE',75);
  142. define('CURLOPT_RANDOM_FILE',10076);
  143. define('CURLOPT_EGDSOCKET',10077);
  144. define('CURLOPT_CONNECTTIMEOUT',78);
  145. define('CURLOPT_HEADERFUNCTION',20079);
  146. define('CURLOPT_HTTPGET',80);
  147. define('CURLOPT_SSL_VERIFYHOST',81);
  148. define('CURLOPT_COOKIEJAR',10082);
  149. define('CURLOPT_SSL_CIPHER_LIST',10083);
  150. define('CURLOPT_HTTP_VERSION',84);
  151. define('CURLOPT_FTP_USE_EPSV',85);
  152. define('CURLOPT_SSLCERTTYPE',10086);
  153. define('CURLOPT_SSLKEY',10087);
  154. define('CURLOPT_SSLKEYTYPE',10088);
  155. define('CURLOPT_SSLENGINE',10089);
  156. define('CURLOPT_SSLENGINE_DEFAULT',90);
  157. define('CURLOPT_DNS_USE_GLOBAL_CACHE',91);
  158. define('CURLOPT_DNS_CACHE_TIMEOUT',92);
  159. define('CURLOPT_PREQUOTE',10093); 
  160. define('CURLINFO_EFFECTIVE_URL',1);
  161. define('CURLINFO_HTTP_CODE',2);
  162. define('CURLINFO_FILETIME',14);
  163. define('CURLINFO_TOTAL_TIME',3);
  164. define('CURLINFO_NAMELOOKUP_TIME',4);
  165. define('CURLINFO_CONNECT_TIME',5);
  166. define('CURLINFO_PRETRANSFER_TIME',6);
  167. define('CURLINFO_STARTTRANSFER_TIME',17);
  168. define('CURLINFO_REDIRECT_TIME',19);
  169. define('CURLINFO_REDIRECT_COUNT',20);
  170. define('CURLINFO_SIZE_UPLOAD',7);
  171. define('CURLINFO_SIZE_DOWNLOAD',8);
  172. define('CURLINFO_SPEED_DOWNLOAD',9);
  173. define('CURLINFO_SPEED_UPLOAD',10);
  174. define('CURLINFO_HEADER_SIZE',11);
  175. define('CURLINFO_REQUEST_SIZE',12);
  176. define('CURLINFO_SSL_VERIFYRESULT',13);
  177. define('CURLINFO_CONTENT_LENGTH_DOWNLOAD',15);
  178. define('CURLINFO_CONTENT_LENGTH_UPLOAD',16);
  179. define('CURLINFO_CONTENT_TYPE',18);
  180. define("TIMECOND_ISUNMODSINCE",1);
  181. define("TIMECOND_IFMODSINCE",2);
  182. function _curlopt_name($curlopt) {
  183. foreach (get_defined_constants() as $k=>$v) {
  184. if ( (substr($k,0,8)=="CURLOPT_") && ($v==$curlopt)) return $k;
  185. }
  186. return false;
  187. }
  188. // Initialize a CURL emulation session
  189. function curl_init($url=false) {
  190. $i = $GLOBALS["_CURLEXT_OPT"]["index"]++;
  191. $GLOBALS["_CURLEXT_OPT"][$i] = array("url"=>$url);
  192. return $i;
  193. }
  194. // Set an option for a CURL emulation transfer 
  195. function curl_setopt($ch,$option,$value) {
  196. $opt = &$GLOBALS["_CURLEXT_OPT"][$ch];
  197. if (!$opt["args"]) $opt["args"] = array();
  198. $args = &$opt["args"];
  199. if (!$opt["settings"]) $opt["settings"] = array();
  200. $settings = &$opt["settings"];
  201. switch($option) {
  202. case CURLOPT_URL:
  203. $opt["url"] = $value;
  204. break;
  205. case CURLOPT_VERBOSE:
  206. $opt["verbose"] = $value>0;
  207. break;
  208. case CURLOPT_USERPWD:
  209. if ($value==="") $value = false;
  210. $settings["user"] = $value;
  211. break;
  212. case CURLOPT_PROXYUSERPWD:
  213. if ($value==="") $value = false;
  214. $settings["proxy-user"] = $value;
  215. break;
  216. case CURLOPT_COOKIE:
  217. if ($value==="") $value = false;
  218. if ( is_bool($value) || (strpos($value,"=")!==false) ) $settings["cookie"] = $value;
  219. break;
  220. case CURLOPT_COOKIEFILE:
  221. if ($value==="") $value = false;
  222. $settings["cookie"] = $value;
  223. break;
  224. case CURLOPT_COOKIEJAR:
  225. if ($value==="") $value = false;
  226. $settings["cookie-jar"] = $value;
  227. break;
  228. case CURLOPT_CUSTOMREQUEST:
  229. if ($value==="") $value = false;
  230. $settings["request"] = $value;
  231. break;
  232. case CURLOPT_PROXY:
  233. if ($value==="") $value = false;
  234. $settings["proxy"] = $value;
  235. break;
  236. case CURLOPT_INTERFACE:
  237. if ($value==="") $value = false;
  238. $settings["interface"] = $value;
  239. break;
  240. case CURLOPT_KRB4LEVEL:
  241. if ($value==="") $value = false;
  242. $settings["krb4"] = $value;
  243. break;
  244. case CURLOPT_SSLCERT:
  245. $pass = "";
  246. if (is_string($settings["cert"])) {
  247. list(,$pass) = explode(":",$settings["cert"]);
  248. if (strlen($pass)) $pass = ":$pass";
  249. }
  250. $settings["cert"] = $value.$pass;
  251. break;
  252. case CURLOPT_SSLCERTPASSWD:
  253. $filename = "";
  254. if (is_string($settings["cert"])) {
  255. list($filename,) = explode(":",$settings["cert"]);
  256. }
  257. $settings["cert"] = $filename.":".$value;
  258. break;
  259. case CURLOPT_RANGE:
  260. if ($value==="") $value = false;
  261. $settings["range"] = $value;
  262. break;
  263. case CURLOPT_REFERER:
  264. if ($value==="") $value = false;
  265. $settings["referer"] = $value;
  266. break;
  267. case CURLOPT_NOBODY:
  268. $settings["head"] = $value>0;
  269. break;
  270. case CURLOPT_FAILONERROR:
  271. $opt["fail_on_error"] = $value>0;
  272. break;
  273. case CURLOPT_USERAGENT:
  274. $settings["user-agent"] = $value;
  275. break;
  276. case CURLOPT_HEADER:
  277. $settings["include"] = $value>0;
  278. break;
  279. case CURLOPT_RETURNTRANSFER:
  280. $opt["return_transfer"] = $value>0;
  281. break;
  282. case CURLOPT_TIMEOUT:
  283. $settings["max-time"] = (int) $value;
  284. break;
  285. case CURLOPT_HTTPHEADER:
  286. reset($value);
  287. foreach ($value as $k=>$header) $args[] = "header=".$header;
  288. break;
  289. case CURLOPT_POST:
  290. $settings["data"]["enabled"] = $value>0;
  291. break;
  292. case CURLOPT_POSTFIELDS:
  293. if ($value==="") $value = false;
  294. $settings["data"]["value"] = $value;
  295. break;
  296. case CURLOPT_SSL_VERIFYPEER:
  297. $settings["insecure"] = ($value==0);
  298. break;
  299. case CURLOPT_SSL_VERIFYHOST:
  300. // not supported by the commandline client
  301. break;
  302. case CURLOPT_FOLLOWLOCATION:
  303. $settings["location"] = $value>0;
  304. break;
  305. case CURLOPT_PUT:
  306. $settings["upload-file"]["enabled"] = $value>0;
  307. break;
  308. case CURLOPT_INFILE:
  309. if ($value==="") $value = false;
  310. if (is_resource($value)) {
  311. // Ugh, this is a terrible hack.  The CURL extension accepts a file handle, but
  312. // the CURL binary obviously wants a filename.  Since you can't derive a filename
  313. // from a file handle, we have to make a copy of the file from the file handle,
  314. // then pass the temporary filename to the CURL binary.
  315. $tmpfilename = tempnam("/tmp","cif");
  316. $fp = @fopen($tmpfilename,"w");
  317. if (!$fp) {
  318. trigger_error("CURL emulation library could not create a temporary file for CURLOPT_INFILE; upload aborted",E_USER_WARNING);
  319. } else {
  320. while (!feof($value)) {
  321. $contents = fread($value,8192);
  322. fwrite($fp,$contents);
  323. }
  324. fclose($fp);
  325. // if a temporary file was previously created, unlink it
  326. if ($settings["upload-file"]["value"] && file_exists($settings["upload-file"]["value"])) unlink($settings["upload-file"]["value"]);
  327. // set the new upload-file filename
  328. $settings["upload-file"]["value"] = $tmpfilename;
  329. }
  330. } else {
  331. trigger_error("CURLOPT_INFILE must specify a valid file resource",E_USER_WARNING);
  332. }
  333. break;
  334. case CURLOPT_MUTE:
  335. // we're already mute, no?
  336. break;
  337. case CURLOPT_LOW_SPEED_LIMIT:
  338. $settings["speed-limit"] = (int) $value;
  339. break;
  340. case CURLOPT_LOW_SPEED_TIME:
  341. $settings["speed-time"] = (int) $value;
  342. break;
  343. case CURLOPT_RESUME_FROM:
  344. $settings["continue-at"] = (int) $value;
  345. break;
  346. case CURLOPT_CAINFO:
  347. if ($value==="") $value = false;
  348. $settings["cacert"] = $value;
  349. break;
  350. case CURLOPT_SSLVERSION:
  351. $value = (int) $value;
  352. switch($value) {
  353. case 2:
  354. case 3:
  355. unset($settings["sslv2"]);
  356. unset($settings["sslv3"]);
  357. $settings["sslv".$value] = true;
  358. break;
  359. }
  360. break;
  361. case CURLOPT_TIMECONDITION:
  362. // untested - I'm lazy :)
  363. if (!isset($settings["time-cond"]["enabled"])) $settings["time-cond"]["enabled"] = false;
  364. if (!$settings["time-cond"]["value"]) $settings["time-cond"]["value"] = 1;
  365. $settings["time-cond"]["value"] = abs($settings["time-cond"]["value"]);
  366. if ($value==TIMECOND_ISUNMODSINCE) {
  367. $settings["time-cond"]["value"] *= -1;
  368. }
  369. break;
  370. case CURLOPT_TIMEVALUE:
  371. // untested - I'm lazy :)
  372. if ($settings["time-cond"]["value"]) {
  373. $sign = $settings["time-cond"]["value"] / abs($settings["time-cond"]["value"]);
  374. } else {
  375. $sign = 1;
  376. }
  377. $settings["time-cond"]["value"] = (int) $value * $sign;
  378. break;
  379. case CURLOPT_FILE:
  380. if (is_resource($value)) {
  381. $opt["output_handle"] = $value;
  382. } else {
  383. trigger_error("CURLOPT_FILE must specify a valid file resource",E_USER_WARNING);
  384. }
  385. break;
  386. case CURLOPT_WRITEHEADER:
  387. if (is_resource($value)) {
  388. $opt["header_handle"] = $value;
  389. } else {
  390. trigger_error("CURLOPT_WRITEHEADER must specify a valid file resource",E_USER_WARNING);
  391. }
  392. break;
  393. case CURLOPT_STDERR:
  394. // not implemented for now - not really relevant
  395. break;
  396. // FTP stuff not implemented
  397. case CURLOPT_QUOTE:
  398. case CURLOPT_POSTQUOTE:
  399. case CURLOPT_UPLOAD:
  400. case CURLOPT_FTPLISTONLY:
  401. case CURLOPT_FTPAPPEND:
  402. case CURLOPT_FTPPORT:
  403. // Other stuff not implemented
  404. case CURLOPT_NETRC:
  405. default:
  406. trigger_error("CURL emulation does not implement CURL option "._curlopt_name($option),E_USER_WARNING);
  407. break;
  408. }
  409. }
  410. // Perform a CURL emulation session
  411. function curl_exec($ch) {
  412. $opt = &$GLOBALS["_CURLEXT_OPT"][$ch];
  413. $url = $opt["url"];
  414. $verbose = $opt["verbose"];
  415. // ask commandline CURL to return its statistics at the end of its output
  416. $opt["settings"]["write-out"] = "%{http_code}|%{time_total}|%{time_namelookup}|%{time_connect}|%{time_pretransfer}|%{time_starttransfer}|%{size_download}|%{size_upload}|%{size_header}|%{size_request}|%{speed_download}|%{speed_upload}|||||||%{content_type}|%{url_effective}";
  417. $writeout_order = array(
  418. CURLINFO_HTTP_CODE,
  419. CURLINFO_TOTAL_TIME,
  420. CURLINFO_NAMELOOKUP_TIME,
  421. CURLINFO_CONNECT_TIME,
  422. CURLINFO_PRETRANSFER_TIME,
  423. CURLINFO_STARTTRANSFER_TIME,
  424. CURLINFO_SIZE_DOWNLOAD,
  425. CURLINFO_SIZE_UPLOAD,
  426. CURLINFO_HEADER_SIZE,
  427. CURLINFO_REQUEST_SIZE,
  428. CURLINFO_SPEED_DOWNLOAD,
  429. CURLINFO_SPEED_UPLOAD,
  430. // the following 5 items are not provided by commandline CURL, and thus are left empty
  431. CURLINFO_FILETIME,
  432. CURLINFO_REDIRECT_TIME,
  433. CURLINFO_SSL_VERIFYRESULT,
  434. CURLINFO_CONTENT_LENGTH_DOWNLOAD,
  435. CURLINFO_CONTENT_LENGTH_UPLOAD,
  436. CURLINFO_REDIRECT_COUNT,
  437. CURLINFO_CONTENT_TYPE,
  438. CURLINFO_EFFECTIVE_URL,
  439. );
  440. // if the CURLOPT_NOBODY option was specified (to remove the body from the output),
  441. // but an output file handle was set, we need to tell CURL to return the body so
  442. // that we can write it to the output handle and strip it from the output
  443. if ($opt["settings"]["head"] && $opt["output_handle"]) {
  444. unset($opt["settings"]["head"]);
  445. $strip_body = true;
  446. }
  447. // if the CURLOPT_HEADER option was NOT specified, but a header file handle was
  448. // specified, we again need to tell CURL to return the headers so we can write
  449. // them, then strip them from the output
  450. if (!isset($opt["settings"]["include"]) && isset($opt["header_handle"])) {
  451. $opt["settings"]["include"] = true;
  452. $strip_headers = true;
  453. }
  454. // build the CURL argument list
  455. $arguments = "";
  456. foreach ($opt["args"] as $k=>$arg) {
  457. list($argname,$argval) = explode('=',$arg,2);
  458. $arguments .= "--$argname ".escapeshellarg($argval)." ";
  459. }
  460. foreach ($opt["settings"] as $argname=>$argval) {
  461. if (is_array($argval)) {
  462. if (isset($argval["enabled"]) && !$argval["enabled"]) continue;
  463. $argval = $argval["value"];
  464. }
  465. if ($argval===false) continue;
  466. if (is_bool($argval)) $argval = "";
  467. $arguments .= "--$argname ".escapeshellarg($argval)." ";
  468. }
  469. // build the CURL commandline and execute it
  470. $cmd = CURL_PATH." ".$arguments." ".escapeshellarg($url);
  471. if ($verbose) echo "libcurlemu: Executing: $cmdn";
  472. exec($cmd,$output,$ret);
  473. if ($verbose) {
  474. echo "libcurlemu: Result: ";
  475. var_dump($output);
  476. echo "libcurlemu: Exit code: $retn";
  477. }
  478. // check for errors
  479. $opt["errno"] = $ret;
  480. if ($ret) $opt["error"] = "CURL error #$ret";
  481. // die if CURLOPT_FAILONERROR is set and the HTTP result code is greater than 300
  482. if ($opt["fail_on_error"]) {
  483. if (preg_match("/^HTTP/1.[0-9]+ ([0-9]{3}) /",$output[0],$matches)) {
  484. $resultcode = (int) $matches[1];
  485. if ($resultcode>300) die;
  486. } else {
  487. die; // couldn't get result code!
  488. }
  489. }
  490. // pull the statistics out from the output
  491. $stats = explode('|',array_pop($output));
  492. foreach ($writeout_order as $k=>$item) {
  493. $opt["stats"][$item] = $stats[$k];
  494. }
  495. // build the response string
  496. $output = implode("rn",$output);
  497. // find the header end position if needed
  498. if ($strip_headers || $strip_body || isset($opt["header_handle"])) {
  499. $headerpos = strpos($output,"rnrn");
  500. }
  501. // if a file handle was provided for header output, extract the headers
  502. // and write them to the handle
  503. if (isset($opt["header_handle"])) {
  504. $headers = substr($output,0,$headerpos);
  505. fwrite($opt["header_handle"],$headers);
  506. }
  507. // if the caller did not request headers in the output, strip them
  508. if ($strip_headers) {
  509. $output = substr($output,$headerpos+4);
  510. }
  511. // if the caller did not request the response body in the output, strip it
  512. if ($strip_body) {
  513. if ($strip_headers) {
  514. $body = $output;
  515. $output = "";
  516. } else {
  517. $body = substr($output,$headerpos+4);
  518. $output = substr($output,0,$headerpos);
  519. }
  520. }
  521. // if a file handle was provided for output, write the output to it
  522. if (isset($opt["output_handle"])) {
  523. fwrite($opt["output_handle"],$output);
  524. // if the caller requested that the response be returned, return it
  525. } elseif ($opt["return_transfer"]) {
  526. return $output;
  527. // otherwise, just echo the output to stdout
  528. } else {
  529. echo $output;
  530. }
  531. return true;
  532. }
  533. function curl_close($ch) {
  534. $opt = &$GLOBALS["_CURLEXT_OPT"][$ch];
  535. if ($opt["settings"]) {
  536. $settings = &$opt["settings"];
  537. // if the user used CURLOPT_INFILE to specify a file to upload, remove the
  538. // temporary file created for the CURL binary
  539. if ($settings["upload-file"]["value"] && file_exists($settings["upload-file"]["value"])) unlink($settings["upload-file"]["value"]);
  540. }
  541. unset($GLOBALS["_CURLEXT_OPT"][$ch]);
  542. }
  543. function curl_errno($ch) {
  544. return (int) $GLOBALS["_CURLEXT_OPT"][$ch]["errno"];
  545. }
  546. function curl_error($ch) {
  547. return $GLOBALS["_CURLEXT_OPT"][$ch]["error"];
  548. }
  549. function curl_getinfo($ch,$opt=NULL) {
  550. if ($opt) {
  551. return $GLOBALS["_CURLEXT_OPT"][$ch]["stats"][$opt];
  552. } else {
  553. $curlinfo_tags = array(
  554. "url"=>CURLINFO_EFFECTIVE_URL,
  555. "content_type"=>CURLINFO_CONTENT_TYPE,
  556. "http_code"=>CURLINFO_HTTP_CODE,
  557. "header_size"=>CURLINFO_HEADER_SIZE,
  558. "request_size"=>CURLINFO_REQUEST_SIZE,
  559. "filetime"=>CURLINFO_FILETIME,
  560. "ssl_verify_result"=>CURLINFO_SSL_VERIFYRESULT,
  561. "redirect_count"=>CURLINFO_REDIRECT_COUNT,
  562. "total_time"=>CURLINFO_TOTAL_TIME,
  563. "namelookup_time"=>CURLINFO_NAMELOOKUP_TIME,
  564. "connect_time"=>CURLINFO_CONNECT_TIME,
  565. "pretransfer_time"=>CURLINFO_PRETRANSFER_TIME,
  566. "size_upload"=>CURLINFO_SIZE_UPLOAD,
  567. "size_download"=>CURLINFO_SIZE_DOWNLOAD,
  568. "speed_download"=>CURLINFO_SPEED_DOWNLOAD,
  569. "speed_upload"=>CURLINFO_SPEED_UPLOAD,
  570. "download_content_length"=>CURLINFO_CONTENT_LENGTH_DOWNLOAD,
  571. "upload_content_length"=>CURLINFO_CONTENT_LENGTH_UPLOAD,
  572. "starttransfer_time"=>CURLINFO_STARTTRANSFER_TIME,
  573. "redirect_time"=>CURLINFO_REDIRECT_TIME
  574. );
  575. $res = array();
  576. foreach ($curlinfo_tags as $tag=>$opt) {
  577. $res[$tag] = $GLOBALS["_CURLEXT_OPT"][$ch]["stats"][$opt];
  578. }
  579. return $res;
  580. }
  581. }
  582. function curl_version() {
  583. return "libcurlemu/".CURLEXT_VERSION."-ext";
  584. }
  585. }
  586. ?>