diff --git a/src/main/php/scriptlet/Run.class.php b/src/main/php/scriptlet/Run.class.php new file mode 100755 index 00000000..d0764356 --- /dev/null +++ b/src/main/php/scriptlet/Run.class.php @@ -0,0 +1,84 @@ +scriptlet= $scriptlet; + $this->scriptlet->init(); + } + + /** + * Handler + * + * @param web.Request $request + * @param web.Response $response + */ + public function handle($request, $response) { + with ($req= $this->scriptlet->request(), $res= $this->scriptlet->response()); { + $uri= $request->uri(); + $port= $uri->port() ?: -1; + + // Proxy request + $req->url= new HttpScriptletURL($uri->asString(true)); + $req->method= $request->method(); + $req->env= [ + 'SERVER_PROTOCOL' => 'HTTP/1.1', + 'REQUEST_URI' => $uri->path(true), + 'QUERY_STRING' => $uri->query(true), + 'HTTP_HOST' => $uri->host().(-1 === $port ? '' : ':'.$port) + ]; + $req->setParams($request->params()); + $req->setHeaders(array_merge($request->headers(), $request->values())); + $req->readData= function() use($request) { + return $request->read(-1); + }; + + // Proxy response + $stream= null; + $res->sendHeaders= function($version, $statusCode, $headers) use($response, &$stream) { + $response->answer($statusCode); + + foreach ($headers as $header) { + sscanf($header, "%[^:]: %[^\r]", $name, $value); + if (0 === strcasecmp('Content-Length', $name)) { + $stream= $response->stream($value); + } + $response->header($name, $value); + } + + // Fall back to chunked encoding + if (null === $stream) $stream= $response->stream(null); + }; + $res->sendContent= function($content) use(&$stream) { + $stream->write($content); + }; + + // Run scriptlet + try { + $this->scriptlet->service($req, $res); + } catch (ScriptletException $e) { + throw new Error($e->getStatus(), $e->getMessage(), $e); + } catch (Throwable $t) { + throw new InternalServerError($t); + } + + $res->isCommitted() || $res->flush(); + $res->sendContent(); + $stream->close(); + } + } +} \ No newline at end of file diff --git a/src/test/php/scriptlet/unittest/HttpSessionTest.class.php b/src/test/php/scriptlet/unittest/HttpSessionTest.class.php index 13d679da..c394514a 100755 --- a/src/test/php/scriptlet/unittest/HttpSessionTest.class.php +++ b/src/test/php/scriptlet/unittest/HttpSessionTest.class.php @@ -101,10 +101,10 @@ public function valueNames() { #[@test] public function putDoesNotOverwriteValue() { $this->session->initialize(null); - $fixture= new \lang\Object(); + $fixture= new Date(); $hash= $fixture->hashCode(); $this->session->putValue('foo', $fixture); - $this->assertInstanceOf('lang.Object', $fixture); + $this->assertInstanceOf(Date::class, $fixture); $this->assertEquals($hash, $fixture->hashCode()); }