zendframework/zend-mvc

Accept headers not satisfied in correct order by AcceptableViewModelSelector controller plugin

Wilt opened this issue · 3 comments

Wilt commented

According to the WC3 Specifictations the Server should try to satisfy accept headers in order. Currently the order of the content-types in the Accept header is not respected.

So when I send a request with an Accept header like this: application/xml, application/json it should first try to return a xml and then a json model. When I do application/json, application/xml it should be the other way around.

The AcceptableViewModelSelector controller plugin does not seem to respect the order in which content types are requested.

I reported this issue here inside Apigility module but it turned out the behavior is caused by the Zend\Mvc\Controller\Plugin\AcceptableViewModelSelector controller plugin.

Is this still an issue? I tried this test case and it passes:

    public function testZendMvcIssue16()
    {
        $arr = [
            'Zend\View\Model\JsonModel' => ['application/json'],
            'Zend\View\Model\FeedModel' => ['application/rss+xml'],
        ];

        $header   = Accept::fromString('application/rss+xml, application/json');
        $this->request->getHeaders()->addHeader($header);
        $plugin   = $this->plugin;
        $result   = $plugin($arr);

        $this->assertEquals('Zend\View\Model\ViewModel', $this->plugin->getDefaultViewModelName());

        $this->assertInstanceOf('Zend\View\Model\FeedModel', $result);
        $this->assertNotInstanceOf('Zend\View\Model\JsonModel', $result);
    }
Wilt commented

Thanks for checking this.
I am not sure since I haven't tested it for a long time.
I can see if the issue still applies, will get back on this.

This repository has been closed and moved to laminas/laminas-mvc; a new issue has been opened at laminas/laminas-mvc#37.