Skip to content

Check Status Code of responses (especially for POST/PUT/DELETE requests) #367

Description

@Art4

After requesting the Redmine server in Redmine\Api\... classes we should check for the correct status code in the responses, see #341. Otherwise we should throw an UnexpectedResponseException, see #364.

Throwing an exception would be a breaking change, so this change has to be made in a forward compatible way, or in the next major version.

A FC way could look like this:

// in \Redmine\Api\Project
    public function update($id, array $params)
    {
        // ...

        $result = $this->put(
            '/projects/' . $id . '.xml',
            XmlSerializer::createFromArray(['project' => $params])->getEncoded()
        );

        $lastResponse = $this->getLastResponse();

        if ($lastResponse->getStatusCode() !== 204) {
            if (!defined('PHP_REDMINE_API_THROW_EXCEPTIONS_ON_STATUS_CODE_MISSMATCH') || PHP_REDMINE_API_THROW_EXCEPTIONS_ON_STATUS_CODE_MISSMATCH !== true) {
                trigger_error(
                    sprintf(
                        'The Redmine server replied with the status code %d in %s(), starting with v2.0.0 this will throw an %s. Define the constant `%s` to throw the exceptions now.',
                        $lastResponse->getStatusCode(),
                        __METHOD__,
                        UnexpectedResponseException::class,
                        'PHP_REDMINE_API_THROW_EXCEPTIONS_ON_STATUS_CODE_MISSMATCH'
                    ),
                    E_USER_DEPRECATED
                );

                return $result;
            }

            throw new UnexpectedResponseException($lastResponse);
        }

        return true;
    }

In v3 we could just remove the check.

// in \Redmine\Api\Project
    public function update($id, array $params)
    {
        // ...

        $result = $this->put(
            '/projects/' . $id . '.xml',
            XmlSerializer::createFromArray(['project' => $params])->getEncoded()
        );

        $lastResponse = $this->getLastResponse();

        if ($lastResponse->getStatusCode() !== 204) {
            throw new UnexpectedResponseException($lastResponse);
        }

        return true;
    }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions