À la rescousse des requêtes HEAD

Il m'embêtait ce robot « facebookexternalhit » à réclamer les entêtes des miniatures générées par le module Thumbnailer d'Icybee. La méthode GET permet d'obtenir une miniature, mais point de méthode HEAD. Comme je préfère les solutions qui profitent à tout le monde, et que je n'avais pas envie d'ajouter tout un tas de routes supplémentaires, j'ai modifié le dispatcher HTTP pour qu'il tente de secourir les requêtes HEAD non implémentées.

Depuis le commit e9a169b, le dispatcher HTTP tente de secourir les requêtes HEAD dont le traitement soulève une exception NotFound. En effet, ni vu ni connu, le dispatcher clone la requête et la traite à nouveau avec cette fois la méthode GET. Si le résultat est une réponse, alors il retourne une nouvelle réponse créée à partir des entêtes du résultat. Et voilà !

Donc, s'il existe un contrôleur capable de renvoyer une réponse pour une requête GET, alors on peut en extraire les entêtes pour répondre automatiquement à une requête HEAD. Bien sûr, rien n'empêche d'ajouter un contrôleur pour traiter les requêtes HEAD soit même.

<?php

namespace ICanBoogie\HTTP;

class Dispatcher implements IDispatcher
{
    // …

    public function __invoke(Request $request)
    {
        try
        {
            return $this->dispatch($request);
        }
        catch (\Exception $e)
        {
            if ($request->method === Request::METHOD_HEAD && $e instanceof NotFound)
            {
                $get_request = clone $request;
                $get_request->method = Request::METHOD_GET;

                $response = $this($get_request);

                if (!($response instanceof Response))
                {
                    return $response;
                }

                return new Response(null, $response->status$response->headers);
            }

            return $this->rescue($e$request);
        }
    }

    // …
}

Laisser un commentaire

Pas de commentaire