Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

202 Accepted response does not follow jsonapi spec #13

Open
bradharmon opened this issue Dec 8, 2017 · 0 comments
Open

202 Accepted response does not follow jsonapi spec #13

bradharmon opened this issue Dec 8, 2017 · 0 comments

Comments

@bradharmon
Copy link

After creating a new document, my server responds with a "202 Accepted" response, and I get the following backtrace:

Traceback (most recent call last):
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/resourceobject.py", line 598, in commit
    return self._commit_sync(custom_url, meta)
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/resourceobject.py", line 586, in _commit_sync
    return self._post_commit(status, result, location)
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/resourceobject.py", line 575, in _post_commit
    return self.session.read(result, location, no_cache=True).resource
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/session.py", line 342, in read
    no_cache=no_cache)
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/document.py", line 61, in __init__
    super(Document, self).__init__(session, json_data)
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/common.py", line 70, in __init__
    self._handle_data(data)
  File "/export1/code/shield/jsonapi-client/src/jsonapi_client/document.py", line 92, in _handle_data
    raise ValidationError('Data or errors is needed')
jsonapi_client.exceptions.ValidationError: Data or errors is needed

Doing a little digging, the response is processed by jsonapi-client in resourceobject.py: _post_commit:

    def _post_commit(self, status, result, location):
        if status in HttpStatus.HAS_RESOURCES:
            self._update_resource(result, location)

        # If no resources are returned (which is the case when 202 (Accepted)
        # is received for PATCH, for example).
        self.mark_clean()

        if status == HttpStatus.ACCEPTED_202:
            return self.session.read(result, location, no_cache=True).resource

In this case, when a 202 is received, self.session.read creates a new Document from the response which requires a document to be sent in the http response. However the jsonapi spec does not require this:

202 Accepted

If a request to create a resource has been accepted for processing, but the processing has not been
completed by the time the server responds, the server MUST return a 202 Accepted status code.

This is as opposed to the "201 Created" response which explicitly does require a document to be returned in the body:

201 Created
...
The response MUST also include a document that contains the primary resource created.

Having said all of this, I think the code should read if status == HttpStatus.CREATED_201 which will result in returning Document.resource for 201 and NOT 202.

bradharmon pushed a commit to bradharmon/jsonapi-client that referenced this issue Dec 8, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant