function LoadFile($strRealUrl, $strFilename, $arHeaders = array()) { global $proxyaddr, $proxyport, $strUserAgent, $replycode; $iStartSize = 0; if (file_exists($strFilename.".tmp")) $iStartSize = filesize($strFilename.".tmp"); $parsedurl = parse_url($strRealUrl); $strOriginalFile = basename($parsedurl['path']); do { SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_QUERY_DISTR"))); $lasturl = $strRealUrl; $redirection = ""; $parsedurl = parse_url($strRealUrl); $useproxy = (($proxyaddr != "") && ($proxyport != "")); if (!$useproxy) { $host = $parsedurl["host"]; $port = $parsedurl["port"]; $hostname = $host; } else { $host = $proxyaddr; $port = $proxyport; $hostname = $parsedurl["host"]; } SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST"))); $port = $port ? $port : "80"; $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10); if (!$sockethandle) { SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg); return false; } else { if (!$parsedurl["path"]) $parsedurl["path"] = "/"; $request = ""; if (!$useproxy) { $request .= "GET ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } else { $request .= "GET ".$strRealUrl." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } if ($strUserAgent != "") $request .= "User-Agent: $strUserAgent\r\n"; foreach($arHeaders as $k => $v) $request .= $k.': '.$v."\r\n"; $request .= "\r\n"; fwrite($sockethandle, $request); $result = ""; $replyheader = ""; while (($result = fgets($sockethandle, 4096)) && $result!="\r\n") { $replyheader .= $result; } fclose($sockethandle); $ar_replyheader = explode("\r\n", $replyheader); $replyproto = ""; $replyversion = ""; $replycode = 0; $replymsg = ""; if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs)) { $replyproto = $regs[1]; $replyversion = $regs[2]; $replycode = IntVal($regs[3]); $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1); } if ($replycode!=200 && $replycode!=302) { if ($replycode==403) SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER1"))); else SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER"))); return false; } $strLocationUrl = ""; $iNewRealSize = 0; $strAcceptRanges = ""; foreach ($ar_replyheader as $i => $headerLine) { if (strpos($headerLine, "Location") !== false) $strLocationUrl = trim(substr($headerLine, strpos($headerLine, ":") + 1, strlen($headerLine) - strpos($headerLine, ":") + 1)); elseif (strpos($headerLine, "Content-Length") !== false) $iNewRealSize = IntVal(Trim(substr($headerLine, strpos($headerLine, ":") + 1, strlen($headerLine) - strpos($headerLine, ":") + 1))); elseif (strpos($headerLine, "Accept-Ranges") !== false) $strAcceptRanges = Trim(substr($headerLine, strpos($headerLine, ":") + 1, strlen($headerLine) - strpos($headerLine, ":") + 1)); } if (strlen($strLocationUrl)>0) { $redirection = $strLocationUrl; $redirected = true; if ((strpos($redirection, "http://")===false)) $strRealUrl = dirname($lasturl)."/".$redirection; else $strRealUrl = $redirection; } if (strlen($strLocationUrl)) $bRedirect = true; else break; } } while (true); if (strpos($strRealUrl, $strOriginalFile) === false) { SetCurrentStatus(str_replace("#URL#", htmlspecialcharsbx($strRealUrl), LoaderGetMessage("LOADER_LOAD_CANT_REDIRECT"))); return false; } SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_LOAD_DISTR"))); $parsedurl = parse_url($strRealUrl); $useproxy = (($proxyaddr != "") && ($proxyport != "")); if (!$useproxy) { $host = $parsedurl["host"]; $port = $parsedurl["port"]; $hostname = $host; } else { $host = $proxyaddr; $port = $proxyport; $hostname = $parsedurl["host"]; } $port = $port ? $port : "80"; SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST"))); $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10); if (!$sockethandle) { SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg); return false; } else { if (!$parsedurl["path"]) $parsedurl["path"] = "/"; SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE")); $request = ""; if (!$useproxy) { $request .= "GET ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } else { $request .= "GET ".$strRealUrl." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } if ($strUserAgent != "") $request .= "User-Agent: $strUserAgent\r\n"; if ($iStartSize>0) $request .= "Range: bytes=".$iStartSize."-\r\n"; foreach($arHeaders as $k => $v) $request .= $k.': '.$v."\r\n"; $request .= "\r\n"; fwrite($sockethandle, $request); $result = ""; SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT")); $replyheader = ""; while (($result = fgets($sockethandle, 4096)) && $result!="\r\n") $replyheader .= $result; $ar_replyheader = explode("\r\n", $replyheader); $replyproto = ""; $replyversion = ""; $replycode = 0; $replymsg = ""; if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs)) { $replyproto = $regs[1]; $replyversion = $regs[2]; $replycode = IntVal($regs[3]); $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1); } if ($replycode!=200 && $replycode!=302 && $replycode!=206) { SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER"))); return false; } $strContentRange = ""; $iContentLength = 0; $strAcceptRanges = ""; foreach ($ar_replyheader as $i => $headerLine) { if (strpos($headerLine, "Content-Range") !== false) $strContentRange = trim(substr($headerLine, strpos($headerLine, ":") + 1, strlen($headerLine) - strpos($headerLine, ":") + 1)); elseif (strpos($headerLine, "Content-Length") !== false) $iContentLength = doubleval(Trim(substr($headerLine, strpos($headerLine, ":") + 1, strlen($headerLine) - strpos($headerLine, ":") + 1))); elseif (strpos($headerLine, "Accept-Ranges") !== false) $strAcceptRanges = Trim(substr($headerLine, strpos($headerLine, ":") + 1, strlen($headerLine) - strpos($headerLine, ":") + 1)); } $fh = fopen($strFilename.".tmp", "ab"); if (!$fh) { SetCurrentStatus(str_replace("#FILE#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_CANT_OPEN_WRITE"))); return false; } $bFinished = True; $downloadsize = (double) $iStartSize; SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_LOADING")); while (!feof($sockethandle)) { if (!haveTime()) { $bFinished = False; break; } $result = fread($sockethandle, 40960); $downloadsize += strlen($result); if ($result=="") break; fwrite($fh, $result); } SetCurrentProgress($downloadsize,$iNewRealSize); fclose($fh); fclose($sockethandle); if ($bFinished) { @unlink($strFilename); if (@rename($strFilename.".tmp", $strFilename)) { SetCurrentStatus(str_replace("#SIZE#", $downloadsize, str_replace("#FILE#", $strFilename, LoaderGetMessage("LOADER_LOAD_FILE_SAVED")))); return 1; } else { SetCurrentStatus(str_replace("#FILE2#", $strFilename, str_replace("#FILE1#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_ERR_RENAME")))); return false; } } else return 2; } }
function _extractList($p_path, &$p_list_detail, $p_mode, $p_file_list, $p_remove_path) { global $iNumDistrFiles; $v_result = true; $v_nb = 0; $v_extract_all = true; $v_listing = false; $p_path = str_replace("\\", "/", $p_path); if ($p_path == '' || substr($p_path, 0, 1) != '/' && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':')) { $p_path = "./" . $p_path; } $p_remove_path = str_replace("\\", "/", $p_remove_path); if ($p_remove_path != '' && substr($p_remove_path, -1) != '/') { $p_remove_path .= '/'; } $p_remove_path_size = strlen($p_remove_path); switch ($p_mode) { case "complete": $v_extract_all = TRUE; $v_listing = FALSE; break; case "partial": $v_extract_all = FALSE; $v_listing = FALSE; break; case "list": $v_extract_all = FALSE; $v_listing = TRUE; break; default: $this->_arErrors[] = array("ERR_PARAM", "Invalid extract mode (" . $p_mode . ")"); return false; } clearstatcache(); $tm = time(); while ((extension_loaded("mbstring") ? mb_strlen($v_binary_data = $this->_readBlock(), "latin1") : strlen($v_binary_data = $this->_readBlock())) != 0) { $v_extract_file = FALSE; $v_extraction_stopped = 0; if (!$this->_readHeader($v_binary_data, $v_header)) { return false; } if ($v_header['filename'] == '') { continue; } // ----- Look for long filename if ($v_header['typeflag'] == 'L') { if (!$this->_readLongHeader($v_header)) { return false; } } if (!$v_extract_all && is_array($p_file_list)) { // ----- By default no unzip if the file is not found $v_extract_file = false; for ($i = 0; $i < count($p_file_list); $i++) { // ----- Look if it is a directory if (substr($p_file_list[$i], -1) == '/') { // ----- Look if the directory is in the filename path if (strlen($v_header['filename']) > strlen($p_file_list[$i]) && substr($v_header['filename'], 0, strlen($p_file_list[$i])) == $p_file_list[$i]) { $v_extract_file = TRUE; break; } } elseif ($p_file_list[$i] == $v_header['filename']) { // ----- It is a file, so compare the file names $v_extract_file = TRUE; break; } } } else { $v_extract_file = TRUE; } // ----- Look if this file need to be extracted if ($v_extract_file && !$v_listing) { if ($p_remove_path != '' && substr($v_header['filename'], 0, $p_remove_path_size) == $p_remove_path) { $v_header['filename'] = substr($v_header['filename'], $p_remove_path_size); } if ($p_path != './' && $p_path != '/') { while (substr($p_path, -1) == '/') { $p_path = substr($p_path, 0, strlen($p_path) - 1); } if (substr($v_header['filename'], 0, 1) == '/') { $v_header['filename'] = $p_path . $v_header['filename']; } else { $v_header['filename'] = $p_path . '/' . $v_header['filename']; } } if (file_exists($v_header['filename'])) { if (@is_dir($v_header['filename']) && $v_header['typeflag'] == '') { $this->_arErrors[] = array("DIR_EXISTS", "File '" . $v_header['filename'] . "' already exists as a directory"); return false; } if (is_file($v_header['filename']) && $v_header['typeflag'] == "5") { $this->_arErrors[] = array("FILE_EXISTS", "Directory '" . $v_header['filename'] . "' already exists as a file"); return false; } if (!is_writeable($v_header['filename'])) { $this->_arErrors[] = array("FILE_PERMS", "File '" . $v_header['filename'] . "' already exists and is write protected"); return false; } } elseif (($v_result = $this->_dirCheck($v_header['typeflag'] == "5" ? $v_header['filename'] : dirname($v_header['filename']))) != 1) { $this->_arErrors[] = array("NO_DIR", "Unable to create path for '" . $v_header['filename'] . "'"); return false; } if ($v_extract_file) { if ($v_header['typeflag'] == "5") { if (!@file_exists($v_header['filename'])) { if (!@mkdir($v_header['filename'], BX_DIR_PERMISSIONS)) { $this->_arErrors[] = array("ERR_CREATE_DIR", "Unable to create directory '" . $v_header['filename'] . "'"); return false; } } } else { if (($v_dest_file = fopen($v_header['filename'], "wb")) == 0) { $this->_arErrors[] = array("ERR_CREATE_FILE", LoaderGetMessage('NO_PERMS') . ' ' . $v_header['filename']); return false; } else { $n = floor($v_header['size'] / 512); for ($i = 0; $i < $n; $i++) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, 512); } if ($v_header['size'] % 512 != 0) { $v_content = $this->_readBlock(); fwrite($v_dest_file, $v_content, $v_header['size'] % 512); } @fclose($v_dest_file); @chmod($v_header['filename'], BX_FILE_PERMISSIONS); @touch($v_header['filename'], $v_header['mtime']); } clearstatcache(); if (filesize($v_header['filename']) != $v_header['size']) { $this->_arErrors[] = array("ERR_SIZE_CHECK", "Extracted file '" . $v_header['filename'] . "' have incorrect file size '" . filesize($v_filename) . "' (" . $v_header['size'] . " expected). Archive may be corrupted"); return false; } } } else { $this->_jumpBlock(ceil($v_header['size'] / 512)); } } else { $this->_jumpBlock(ceil($v_header['size'] / 512)); } if ($v_listing || $v_extract_file || $v_extraction_stopped) { if (($v_file_dir = dirname($v_header['filename'])) == $v_header['filename']) { $v_file_dir = ''; } if (substr($v_header['filename'], 0, 1) == '/' && $v_file_dir == '') { $v_file_dir = '/'; } $p_list_detail[$v_nb++] = $v_header; if ($v_nb % 100 == 0) { SetCurrentProgress($this->iCurPos, $this->iArchSize, False); } } if ($_REQUEST['by_step'] && time() - $tm > TIMEOUT) { SetCurrentProgress($this->iCurPos, $this->iArchSize, False); return true; } } $this->bFinish = true; return true; }
function LoadFile($strRequestedUrl, $strFilename, &$strRealUrl) { global $proxyaddr, $proxyport, $strUserAgent, $strRequestedSize; $strRealUrl = $strRequestedUrl; $iStartSize = 0; $iRealSize = 0; $bCanContinueDownload = False; // ИНИЦИАЛИЗИРУЕМ, ЕСЛИ ДОКАЧКА $strRealUrl_tmp = ""; $iRealSize_tmp = 0; if (file_exists($strFilename.".tmp") && file_exists($strFilename.".log") && filesize($strFilename.".log")>0) { $fh = fopen($strFilename.".log", "rb"); $file_contents_tmp = fread($fh, filesize($strFilename.".log")); fclose($fh); list($strRealUrl_tmp, $iRealSize_tmp) = explode("\n", $file_contents_tmp); $strRealUrl_tmp = Trim($strRealUrl_tmp); $iRealSize_tmp = doubleval(Trim($iRealSize_tmp)); } if ($iRealSize_tmp<=0 || strlen($strRealUrl_tmp)<=0) { $strRealUrl_tmp = ""; $iRealSize_tmp = 0; if (file_exists($strFilename.".tmp")) @unlink($strFilename.".tmp"); if (file_exists($strFilename.".log")) @unlink($strFilename.".log"); } else { $strRealUrl = $strRealUrl_tmp; $iRealSize = $iRealSize_tmp; $iStartSize = filesize($strFilename.".tmp"); } // КОНЕЦ: ИНИЦИАЛИЗИРУЕМ, ЕСЛИ ДОКАЧКА //SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_SERVER")); SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST"))); // ИЩЕМ ФАЙЛ И ЗАПРАШИВАЕМ ИНФО do { SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_QUERY_DISTR"))); $lasturl = $strRealUrl; $redirection = ""; $parsedurl = @parse_url($strRealUrl); $useproxy = (($proxyaddr != "") && ($proxyport != "")); if (!$useproxy) { $host = $parsedurl["host"]; $port = $parsedurl["port"]; $hostname = $host; } else { $host = $proxyaddr; $port = $proxyport; $hostname = $parsedurl["host"]; } $port = $port ? $port : "80"; $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10); if (!$sockethandle) { SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg); return false; } else { if (!$parsedurl["path"]) $parsedurl["path"] = "/"; // SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE")); $request = ""; if (!$useproxy) { $request .= "HEAD ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } else { $request .= "HEAD ".$strRealUrl." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } if ($strUserAgent != "") $request .= "User-Agent: $strUserAgent\r\n"; $request .= "\r\n"; fwrite($sockethandle, $request); $result = ""; // SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT")); $replyheader = ""; while (($result = fgets($sockethandle, 4096)) && $result!="\r\n") { $replyheader .= $result; } fclose($sockethandle); $ar_replyheader = explode("\r\n", $replyheader); $replyproto = ""; $replyversion = ""; $replycode = 0; $replymsg = ""; if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs)) { $replyproto = $regs[1]; $replyversion = $regs[2]; $replycode = IntVal($regs[3]); $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1); } if ($replycode!=200 && $replycode!=302) { if ($replycode==403) SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER1"))); else SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER"))); return false; } $strLocationUrl = ""; $iNewRealSize = 0; $strAcceptRanges = ""; for ($i = 1; $i < count($ar_replyheader); $i++) { if (strpos($ar_replyheader[$i], "Location") !== false) $strLocationUrl = trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)); elseif (strpos($ar_replyheader[$i], "Content-Length") !== false) $iNewRealSize = IntVal(Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1))); elseif (strpos($ar_replyheader[$i], "Accept-Ranges") !== false) $strAcceptRanges = Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)); } if (strlen($strLocationUrl)>0) { $redirection = $strLocationUrl; $redirected = true; if ((strpos($redirection, "http://")===false)) $strRealUrl = dirname($lasturl)."/".$redirection; else $strRealUrl = $redirection; } if (strlen($strLocationUrl)<=0) break; } } while (true); // КОНЕЦ: ИЩЕМ ФАЙЛ И ЗАПРАШИВАЕМ ИНФО $bCanContinueDownload = true; //($strAcceptRanges == "bytes"); // ЕСЛИ НЕЛЬЗЯ ДОКАЧИВАТЬ if (!$bCanContinueDownload || ($iRealSize>0 && $iNewRealSize != $iRealSize)) { // SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_NEED_RELOAD")); // $iStartSize = 0; die(LoaderGetMessage("LOADER_LOAD_NEED_RELOAD")); } // КОНЕЦ: ЕСЛИ НЕЛЬЗЯ ДОКАЧИВАТЬ // ЕСЛИ МОЖНО ДОКАЧИВАТЬ if ($bCanContinueDownload) { $fh = fopen($strFilename.".log", "wb"); if (!$fh) { SetCurrentStatus(str_replace("#FILE#", $strFilename.".log", LoaderGetMessage("LOADER_LOAD_NO_WRITE2FILE"))); return false; } fwrite($fh, $strRealUrl."\n"); fwrite($fh, $iNewRealSize."\n"); fclose($fh); } // КОНЕЦ: ЕСЛИ МОЖНО ДОКАЧИВАТЬ SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_LOAD_DISTR"))); $strRequestedSize = $iNewRealSize; // КАЧАЕМ ФАЙЛ $parsedurl = parse_url($strRealUrl); $useproxy = (($proxyaddr != "") && ($proxyport != "")); if (!$useproxy) { $host = $parsedurl["host"]; $port = $parsedurl["port"]; $hostname = $host; } else { $host = $proxyaddr; $port = $proxyport; $hostname = $parsedurl["host"]; } $port = $port ? $port : "80"; SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST"))); $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10); if (!$sockethandle) { SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg); return false; } else { if (!$parsedurl["path"]) $parsedurl["path"] = "/"; SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE")); $request = ""; if (!$useproxy) { $request .= "GET ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } else { $request .= "GET ".$strRealUrl." HTTP/1.0\r\n"; $request .= "Host: $hostname\r\n"; } if ($strUserAgent != "") $request .= "User-Agent: $strUserAgent\r\n"; if ($bCanContinueDownload && $iStartSize>0) $request .= "Range: bytes=".$iStartSize."-\r\n"; $request .= "\r\n"; fwrite($sockethandle, $request); $result = ""; SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT")); $replyheader = ""; while (($result = fgets($sockethandle, 4096)) && $result!="\r\n") $replyheader .= $result; $ar_replyheader = explode("\r\n", $replyheader); $replyproto = ""; $replyversion = ""; $replycode = 0; $replymsg = ""; if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs)) { $replyproto = $regs[1]; $replyversion = $regs[2]; $replycode = IntVal($regs[3]); $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1); } if ($replycode!=200 && $replycode!=302 && $replycode!=206) { SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER"))); return false; } $strContentRange = ""; $iContentLength = 0; $strAcceptRanges = ""; for ($i = 1; $i < count($ar_replyheader); $i++) { if (strpos($ar_replyheader[$i], "Content-Range") !== false) $strContentRange = trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)); elseif (strpos($ar_replyheader[$i], "Content-Length") !== false) $iContentLength = doubleval(Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1))); elseif (strpos($ar_replyheader[$i], "Accept-Ranges") !== false) $strAcceptRanges = Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)); } $bReloadFile = True; if (strlen($strContentRange)>0) { if (preg_match("# *bytes +([0-9]*) *- *([0-9]*) */ *([0-9]*)#i", $strContentRange, $regs)) { $iStartBytes_tmp = doubleval($regs[1]); $iEndBytes_tmp = doubleval($regs[2]); $iSizeBytes_tmp = doubleval($regs[3]); if ($iStartBytes_tmp==$iStartSize && $iEndBytes_tmp==($iNewRealSize-1) && $iSizeBytes_tmp==$iNewRealSize) { $bReloadFile = False; } } } if ($bReloadFile) { @unlink($strFilename.".tmp"); $iStartSize = 0; } if (($iContentLength+$iStartSize)!=$iNewRealSize) { SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_ERR_SIZE")); return false; } $fh = fopen($strFilename.".tmp", "ab"); if (!$fh) { SetCurrentStatus(str_replace("#FILE#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_CANT_OPEN_WRITE"))); return false; } $bFinished = True; $downloadsize = (double) $iStartSize; SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_LOADING")); while (!feof($sockethandle)) { if (!haveTime()) { $bFinished = False; break; } $result = fread($sockethandle, 40960); $downloadsize += strlen($result); if ($result=="") break; fwrite($fh, $result); } SetCurrentProgress($downloadsize,$iNewRealSize); fclose($fh); fclose($sockethandle); if ($bFinished) { @unlink($strFilename); if (!@rename($strFilename.".tmp", $strFilename)) { SetCurrentStatus(str_replace("#FILE2#", $strFilename, str_replace("#FILE1#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_ERR_RENAME")))); return false; } } else return 2; SetCurrentStatus(str_replace("#SIZE#", $downloadsize, str_replace("#FILE#", $strFilename, LoaderGetMessage("LOADER_LOAD_FILE_SAVED")))); @unlink($strFilename.".log"); return 1; } // КОНЕЦ: КАЧАЕМ ФАЙЛ }