http icon indicating copy to clipboard operation
http copied to clipboard

New feature: Acceptable

Open c960657 opened this issue 1 year ago • 2 comments

Some servers ignore the Accept header. It usually works fine for static files, but not dynamically generated responses.

This PR adds a new feature which compares the response Content-Type header to the request Accept header and generates a synthetic 406 Not Acceptable response if they don't match.

c960657 avatar Oct 04 '24 21:10 c960657

IMO in this case it's better raise UnacceptableError. Or even make that logic configurable:

HTTP.use(acceptable: { mime_type: "...", on_mismatch: :raise })
  • mime_type - if request does not have Accept header - it will inject one
  • on_mismatch
    • :raise - fails with UnacceptableError
      • UnacceptableError#response - will contain original response
    • :rewrite_status - rewrites response with new status

ixti avatar Nov 22 '24 20:11 ixti

Sorry about my late reply. I somehow missed your comments here.

I created this PR (about the Acceptable feature) and PR #792 (about the RaiseError feature) together. My idea was that two could be used together or separately, i.e. you could achieve your suggested mix of exceptions vs. rewrite by combining these two features rather than creating one feature with a lot of options.

This doesn't support a dedicated UnacceptableError exception as you suggest, though RaiseError could easily be extended to raise specified exceptions based on the HTTP status code (e.g. NotFoundError, ForbiddenError, InternalServerErrorError etc).

What do you think of that?

c960657 avatar Feb 06 '25 17:02 c960657