Fix POST argument parsing

This commit is contained in:
Lewis Dale 2024-03-12 09:42:48 +00:00
parent 4c4fffaf9d
commit 15e9d4c184
6 changed files with 38 additions and 8 deletions

BIN
db-name Normal file

Binary file not shown.

View File

@ -44,7 +44,10 @@ $router->post("/endpoint", function (Request $req, Response $response) use ($gat
$endpoint = new Endpoint(HttpClient::create(), $gateway); $endpoint = new Endpoint(HttpClient::create(), $gateway);
try { try {
$endpoint->receiveWebmention($source, $target); $id = $endpoint->receiveWebmention($source, $target);
$response->header('Location', "/webmention/" . $id);
$response->status_code = StatusCode::Created;
} catch (InvalidUrlException) { } catch (InvalidUrlException) {
$response->status_code = StatusCode::BadRequest; $response->status_code = StatusCode::BadRequest;
return "Source and target must be valid URLs"; 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"; return "Source does not mention the target";
} }
$response->status_code = StatusCode::Created;
return;
}); });
$router->get('/webmention/(\d+)', [$apiController, "get"]);
$router->get('/', fn($req, $res) => "<h1>Webmention server</h1>"); $router->get('/', fn($req, $res) => "<h1>Webmention server</h1>");
$router->get('/api/webmentions', [$apiController, "list"]); $router->get('/api/webmentions', [$apiController, "list"]);

8
requests.http Normal file
View File

@ -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/
###

View File

@ -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 // Validate that both source and target are actual domains
if (!Url::validateUrl($source) || !Url::validateUrl($target)) { if (!Url::validateUrl($source) || !Url::validateUrl($target)) {
@ -51,7 +51,7 @@ class Endpoint
$author = $this->parseAuthor($container); $author = $this->parseAuthor($container);
$webmention = new Webmention(null, $target, $source, $type, $content, $author); $webmention = new Webmention(null, $target, $source, $type, $content, $author);
$this->gateway->save($webmention); return $this->gateway->save($webmention);
} else { } else {
throw new SourceNotFoundException(); throw new SourceNotFoundException();
} }
@ -69,7 +69,7 @@ class Endpoint
private function parseMentionType(string $target, Crawler $document): MentionType 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")) { if (str_contains($class, "u-like-of")) {
return MentionType::Like; return MentionType::Like;

View File

@ -3,6 +3,7 @@
namespace Lewisdale\Webmentions\Router; namespace Lewisdale\Webmentions\Router;
class Response { class Response {
private array $headers = [];
public StatusCode $status_code = StatusCode::Ok; public StatusCode $status_code = StatusCode::Ok;
public string $body = ""; 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 { public function json(mixed $obj): string {
return json_encode($obj); return json_encode($obj);
} }
@ -26,6 +39,12 @@ class Response {
die(); 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 // * Render a template, with an array of values to provide to the template
// */ // */

View File

@ -106,7 +106,7 @@ class Router
private function respond(Response $response) private function respond(Response $response)
{ {
http_response_code($response->status_code->code()); http_response_code($response->status_code->code());
$response->write_headers();
echo $response->body; echo $response->body;
} }
@ -115,7 +115,7 @@ class Router
$uri = $_SERVER['REQUEST_URI']; $uri = $_SERVER['REQUEST_URI'];
$method = Method::from($_SERVER['REQUEST_METHOD']); $method = Method::from($_SERVER['REQUEST_METHOD']);
$query = $_GET; $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)); return new Request($params, $uri, $method, $post, $query, array_change_key_case(getallheaders(), CASE_LOWER));
} }