/** * Handle a single request * * @param string method request method * @param string query query string * @param [:string] headers request headers * @param string data post data * @param peer.Socket socket * @return int */ public function handleRequest($method, $query, array $headers, $data, Socket $socket) { $url = parse_url($query); $f = new File($this->docroot, strtr(preg_replace('#\\.\\./?#', '/', urldecode($url['path'])), '/', DIRECTORY_SEPARATOR)); if (!is_file($f->getURI())) { return call_user_func($this->notFound, $socket, $url['path']); } // Implement If-Modified-Since/304 Not modified $lastModified = $f->lastModified(); if ($mod = $this->header($headers, 'If-Modified-Since')) { $d = strtotime($mod); if ($lastModified <= $d) { return $this->sendHeader($socket, 304, 'Not modified', array()); } } try { $f->open(FILE_MODE_READ); } catch (IOException $e) { $this->sendErrorMessage($socket, 500, 'Internal server error', $e->getMessage()); $f->close(); return; } // Send OK header and data in 8192 byte chunks $sc = $this->sendHeader($socket, 200, 'OK', array('Last-Modified' => gmdate('D, d M Y H:i:s T', $lastModified), 'Content-Type' => MimeType::getByFileName($f->getFilename()), 'Content-Length' => $f->size())); while (!$f->eof()) { $socket->write($f->read(8192)); } $f->close(); return $sc; }
/** * Reads the whole message, applies the header information, * sets the body as a plain text (thus does not parse any * MIME-Information and returns the created Message object. * * @param string filename * @return peer.mail.Message * @throws io.IOException if file cannot be read */ protected function _readMessageRaw($filename) { $header = ''; $body = ''; $f = new File($filename); $f->open(); $d = $f->read($f->size()); $f->close(); if (false === ($hdrEnd = strpos($d, "\n\r\n\r"))) { $hdrEnd = 0; } $h = substr($c, 0, $hdrEnd); $b = substr($c, $hdrEnd); $msg = new \peer\mail\Message(); $msg->setHdrString($h); $msg->setBody($b); return $msg; }