api-platform icon indicating copy to clipboard operation
api-platform copied to clipboard

Allow dot in IRI

Open sebblanc opened this issue 5 years ago • 2 comments

Description
It is currently not possible to have a dot "." in an IRI. Effectively, posting a resource containg a dot in its id would lead to the following error : "Unable to generate an IRI for "MyClass", triggered into api-platform/core/src/Bridge/Symfony/Routing/IriConverter.php line 155".

Behind the scene it is an error from symfony/routing/Generator/UrlGenerator.php line 193 : Parameter "id" for route "my_route_get_item" must match "[^/.]++" ("iri.withdot" given) to generate a corresponding URL.

It seems to me that it should be allowed to have a dot in an IRI as it's not part of the reserved URI characters.

How to reproduce
Try to post a resource (Entity, DTO) with an id containing a dot.

Possible Solution
For POST operations : change in api-platform/core/src/Bridge/Symfony/Routing/Router.php, the generate() method for

    public function generate($name, $parameters = [], $referenceType = self::ABS_PATH)
    {
        // Disable strict_requirements to allow dot in IRIs
        $this->router->setOption('strict_requirements', false);
        return $this->router->generate($name, $parameters, self::CONST_MAP[$referenceType]);
    }

Additional Context
Allowing a dot in IRIs would lead to troubles with GET operations as an IRI like "a.b" would lead to the following error : Format "b" is not supported. Effectively, b would be considered to be the format. In this case, maybe it could be possible to specify the format in a Accept header only.

sebblanc avatar Jun 10 '20 19:06 sebblanc

Additionnal informations pleading for the support of the . character : . is indeed a valid character according to RFC 3986 RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax

tomsihap avatar Jan 19 '21 17:01 tomsihap

I too would like to see a dot (period) supported. I have an entity MediaType which has a surrogate ID and contains all the media types per https://www.iana.org/assignments/media-types/media-types.xhtml. Originally, I tried to make the identifier the full name (application/index.cmd), but had issues with the forward slash (however, adding 'requirements' => ['identifier' => '.+'] helps. Ended up changing to a composite identifier (type/subtype) and it works fine until I have a period in the subtype.

NotionCommotion avatar Jan 21 '22 16:01 NotionCommotion