From 54dbf057c949637869fa9e508b817c3ddee002c5 Mon Sep 17 00:00:00 2001
From: Thomas Flori <thflori@gmail.com>
Date: Thu, 2 Aug 2018 08:08:08 +0200
Subject: [PATCH] add basic functionality

---
 .gitignore            |  6 +-----
 composer.json         | 19 +++++++++++++++++++
 src/ServerRequest.php | 35 +++++++++++++++++++++++++++++++++++
 src/functions.php     | 27 +++++++++++++++++++++++++++
 4 files changed, 82 insertions(+), 5 deletions(-)
 create mode 100644 composer.json
 create mode 100644 src/ServerRequest.php
 create mode 100644 src/functions.php

diff --git a/.gitignore b/.gitignore
index a67d42b..c8153b5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,2 @@
-composer.phar
+/composer.lock
 /vendor/
-
-# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
-# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
-# composer.lock
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..19d4d9f
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,19 @@
+{
+    "name": "tflori/tal",
+    "description": "A guzzle/psr-7 wrapper to add additional functionality like sending responses and managing cookies",
+    "type": "library",
+    "license": "MIT",
+    "require": {
+        "guzzlehttp/psr7": "^1.4.2"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^7.2.7",
+        "squizlabs/php_codesniffer": "^3.3.1"
+    },
+    "autoload": {
+        "psr-4": {
+            "Tal\\": "src"
+        },
+        "files": ["src/functions.php"]
+    }
+}
diff --git a/src/ServerRequest.php b/src/ServerRequest.php
new file mode 100644
index 0000000..ab63949
--- /dev/null
+++ b/src/ServerRequest.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Tal;
+
+use GuzzleHttp\Psr7\ServerRequest as BaseServerRequest;
+
+class ServerRequest extends BaseServerRequest
+{
+    public static function fromGlobals()
+    {
+        $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
+        $headers = function_exists('getallheaders') ? getallheaders() : [];
+        $uri = self::getUriFromGlobals();
+        $body = new LazyOpenStream('php://input', 'r+');
+        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';
+
+        $serverRequest = new static($method, $uri, $headers, $body, $protocol, $_SERVER);
+
+        return $serverRequest
+            ->withCookieParams($_COOKIE)
+            ->withQueryParams($_GET)
+            ->withParsedBody($_POST)
+            ->withUploadedFiles(self::normalizeFiles($_FILES));
+    }
+
+    public function getCookie(string $name, $default = null)
+    {
+        return $this->getCookieParams()[$name] ?? $default;
+    }
+
+    public function hasCookie(string $name)
+    {
+        return isset($this->getCookieParams()[$name]);
+    }
+}
diff --git a/src/functions.php b/src/functions.php
new file mode 100644
index 0000000..5db6a33
--- /dev/null
+++ b/src/functions.php
@@ -0,0 +1,27 @@
+<?php
+
+use Psr\Http\Message\ResponseInterface;
+
+if (!function_exists('sendResponse')) {
+    function sendResponse(ResponseInterface $response)
+    {
+        $http_line = sprintf('HTTP/%s %s %s',
+            $response->getProtocolVersion(),
+            $response->getStatusCode(),
+            $response->getReasonPhrase()
+        );
+        header($http_line, true, $response->getStatusCode());
+        foreach ($response->getHeaders() as $name => $values) {
+            foreach ($values as $value) {
+                header("$name: $value", false);
+            }
+        }
+        $stream = $response->getBody();
+        if ($stream->isSeekable()) {
+            $stream->rewind();
+        }
+        while (!$stream->eof()) {
+            echo $stream->read(1024 * 8);
+        }
+    }
+}
-- 
GitLab