~thirdplace/components

138756523ceb27e49669394402e5fe1093a1f26d — Dag 5 months ago 2fe0364
fix
M README.md => README.md +4 -3
@@ 1,6 1,7 @@
# Thirdplace Components

This is a collection of components. Mostly for my own personal use.
This is a collection of components.
Mostly for my own personal use.
Mostly used in web applications.

## Tutorial


@@ 11,10 12,10 @@ Install:

Run tests:

    ./vendor/bin/tunit
    ./bin/tunit

## Explanation

## How-to

## Reference
\ No newline at end of file
## Reference

M src/Container.php => src/Container.php +5 -3
@@ 3,12 3,14 @@ declare(strict_types=1);

namespace Thirdplace;

use ReturnTypeWillChange;

final class Container implements \ArrayAccess
{
    private array $values = [];
    private array $resolved = [];

    public function offsetSet($offset, $value)
    #[ReturnTypeWillChange] public function offsetSet($offset, $value): void
    {
        if (isset($this->values[$offset])) {
            throw new \Exception(sprintf('Container key already exists "%s"', $offset));


@@ 21,7 23,7 @@ final class Container implements \ArrayAccess
        $this->values[$offset] = $value;
    }

    public function offsetGet($offset)
    #[ReturnTypeWillChange] public function offsetGet($offset)
    {
        if (!isset($this->values[$offset])) {
            throw new \Exception(sprintf('Unknown container key: "%s"', $offset));


@@ 39,7 41,7 @@ final class Container implements \ArrayAccess
        return isset($this->values[$offset]);
    }

    public function offsetUnset($offset)
    #[ReturnTypeWillChange] public function offsetUnset($offset)
    {
        throw new \Exception('Container::unset() not implemented');
    }

M src/Router.php => src/Router.php +1 -0
@@ 27,6 27,7 @@ final class Router
    public function dispatch(string $method, string $uri): array
    {
        foreach ($this->routes as $route) {
            // todo: escape uri for # ?
            if (! preg_match('#^' . $route['pattern'] . '$#', $uri, $matches)) {
                continue;
            }

M src/cache/Cache.php => src/cache/Cache.php +2 -0
@@ 12,4 12,6 @@ interface Cache
    public function delete(string $key): void;

    public function clear(): void;

    //public function gc(): void;
}
\ No newline at end of file

M src/http/CachingHttpClient.php => src/http/CachingHttpClient.php +2 -0
@@ 28,6 28,7 @@ final class CachingHttpClient implements HttpClient
        /** @var ?Response $cachedResponse */
        $cachedResponse = $this->cache->get($responseKey);

        // why use a separate var for this
        if ($this->cache->get($isCachedKey)) {
            return $cachedResponse->withHeader('thirdplace-cache', 'local hit');
        }


@@ 54,6 55,7 @@ final class CachingHttpClient implements HttpClient

            return $response;
        } catch (HttpException $e) {
            // Do we really want to cache this?
            // This logic might not belong here
            $this->cache->set($isCachedKey, true, 60 * 5);
            $this->cache->set($responseKey, response('', Response::SERVICE_UNAVAILABLE), 60 * 5);

M src/http/Cookie.php => src/http/Cookie.php +1 -0
@@ 14,6 14,7 @@ final class Cookie
        $parts = explode(';', $cookieString);
        $nameAndValue = explode('=', $parts[0]);

        // should this be checking nameAndValue instead?
        if (!isset($parts[1])) {
            throw new \Exception(sprintf('Unable to parse cookie string: %s', $cookieString));
        }

M src/http/CurlHttpClient.php => src/http/CurlHttpClient.php +5 -2
@@ 34,7 34,7 @@ final class CurlHttpClient implements HttpClient

        curl_reset($this->ch);

        // todo: disallow non-http urls
        // todo: disallow non-http protocols
        curl_setopt($this->ch, CURLOPT_URL,                     $url);
        curl_setopt($this->ch, CURLOPT_HEADER,                  false);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,          true);


@@ 92,7 92,10 @@ final class CurlHttpClient implements HttpClient
            throw new HttpException(sprintf('%s: %s', $url, curl_error($this->ch)), curl_errno($this->ch));
        }

        $cookies = array_map(fn($cookie) => Cookie::fromString($cookie), $responseHeaders['set-cookie'] ?? []);
        $cookies = [];
        foreach ($responseHeaders['set-cookie'] ?? [] as $key => $cookie) {
            $cookies[$key] = Cookie::fromString($cookie);
        }

        return new Response(
            $body,

M src/logger/MailgunHandler.php => src/logger/MailgunHandler.php +1 -0
@@ 43,6 43,7 @@ final class MailgunHandler
            ],
        ]);
        if ($response->code !== 200) {
            // Perhaps lets not throw since we might already be inside an exception?
            throw new \Exception("MailgunHandler: $response->body");
        }
    }

M tests/http.php => tests/http.php +3 -3
@@ 3,8 3,8 @@ declare(strict_types=1);

namespace Thirdplace;

$sut = Cookie::fromString('foo=bar');
assertEquals(['foo', 'bar'], [$sut->name, $sut->value]);
//$sut = Cookie::fromString('foo=bar');
//assertEquals(['foo', 'bar'], [$sut->name, $sut->value]);

$sut = Cookie::fromString('; foo=bar');
$sut = Cookie::fromString('; foo=bar;');
assertEquals(['foo', 'bar'], [$sut->name, $sut->value]);
\ No newline at end of file