Comments (6)
If you don't provide content then doing a GET request will always fail, so I'm not sure what you are trying to say. What is the expected response?
Cowboy does handle the case where accept isn't defined when content is provided. https://github.com/ninenines/cowboy/blob/master/src/cowboy_rest.erl#L476-L486
Content negotiation is also useful for other methods. For example if you return a body following a POST request, it can tell you which content type to use.
The only cases where we don't care about content negotiation is when the resource never returns a body. In that case simply do not implement content_types_provided
. Returning []
is for explicitly rejecting the request, for example if you apply additional heuristics on top of what Cowboy is doing.
from cowboy.
Imagine an endpoint where:
allowed_methods(Req, State) ->
{[<<"OPTIONS">>, <<"HEAD">>, <<"GET">>, <<"POST">>, <<"DELETE">>], Req, State}.
and where only the GET
method should send a content, whereas POST
and DELETE
should return 204, ideally we should be able to define content_types_provided
as:
content_types_provided(#{method := <<"GET">>} = Req, State) ->
{[
{<<"application/json">>, to_json}
], Req, State};
content_types_provided(Req, State) ->
{[], Req, State}.
However, this doesn't work, because the current cowboy_rest
logic is tied to the fact that content_types_provided
and doesn't handle the case where content_types_provided
but returns the empty list.
from cowboy.
You don't need to go that far, you can just do:
content_types_provided(Req, State) ->
{[
{<<"application/json">>, to_json}
], Req, State}.
from cowboy.
I still think that implementing content_types_provided/2
and returning the []
(1) should be equivalent to not implementing it (2).
The current implementation handles (1) as reject all requests with 406, whereas (2) only returns 406
if the client actually sends an Accept
header.
I suggest changing the implementation such as (1) and (2) are equivalent. Effectively handling the case where the client doesn't send any Accept
header.
from cowboy.
They can't be equivalent because when the callback is not implemented it is equivalent to returning [{<<"text/html">>, to_html}]
.
If you need to have the equivalent you need to return this and not just []
.
from cowboy.
https://github.com/ninenines/cowboy/blob/master/src/cowboy_rest.erl#L456
from cowboy.
Related Issues (20)
- Docs for `cowboy_stream` module include broken links HOT 2
- Reject responses that have explicit set-cookie HOT 7
- gunsmoke = gun + cowboy + tls + websocket HOT 3
- when use cowboy:start_tls can not connect HOT 7
- cowboy_clear's protocols option
- Document range requests in cowboy_rest and cowboy_static HOT 1
- 2.10 Getting Started: Makefile issue -- No rule to make target 'run' HOT 2
- Rewrite ws_autobahn to no longer use autobahn-testsuite HOT 2
- I want to use Cowboy 2.11's Websocket over HTTP/2 feature, How do I configure nginx HOT 2
- Apply routing constraint to […] bind? HOT 3
- Is cowboy affected by CVE-2023-46118 ? HOT 1
- Cookie Flexiblity HOT 2
- Response cookies must be set using cowboy_req HOT 1
- HTTP/2: to many stream window size updates after connection window size update HOT 3
- Use async cancel_timer where applicable HOT 1
- Adding metadata/labels to a route? HOT 2
- which erlang version is supported? HOT 1
- Fix introduction supported OTP versions
- Add `licenses` to `.app` for `rebar3_sbom` HOT 11
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cowboy.