From e363fcc339f1c65147a9688f9b918e6df035fac8 Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 4 Mar 2017 19:29:30 +0100 Subject: [PATCH 1/4] Initial release --- src/main/php/scriptlet/Run.class.php | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 src/main/php/scriptlet/Run.class.php diff --git a/src/main/php/scriptlet/Run.class.php b/src/main/php/scriptlet/Run.class.php new file mode 100755 index 00000000..a7fdf4d5 --- /dev/null +++ b/src/main/php/scriptlet/Run.class.php @@ -0,0 +1,63 @@ +scriptlet= $scriptlet; + $this->scriptlet->init(); + } + + public function handle($request, $response) { + with ($req= $this->scriptlet->request(), $res= $this->scriptlet->response()); { + $uri= $request->uri(); + $port= $uri->getPort(-1); + + // Proxy request + $req->url= new HttpScriptletURL($uri->getURL()); + $req->method= $request->method(); + $req->env= [ + 'SERVER_PROTOCOL' => 'HTTP/1.1', + 'REQUEST_URI' => $uri->getPath(), + 'QUERY_STRING' => $uri->getQuery(), + 'HTTP_HOST' => $uri->getHost().(-1 === $port ? '' : ':'.$port) + ]; + $req->setParams($request->params()); + $req->setHeaders(array_merge($request->headers(), $request->values())); + $req->readData= function() use($request) { + // TBI + }; + + // Proxy response + $res->sendHeaders= function($version, $statusCode, $headers) use($response) { + $response->answer($statusCode); + foreach ($headers as $header) { + sscanf($header, "%[^:]: %[^\r]", $name, $value); + $response->header($name, $value); + } + }; + $res->sendContent= function($content) use($response) { + $response->write($content); + }; + + // Run scriptlet + try { + $this->scriptlet->service($req, $res); + } catch (ScriptletException $e) { + throw new InternalServerError($e); + } + + $res->isCommitted() || $res->flush(); + $res->sendContent(); + } + } +} \ No newline at end of file From 02560d315b4e027928e47bb219e547f19135b178 Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 11 Nov 2017 16:07:46 +0100 Subject: [PATCH 2/4] Fix "Class `lang\Object` not found" --- src/test/php/scriptlet/unittest/HttpSessionTest.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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()); } From 41a433a7b65953fbc31f4b6a5778af8bd37c6040 Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 11 Nov 2017 17:03:12 +0100 Subject: [PATCH 3/4] Adjust to xp-forge/web using util.URI --- src/main/php/scriptlet/Run.class.php | 38 +++++++++++++++++++++------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/main/php/scriptlet/Run.class.php b/src/main/php/scriptlet/Run.class.php index a7fdf4d5..5cceda34 100755 --- a/src/main/php/scriptlet/Run.class.php +++ b/src/main/php/scriptlet/Run.class.php @@ -1,5 +1,9 @@ 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->getPort(-1); + $port= $uri->port() ?: -1; // Proxy request - $req->url= new HttpScriptletURL($uri->getURL()); + $req->url= new HttpScriptletURL($uri->asString(true)); $req->method= $request->method(); $req->env= [ 'SERVER_PROTOCOL' => 'HTTP/1.1', - 'REQUEST_URI' => $uri->getPath(), - 'QUERY_STRING' => $uri->getQuery(), - 'HTTP_HOST' => $uri->getHost().(-1 === $port ? '' : ':'.$port) + '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())); @@ -38,26 +48,36 @@ public function handle($request, $response) { }; // Proxy response - $res->sendHeaders= function($version, $statusCode, $headers) use($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($response) { - $response->write($content); + $res->sendContent= function($content) use(&$stream) { + $stream->write($content); }; // Run scriptlet try { $this->scriptlet->service($req, $res); } catch (ScriptletException $e) { - throw new InternalServerError($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 From aedc08a37637256fb739c5b7909fc7a73c73ac1d Mon Sep 17 00:00:00 2001 From: Timm Friebe Date: Sat, 11 Nov 2017 21:57:08 +0100 Subject: [PATCH 4/4] Implement reading --- src/main/php/scriptlet/Run.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/php/scriptlet/Run.class.php b/src/main/php/scriptlet/Run.class.php index 5cceda34..d0764356 100755 --- a/src/main/php/scriptlet/Run.class.php +++ b/src/main/php/scriptlet/Run.class.php @@ -44,13 +44,14 @@ public function handle($request, $response) { $req->setParams($request->params()); $req->setHeaders(array_merge($request->headers(), $request->values())); $req->readData= function() use($request) { - // TBI + 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)) {