%PDF- %PDF-
Direktori : /data/www_bck/varak.net_bck/ampache.varak.net/modules/React/Http/ |
Current File : //data/www_bck/varak.net_bck/ampache.varak.net/modules/React/Http/Response.php |
<?php namespace React\Http; use Evenement\EventEmitter; use React\Socket\ConnectionInterface; use React\Stream\WritableStreamInterface; class Response extends EventEmitter implements WritableStreamInterface { private $closed = false; private $writable = true; private $conn; private $headWritten = false; private $chunkedEncoding = true; public function __construct(ConnectionInterface $conn) { $this->conn = $conn; $that = $this; $this->conn->on('end', function () use ($that) { $that->close(); }); $this->conn->on('error', function ($error) use ($that) { $that->emit('error', array($error, $that)); $that->close(); }); $this->conn->on('drain', function () use ($that) { $that->emit('drain'); }); } public function isWritable() { return $this->writable; } public function writeContinue() { if ($this->headWritten) { throw new \Exception('Response head has already been written.'); } $this->conn->write("HTTP/1.1 100 Continue\r\n"); } public function writeHead($status = 200, array $headers = array()) { if ($this->headWritten) { throw new \Exception('Response head has already been written.'); } if (isset($headers['Content-Length'])) { $this->chunkedEncoding = false; } $headers = array_merge( array('X-Powered-By' => 'React/alpha'), $headers ); if ($this->chunkedEncoding) { $headers['Transfer-Encoding'] = 'chunked'; } $data = $this->formatHead($status, $headers); $this->conn->write($data); $this->headWritten = true; } private function formatHead($status, array $headers) { $status = (int) $status; $text = isset(ResponseCodes::$statusTexts[$status]) ? ResponseCodes::$statusTexts[$status] : ''; $data = "HTTP/1.1 $status $text\r\n"; foreach ($headers as $name => $value) { $name = str_replace(array("\r", "\n"), '', $name); $value = str_replace(array("\r", "\n"), '', $value); $data .= "$name: $value\r\n"; } $data .= "\r\n"; return $data; } public function write($data) { if (!$this->headWritten) { throw new \Exception('Response head has not yet been written.'); } if ($this->chunkedEncoding) { $len = strlen($data); $chunk = dechex($len)."\r\n".$data."\r\n"; $flushed = $this->conn->write($chunk); } else { $flushed = $this->conn->write($data); } return $flushed; } public function end($data = null) { if (null !== $data) { $this->write($data); } if ($this->chunkedEncoding) { $this->conn->write("0\r\n\r\n"); } $this->emit('end'); $this->removeAllListeners(); $this->conn->end(); } public function close() { if ($this->closed) { return; } $this->closed = true; $this->writable = false; $this->emit('close'); $this->removeAllListeners(); $this->conn->close(); } }