/** * Fix downloaded file * @throws \Curl\CurlException * @throws \InvalidStateException * @return \Curl\Response */ private function parseFile() { if ($this->request->method === Request::DOWNLOAD) { $path_p = $this->request->downloadPath; @fclose($this->request->getOption('file')); // internationaly @ if (($fp = @fopen($this->request->fileProtocol . '://' . $path_p, "rb")) === FALSE) { // internationaly @ throw new \InvalidStateException("Fopen error for file '{$path_p}'"); } $headers = String::split(@fread($fp, $this->request->info['header_size']), "~[\n\r]+~", PREG_SPLIT_NO_EMPTY); // internationaly @ $this->Headers = array_merge($this->Headers, static::parseHeaders($headers)); @fseek($fp, $this->request->info['header_size']); // internationaly @ $path_t = $this->request->downloadPath . '.tmp'; if (($ft = @fopen($this->request->fileProtocol . '://' . $path_t, "wb")) === FALSE) { // internationaly @ throw new \InvalidStateException("Write error for file '{$path_t}' "); } while (!feof($fp)) { $row = fgets($fp, 4096); fwrite($ft, $row); } @fclose($fp); // internationaly @ @fclose($ft); // internationaly @ if (!@unlink($this->request->fileProtocol . '://' . $path_p)) { // internationaly @ throw new \InvalidStateException("Error while deleting file {$path_p} "); } if (!@rename($path_t, $path_p)) { // internationaly @ throw new \InvalidStateException("Error while renaming file '{$path_t}' to '" . basename($path_p) . "'. "); } chmod($path_p, 0755); if (!$this->Headers) { throw new CurlException("Headers parsing failed", NULL, $this); } } return $this; }
public function getOffset($i) { $tokens = String::split($this->input, $this->re, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); list(, $offset) = $tokens[$i]; return array( $offset, ($offset ? substr_count($this->input, "\n", 0, $offset) + 1 : 1), $offset - strrpos(substr($this->input, 0, $offset), "\n"), ); }
/** * Parse mask and array of default values; initializes object. * @param string * @param array * @return void */ private function setMask($mask, array $metadata) { $this->mask = $mask; // detect '//host/path' vs. '/abs. path' vs. 'relative path' if (substr($mask, 0, 2) === '//') { $this->type = self::HOST; } elseif (substr($mask, 0, 1) === '/') { $this->type = self::PATH; } else { $this->type = self::RELATIVE; } foreach ($metadata as $name => $meta) { if (!is_array($meta)) { $metadata[$name] = array(self::VALUE => $meta, 'fixity' => self::CONSTANT); } elseif (array_key_exists(self::VALUE, $meta)) { $metadata[$name]['fixity'] = self::CONSTANT; } } // PARSE MASK $parts = String::split($mask, '/<([^># ]+) *([^>#]*)(#?[^>\\[\\]]*)>|(\\[!?|\\]|\\s*\\?.*)/'); // <parameter-name [pattern] [#class]> or [ or ] or ?... $this->xlat = array(); $i = count($parts) - 1; // PARSE QUERY PART OF MASK if (isset($parts[$i - 1]) && substr(ltrim($parts[$i - 1]), 0, 1) === '?') { $matches = String::matchAll($parts[$i - 1], '/(?:([a-zA-Z0-9_.-]+)=)?<([^># ]+) *([^>#]*)(#?[^>]*)>/'); // name=<parameter-name [pattern][#class]> foreach ($matches as $match) { list(, $param, $name, $pattern, $class) = $match; // $pattern is not used if ($class !== '') { if (!isset(self::$styles[$class])) { throw new \InvalidStateException("Parameter '{$name}' has '{$class}' flag, but Route::\$styles['{$class}'] is not set."); } $meta = self::$styles[$class]; } elseif (isset(self::$styles['?' . $name])) { $meta = self::$styles['?' . $name]; } else { $meta = self::$styles['?#']; } if (isset($metadata[$name])) { $meta = $metadata[$name] + $meta; } if (array_key_exists(self::VALUE, $meta)) { $meta['fixity'] = self::OPTIONAL; } unset($meta['pattern']); $meta['filterTable2'] = empty($meta[self::FILTER_TABLE]) ? NULL : array_flip($meta[self::FILTER_TABLE]); $metadata[$name] = $meta; if ($param !== '') { $this->xlat[$name] = $param; } } $i -= 5; } $brackets = 0; // optional level $re = ''; $sequence = array(); $autoOptional = array(0, 0); // strlen($re), count($sequence) do { array_unshift($sequence, $parts[$i]); $re = preg_quote($parts[$i], '#') . $re; if ($i === 0) { break; } $i--; $part = $parts[$i]; // [ or ] if ($part === '[' || $part === ']' || $part === '[!') { $brackets += $part[0] === '[' ? -1 : 1; if ($brackets < 0) { throw new \InvalidArgumentException("Unexpected '{$part}' in mask '{$mask}'."); } array_unshift($sequence, $part); $re = ($part[0] === '[' ? '(?:' : ')?') . $re; $i -= 4; continue; } $class = $parts[$i]; $i--; // validation class $pattern = trim($parts[$i]); $i--; // validation condition (as regexp) $name = $parts[$i]; $i--; // parameter name array_unshift($sequence, $name); if ($name[0] === '?') { // "foo" parameter $re = '(?:' . preg_quote(substr($name, 1), '#') . '|' . $pattern . ')' . $re; $sequence[1] = substr($name, 1) . $sequence[1]; continue; } // check name (limitation by regexp) if (preg_match('#[^a-z0-9_-]#i', $name)) { throw new \InvalidArgumentException("Parameter name must be alphanumeric string due to limitations of PCRE, '{$name}' given."); } // pattern, condition & metadata if ($class !== '') { if (!isset(self::$styles[$class])) { throw new \InvalidStateException("Parameter '{$name}' has '{$class}' flag, but Route::\$styles['{$class}'] is not set."); } $meta = self::$styles[$class]; } elseif (isset(self::$styles[$name])) { $meta = self::$styles[$name]; } else { $meta = self::$styles['#']; } if (isset($metadata[$name])) { $meta = $metadata[$name] + $meta; } if ($pattern == '' && isset($meta[self::PATTERN])) { $pattern = $meta[self::PATTERN]; } $meta['filterTable2'] = empty($meta[self::FILTER_TABLE]) ? NULL : array_flip($meta[self::FILTER_TABLE]); if (array_key_exists(self::VALUE, $meta)) { if (isset($meta['filterTable2'][$meta[self::VALUE]])) { $meta['defOut'] = $meta['filterTable2'][$meta[self::VALUE]]; } elseif (isset($meta[self::FILTER_OUT])) { $meta['defOut'] = call_user_func($meta[self::FILTER_OUT], $meta[self::VALUE]); } else { $meta['defOut'] = $meta[self::VALUE]; } } $meta[self::PATTERN] = "#(?:{$pattern})\$#A" . ($this->flags & self::CASE_SENSITIVE ? '' : 'iu'); // include in expression $re = '(?P<' . str_replace('-', '___', $name) . '>' . $pattern . ')' . $re; // str_replace is dirty trick to enable '-' in parameter name if ($brackets) { // is in brackets? if (!isset($meta[self::VALUE])) { $meta[self::VALUE] = $meta['defOut'] = NULL; } $meta['fixity'] = self::PATH_OPTIONAL; } elseif (isset($meta['fixity'])) { // auto-optional $re = '(?:' . substr_replace($re, ')?', strlen($re) - $autoOptional[0], 0); array_splice($sequence, count($sequence) - $autoOptional[1], 0, array(']', '')); array_unshift($sequence, '[', ''); $meta['fixity'] = self::PATH_OPTIONAL; } else { $autoOptional = array(strlen($re), count($sequence)); } $metadata[$name] = $meta; } while (TRUE); if ($brackets) { throw new \InvalidArgumentException("Missing closing ']' in mask '{$mask}'."); } $this->re = '#' . $re . '/?$#A' . ($this->flags & self::CASE_SENSITIVE ? '' : 'iu'); $this->metadata = $metadata; $this->sequence = $sequence; }
/** * Scan a directory for PHP files, subdirectories and 'netterobots.txt' file. * @param string * @return void */ private function scanDirectory($dir) { if (is_dir($dir)) { $disallow = array(); $iterator = Nette\Finder::findFiles(String::split($this->acceptFiles, '#[,\\s]+#'))->filter(function ($file) use(&$disallow) { return !isset($disallow[$file->getPathname()]); })->from($dir)->exclude(String::split($this->ignoreDirs, '#[,\\s]+#'))->filter($filter = function ($dir) use(&$disallow) { $path = $dir->getPathname(); if (is_file("{$path}/netterobots.txt")) { foreach (file("{$path}/netterobots.txt") as $s) { if ($matches = String::match($s, '#^disallow\\s*:\\s*(\\S+)#i')) { $disallow[$path . str_replace('/', DIRECTORY_SEPARATOR, rtrim('/' . ltrim($matches[1], '/'), '/'))] = TRUE; } } } return !isset($disallow[$path]); }); $filter(new \SplFileInfo($dir)); } else { $iterator = new \ArrayIterator(array(new \SplFileInfo($dir))); } foreach ($iterator as $entry) { $path = $entry->getPathname(); if (!isset($this->files[$path]) || $this->files[$path] !== $entry->getMTime()) { $this->scanScript($path); } } }
private function error() { $tokens = String::split($this->input, self::$regexp, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE); list($token, $offset) = $tokens[$this->n]; $line = substr_count($this->input, "\n", 0, $offset) + 1; $col = $offset - strrpos(substr($this->input, 0, $offset), "\n"); throw new \Exception('NEON parse error: unexpected ' . str_replace("\n", '\\n', substr($token, 0, 10)) . " on line {$line}, column {$col}."); }