public function init() { if (!isset($this->attrs->server['FR_URL'])) { $this->status(404); $this->finish(); return; } try { $this->stream = new AsyncStream($this->attrs->server['FR_URL']); if ($this->stream->fileMode) { if (substr($this->stream->filePath, -1) === '/' && is_dir($this->stream->filePath)) { $found = FALSE; foreach ($this->appInstance->indexFiles as $i) { if (is_file($this->stream->filePath . $i)) { $this->stream = new AsyncStream('file://' . $this->stream->filePath . $i); $found = TRUE; break; } } if (!$found) { if (isset($this->attrs->server['FR_AUTOINDEX']) && $this->attrs->server['FR_AUTOINDEX']) { $h = opendir($this->stream->filePath); if (!$h) { $this->status(404); $this->finish(); return; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Index of /</title> <style type="text/css"> a, a:active {text-decoration: none; color: blue;} a:visited {color: #48468F;} a:hover, a:focus {text-decoration: underline; color: red;} body {background-color: #F5F5F5;} h2 {margin-bottom: 12px;} table {margin-left: 12px;} th, td { font: 90% monospace; text-align: left;} th { font-weight: bold; padding-right: 14px; padding-bottom: 3px;} td {padding-right: 14px;} td.s, th.s {text-align: right;} div.list { background-color: white; border-top: 1px solid #646464; border-bottom: 1px solid #646464; padding-top: 10px; padding-bottom: 14px;} div.foot { font: 90% monospace; color: #787878; padding-top: 4px;} </style> </head> <body> <pre class="header"Welcome!</pre><h2>Index of /</h2> <div class="list"> <table summary="Directory Listing" cellpadding="0" cellspacing="0"> <thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead> <tbody> <tr><td class="n"><a href="../">Parent Directory</a>/</td><td class="m"> </td><td class="s">- </td><td class="t">Directory</td></tr> <?php while (($fn = readdir($h)) !== FALSE) { if ($fn === '.' || $fn === '..') { continue; } $path = $this->stream->filePath . $fn; $type = is_dir($path) ? 'Directory' : Daemon::getMIME($path); ?> <tr><td class="n"><a href="<?php echo htmlspecialchars($fn) . ($type == 'Directory' ? '/' : ''); ?> "><?php echo htmlspecialchars($fn); ?> </a></td><td class="m"><?php echo date('Y-M-D H:i:s', filemtime($path)); ?> </td><td class="s"><?php echo $type === 'Directory' ? '-' : Daemon::humanSize(filesize($path)); ?> </td><td class="t"><?php echo $type; ?> </td></tr> <?php } ?> </tbody> </table> </div> <?php if (Daemon::$settings['expose']) { echo '<div class="foot">phpDaemon/' . Daemon::$version . '</div>'; } ?> </body> </html><?php $this->finish(); return; } else { $this->status(403); $this->finish(); return; } } } elseif (is_dir($this->stream->filePath)) { $this->header('Location: ' . $this->attrs->server['FR_URL'] . '/'); $this->finish(); return; } $this->header('Content-Type: ' . Daemon::getMIME($this->stream->filePath)); } $this->stream->onReadData($this->stream->fileMode ? function ($stream, $data) { $stream->request->out($data); } : function ($stream, $data) { $stream->request->combinedOut($data); })->onEOF(function ($stream) { $stream->request->finish(); })->setRequest($this)->enable(); } catch (BadStreamDescriptorException $e) { $this->status(404); $this->finish(); } catch (Exception $e) { $this->status(404); $this->finish(); } }