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

Do not restrict +json media type suffix to application/ #5894

Merged
merged 1 commit into from
Oct 30, 2021

Conversation

scop
Copy link
Contributor

@scop scop commented Jul 18, 2021

What do these changes do?

Fix +json media type suffix handling to apply to other main types besides application/.

An example of a registered media type triggering this issue is https://www.iana.org/assignments/media-types/model/gltf+json

Are there changes in behavior for the user?

Media types with main type other than application using the '+json` suffix are accepted as JSON now.

Related issue number

Checklist

  • I think the code is well written
  • Unit tests for the changes exist
  • Documentation reflects the changes
  • If you provide code modification, please add yourself to CONTRIBUTORS.txt
    • The format is <Name> <Surname>.
    • Please keep alphabetical order, the file is sorted by names.
  • Add a new news fragment into the CHANGES folder
    • name it <issue_id>.<type> for example (588.bugfix)
    • if you don't have an issue_id change it to the pr id after creating the pr
    • ensure type is one of the following:
      • .feature: Signifying a new feature.
      • .bugfix: Signifying a bug fix.
      • .doc: Signifying a documentation improvement.
      • .removal: Signifying a deprecation or removal of public API.
      • .misc: A ticket has been closed, but it is not of interest to users.
    • Make sure to use full sentences with correct case and punctuation, for example: "Fix issue with non-ascii contents in doctest text files."

@scop scop requested a review from asvetlov as a code owner July 18, 2021 15:19
@scop scop force-pushed the json-expected-fixes branch from cbee3bf to 212cb40 Compare July 18, 2021 15:26
@psf-chronographer psf-chronographer bot added the bot:chronographer:provided There is a change note present in this PR label Jul 18, 2021
@scop scop force-pushed the json-expected-fixes branch from 212cb40 to b0eaa72 Compare July 18, 2021 15:44
@scop scop changed the title JSON expected media type matching fixes Make JSON media type suffix matching work for non-application main types Jul 18, 2021
@scop scop changed the title Make JSON media type suffix matching work for non-application main types Do not restrict +json media type suffix to application/ Jul 18, 2021
@codecov
Copy link

codecov bot commented Jul 18, 2021

Codecov Report

Merging #5894 (b0eaa72) into master (ae23fd6) will decrease coverage by 0.84%.
The diff coverage is 100.00%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #5894      +/-   ##
==========================================
- Coverage   96.75%   95.90%   -0.85%     
==========================================
  Files          44      102      +58     
  Lines        9851    31442   +21591     
  Branches     1591     3218    +1627     
==========================================
+ Hits         9531    30155   +20624     
- Misses        182     1099     +917     
- Partials      138      188      +50     
Flag Coverage Δ
unit 95.82% <100.00%> (-0.83%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
aiohttp/helpers.py 97.67% <100.00%> (+0.84%) ⬆️
tests/test_helpers.py 98.87% <100.00%> (ø)
aiohttp/client.py 77.27% <0.00%> (-16.72%) ⬇️
aiohttp/resolver.py 84.12% <0.00%> (-9.21%) ⬇️
aiohttp/http_writer.py 97.35% <0.00%> (-1.78%) ⬇️
aiohttp/connector.py 94.85% <0.00%> (-1.66%) ⬇️
aiohttp/web_app.py 97.00% <0.00%> (-0.34%) ⬇️
aiohttp/typedefs.py 100.00% <0.00%> (ø)
aiohttp/web_middlewares.py 100.00% <0.00%> (ø)
tests/test_web_request_handler.py 97.56% <0.00%> (ø)
... and 68 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update ae23fd6...b0eaa72. Read the comment docs.

@asvetlov
Copy link
Member

Sorry, I think that the PR should be rejected.
There is no guarantee that the content type like xxx/yyy+json is fully JSON compatible.

If in your particular case model/gltf+json can be processed by .json() call -- pass the content type explicitly:
await resp.json(content_type="model/gltf+json").

@scop
Copy link
Contributor Author

scop commented Oct 24, 2021

Can you cite a reference that says +json might not be JSON compatible? The suffix registration is not restricted to the application/ main type.

https://www.rfc-editor.org/rfc/rfc6839.html#section-3.1 says:

The suffix "+json" MAY be used with any media type whose representation follows that established for "application/json".

Additionally, from https://www.rfc-editor.org/rfc/rfc6839.html#section-2

At the same time, using the suffix allows receivers of the media
types to do generic processing of the underlying representation in
cases where

 they do not need to perform special handling of the particular
 semantics of the exact media type, and

 there is no special knowledge needed by such a generic processor
 in order to parse that underlying representation other than what
 would be needed to parse any example of that underlying
 representation.

This is exactly the case for aiohttp.

I think that's guarantee enough, as much as there is guarantee that anything served as application/json is JSON compatible (there is no guarantee about that either, but both that and +json are reasonable expectations).

@asvetlov
Copy link
Member

Thank you for clarification.
Let's keep the PR open until I re-read the mentioned RFC

@asvetlov asvetlov reopened this Oct 24, 2021
@asvetlov
Copy link
Member

I've changed my mind, the PR is correct.
Thanks!

@asvetlov asvetlov merged commit a82d289 into aio-libs:master Oct 30, 2021
@patchback
Copy link
Contributor

patchback bot commented Oct 30, 2021

Backport to 3.8: 💔 cherry-picking failed — conflicts found

❌ Failed to cleanly apply a82d289 on top of patchback/backports/3.8/a82d2892dbe1266f248362725be0bb338069fbf7/pr-5894

Backporting merged PR #5894 into master

  1. Ensure you have a local repo clone of your fork. Unless you cloned it
    from the upstream, this would be your origin remote.
  2. Make sure you have an upstream repo added as a remote too. In these
    instructions you'll refer to it by the name upstream. If you don't
    have it, here's how you can add it:
    $ git remote add upstream https://github.com/aio-libs/aiohttp.git
  3. Ensure you have the latest copy of upstream and prepare a branch
    that will hold the backported code:
    $ git fetch upstream
    $ git checkout -b patchback/backports/3.8/a82d2892dbe1266f248362725be0bb338069fbf7/pr-5894 upstream/3.8
  4. Now, cherry-pick PR Do not restrict +json media type suffix to application/  #5894 contents into that branch:
    $ git cherry-pick -x a82d2892dbe1266f248362725be0bb338069fbf7
    If it'll yell at you with something like fatal: Commit a82d2892dbe1266f248362725be0bb338069fbf7 is a merge but no -m option was given., add -m 1 as follows intead:
    $ git cherry-pick -m1 -x a82d2892dbe1266f248362725be0bb338069fbf7
  5. At this point, you'll probably encounter some merge conflicts. You must
    resolve them in to preserve the patch from PR Do not restrict +json media type suffix to application/  #5894 as close to the
    original as possible.
  6. Push this branch to your fork on GitHub:
    $ git push origin patchback/backports/3.8/a82d2892dbe1266f248362725be0bb338069fbf7/pr-5894
  7. Create a PR, ensure that the CI is green. If it's not — update it so that
    the tests and any other checks pass. This is it!
    Now relax and wait for the maintainers to process your pull request
    when they have some cycles to do reviews. Don't worry — they'll tell you if
    any improvements are necessary when the time comes!

🤖 @patchback
I'm built with octomachinery and
my source is open — https://github.com/sanitizers/patchback-github-app.

@aio-libs-github-bot
Copy link
Contributor

💔 Backport was not successful

The PR was attempted backported to the following branches:

  • ❌ 3.8: Commit could not be cherrypicked due to conflicts

@asvetlov
Copy link
Member

Sorry, the backporting is very hard since previous pull requests that introduced and updated json_re were not backported too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bot:chronographer:provided There is a change note present in this PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants