diff --git a/composer.json b/composer.json index 52c0091..da8b269 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "brettlangdon/drudge", + "name": "drudge/drudge", "description": "A simple PHP web server", "version": "0.1.0", "license": "MIT", @@ -29,7 +29,7 @@ ], "autoload": { "psr-0": { - "Brettlangdon\\Drudge\\": "src/" + "Drudge\\": "src/" } } } diff --git a/src/Brettlangdon/Drudge/Server.php b/src/Brettlangdon/Drudge/Server.php deleted file mode 100644 index 09b7972..0000000 --- a/src/Brettlangdon/Drudge/Server.php +++ /dev/null @@ -1,38 +0,0 @@ -host = $params['host']; - } - - if(array_key_exists('port', $params)){ - $this->port = intval($params['port']); - } - - $this->handler = $handler; - } - - public function run(){ - - } - - public function __destruct(){ - - } -} \ No newline at end of file diff --git a/src/Drudge/Server.php b/src/Drudge/Server.php new file mode 100644 index 0000000..b6ccb14 --- /dev/null +++ b/src/Drudge/Server.php @@ -0,0 +1,72 @@ +host = $params['host']; + } + + if(array_key_exists('port', $params)){ + $this->port = intval($params['port']); + } + + $this->handler = $handler; + } + + public function run(){ + $this->server = uv_tcp_init(); + + uv_tcp_bind($this->server, uv_ip4_addr($this->host, $this->port)); + uv_listen($this->server, 100, array($this, '_listen')); + uv_run(uv_default_loop()); + } + + private function _listen($stream){ + $client = uv_tcp_init(); + uv_accept($stream, $client); + + $this->clients[(int)$client] = $client; + + uv_read_start($client, array($this, '_read')); + } + + private function _read($client, $nread, $buffer){ + if($nread < 0){ + uv_shutdown($client, array($this, '_close')); + } else if($nread == 0){ + if(uv_last_error() == UV::EOF){ + uv_shutdown($client, array($this, '_close')); + } + } else{ + $request = new \Drudge\HTTPRequest($buffer); + $response = new \Drudge\HTTPResponse(); + + $handler = $this->handler; + $data = $handler($request, $response); + + uv_write($client, "{$response}\r\n{$data}", array($this, '_close')); + } + } + + private function _close($client){ + uv_close($client, function($client){ + unset($this->clients[(int)$client]); + }); + } +} \ No newline at end of file