From 15e9d4c184e500c8afb3ec29a37f7d9805851d39 Mon Sep 17 00:00:00 2001 From: Lewis Dale Date: Tue, 12 Mar 2024 09:42:48 +0000 Subject: [PATCH] Fix POST argument parsing --- db-name | Bin 0 -> 40960 bytes index.php | 9 ++++++--- requests.http | 8 ++++++++ src/Endpoint.php | 6 +++--- src/Router/Response.php | 19 +++++++++++++++++++ src/Router/Router.php | 4 ++-- 6 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 db-name create mode 100644 requests.http diff --git a/db-name b/db-name new file mode 100644 index 0000000000000000000000000000000000000000..40731fe6343eeba75597083aec7dfa18df3de14a GIT binary patch literal 40960 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"/endpoint", function (Request $req, Response $response) use ($gat $endpoint = new Endpoint(HttpClient::create(), $gateway); try { - $endpoint->receiveWebmention($source, $target); + $id = $endpoint->receiveWebmention($source, $target); + + $response->header('Location', "/webmention/" . $id); + $response->status_code = StatusCode::Created; } catch (InvalidUrlException) { $response->status_code = StatusCode::BadRequest; return "Source and target must be valid URLs"; @@ -59,10 +62,10 @@ $router->post("/endpoint", function (Request $req, Response $response) use ($gat return "Source does not mention the target"; } - $response->status_code = StatusCode::Created; - return; }); +$router->get('/webmention/(\d+)', [$apiController, "get"]); + $router->get('/', fn($req, $res) => "

Webmention server

"); $router->get('/api/webmentions', [$apiController, "list"]); diff --git a/requests.http b/requests.http new file mode 100644 index 0000000..e01dd20 --- /dev/null +++ b/requests.http @@ -0,0 +1,8 @@ +POST http://localhost:8080/endpoint +Content-Type: application/x-www-form-urlencoded + +source = https://rknight.me/blog/generating-and-caching-open-graph-images-with-eleventy/ & +target = https://lewisdale.dev/post/adding-statically-generated-open-graph-images/ + + +### diff --git a/src/Endpoint.php b/src/Endpoint.php index 9966a46..e5df51c 100644 --- a/src/Endpoint.php +++ b/src/Endpoint.php @@ -23,7 +23,7 @@ class Endpoint { } - public function receiveWebmention(string $source, string $target): void + public function receiveWebmention(string $source, string $target): int { // Validate that both source and target are actual domains if (!Url::validateUrl($source) || !Url::validateUrl($target)) { @@ -51,7 +51,7 @@ class Endpoint $author = $this->parseAuthor($container); $webmention = new Webmention(null, $target, $source, $type, $content, $author); - $this->gateway->save($webmention); + return $this->gateway->save($webmention); } else { throw new SourceNotFoundException(); } @@ -69,7 +69,7 @@ class Endpoint private function parseMentionType(string $target, Crawler $document): MentionType { - $class = $document->filter('a[href="' . $target . '"]')->attr('class'); + $class = $document->filter('a[href="' . $target . '"]')->attr('class') ?? ''; if (str_contains($class, "u-like-of")) { return MentionType::Like; diff --git a/src/Router/Response.php b/src/Router/Response.php index 3570f48..86661fc 100644 --- a/src/Router/Response.php +++ b/src/Router/Response.php @@ -3,6 +3,7 @@ namespace Lewisdale\Webmentions\Router; class Response { + private array $headers = []; public StatusCode $status_code = StatusCode::Ok; public string $body = ""; @@ -10,6 +11,18 @@ class Response { { } + private function normalize_header_name(string $name): string + { + return ucwords(strtolower($name)); + } + + public function header(string $name, string $value): void + { + $normalised = $this->normalize_header_name($name); + echo $normalised; + $this->headers[$this->normalize_header_name($name)] = $value; + } + public function json(mixed $obj): string { return json_encode($obj); } @@ -26,6 +39,12 @@ class Response { die(); } + public function write_headers() { + foreach ($this->headers as $header => $value) { + header("$header: $value"); + } + } + // /** // * Render a template, with an array of values to provide to the template // */ diff --git a/src/Router/Router.php b/src/Router/Router.php index 1e6498f..46895ce 100644 --- a/src/Router/Router.php +++ b/src/Router/Router.php @@ -106,7 +106,7 @@ class Router private function respond(Response $response) { http_response_code($response->status_code->code()); - + $response->write_headers(); echo $response->body; } @@ -115,7 +115,7 @@ class Router $uri = $_SERVER['REQUEST_URI']; $method = Method::from($_SERVER['REQUEST_METHOD']); $query = $_GET; - $post = $_POST; + $post = json_decode(file_get_contents('php://input'), true); return new Request($params, $uri, $method, $post, $query, array_change_key_case(getallheaders(), CASE_LOWER)); }