0) { if($store_in) fclose($outfp); return $self::get_with_headers($headers['location'], $store_in, $follow_redirects); } if($store_in) { fclose($outfp); $code = intval(preg_replace('/^HTTP\/\d+\.\d+\s+(\d+)\s+.*$/', '$1', $headers['status'])); if($code != 200) { return false; } return $headers; } else { return array($headers, $data); } } else { if($store_in) { fclose($outfp); @unlink($store_in); } return false; } } /** * Gets the content of an url * * Checks for the php function file_get_contents and uses an alternative if not found * * @access public * @param string $url url to get * @return string url data including headers * @see file_get_contents */ public static function get($url) { if(function_exists('file_get_contents')) return file_get_contents($url); $fp = fopen($url, 'r'); $data = ''; while(!feof($fp)) { $data .= fgets($fp, 8192); } fclose($fp); return $data; } /** * Make a post request and get data * * Calls an url with a post request and returns the data - and optionally the header content * * @access public * @param string $url the url to call * @param string $data the post data to send * @param bool $get_headers if true, the function will return an array like PXUrl::get_with_headers(), otherwise the content is returned as a string * @return mixed Content data as string or - if get_headers is true - the array with header data at index 0 and page content at index 1 * @see get_url_and_headers */ public static function post($url, $data, $get_headers = false, $user_agent = false) { $url_info = parse_url($url); if((isset($url_info['scheme']) && $url_info['scheme'] == 'https') || $url_info['port'] == 443) { $port = (!isset($url_info['port']) || !$url_info['port'] || $url_info['port'] == 443 || $url_info['port'] == 80) ? 443 : $url_info['port']; @$fp = fsockopen('tls://' . $url_info['host'], $port, $errno, $errstr, 10); } else { $port = isset($url_info['port']) ? $url_info['port'] : 80; @$fp = fsockopen($url_info['host'], $port, $errno, $errstr, 10); } if(!$fp) return ''; if(!$user_agent) $user_agent = 'pxFW GET proxy'; $header = 'POST ' . (isset($url_info['path']) ? $url_info['path'] : '/') . (isset($url_info['query']) ? '?' . @$url_info['query'] : '') . " HTTP/1.1\r\n"; $header .= "Host: " . @$url_info['host'] . "\r\n"; $header .= "User-Agent: " . $user_agent . "\r\n"; if(isset($url_info['user'])) { if(!array_key_exists('pass', $url_info)) $url_info['pass'] = ''; $header .= "Authorization: basic " . base64_encode($url_info['user'] . ':' . $url_info['pass']) . "\r\n"; } $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($data) . "\r\n"; $header .= "Connection: close\r\n\r\n"; $header .= $data . "\r\n\r\n"; fwrite($fp, $header); $response = ''; $eoheader = false; $header = ''; $tmpdata = ''; $chunked = false; $chunklen = 0; while(!feof($fp)) { if($header = @fgets($fp, 1024)) { if($eoheader == true) { $response .= $header; continue; } if ($header == "\r\n") { $eoheader = true; continue; } else { $tmpdata .= $header; if(preg_match('/Transfer-Encoding:\s+chunked/i', $tmpdata)) $chunked = true; } } } //var_dump($response, $chunked, $header); if($chunked == true) { $lines = explode("\n", $response); $response = ''; $chunklen = 0; foreach($lines as $line) { $line .= "\n"; if($chunklen <= 0) { if(preg_match('/^([0-9a-f]+)\s*$/is', $line, $matches)) { $chunklen = hexdec($matches[1]); } continue; } if(strlen($line) > $chunklen) { //echo "Warnung: " . strlen($line) . " > " . $chunklen . "\n"; $line = substr($line, 0, $chunklen); } $response .= $line; $chunklen -= strlen($line); } $start = strpos($response, ''); if($start !== false && $end !== false) $response = substr($response, $start, $end - $start + 1); } fclose($fp); if($get_headers == true) { $tmpheaders = explode("\n", $tmpdata); $headers = array(); foreach($tmpheaders as $cur) { if(preg_match('/^(\w+)\:\s*(.*)$/is', $cur, $matches)) { $headers["$matches[1]"] = trim($matches[2]); } } return array($headers, $response); } else return $response; } } ?>