예제 #1
0
 /**
  * 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;
 }
예제 #2
0
파일: Tokenizer.php 프로젝트: norbe/AutoUse
	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"),
		);
	}
예제 #3
0
 /**
  * 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;
 }
예제 #4
0
 /**
  * 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);
         }
     }
 }
예제 #5
0
 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}.");
 }