1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
<tt>
<div dir="ltr">Ok,<div>it is more clear for me. </div><div><br></div><div>Last question I have is about content_types_provided function.</div><div><br></div><div>Is it safe to define it like this?</div><div><br></div><div><br>
<br>
content_types_provided(R, S) -></div><div> <span style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px">ContentTypes = [{{<<"application">>, <<"json">>, '*'}, <b>undefined</b>}],</span></div><br>
<br>
<div style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px"> {ContentTypes, Req, State}.</div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px"><br>
<br>
Callback in content_types_provided is useless for POST requests, as it won’t be called. </div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px">Is it safe to use <b>undefined </b>atom, to have a source code clearer?</div><br>
<br>
<div style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px"><br></div><div style="color:rgb(0,0,0);font-family:Helvetica;font-size:13px"><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Feb 3, 2014 at 7:37 PM, Loïc Hoguin <span dir="ltr"><<a href="mailto:[email protected]" target="_blank">[email protected]</a>></span> wrote:<br><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If Accept is sent and is different than text/html, yes.<br><br>
<br><br>
This is how HTTP is defined. If the client says it speaks only content-type X but you can only reply with content-type Y, you error out early and stop processing the request. On the other hand if the client doesn't say what content-type it speaks then the server can choose whichever one it wants.<div class="im"><br>
<br>
<br><br>
<br><br>
On 02/03/2014 07:26 PM, Łukasz Biedrycki wrote:<br><br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><br>
My application sends both headers: “Content-type” and “Accept” header<br><br>
using POST method.<br><br>
<br><br>
For POST rest handler do I have to specify both: content_types_accepted<br><br>
and content_types_provided to manage this kind of request?<br><br>
<br><br>
<br><br>
On Mon, Feb 3, 2014 at 7:23 PM, Loïc Hoguin <<a href="mailto:[email protected]" target="_blank">[email protected]</a><br></div><div><div class="h5"><br>
<mailto:<a href="mailto:[email protected]" target="_blank">[email protected]</a>>> wrote:<br><br>
<br><br>
The content-type provided is relevant for any response, not just<br><br>
responses to GET requests. It defaults to text/html. If your client<br><br>
doesn't send that content-type, you have to define the callback.<br><br>
<br><br>
I notice that the documentation is incorrect about the relevant<br><br>
methods for this callback, I will open a ticket to fix it soon.<br><br>
<br><br>
<br><br>
On 02/03/2014 07:13 PM, Łukasz Biedrycki wrote:<br><br>
<br><br>
Hi,<br><br>
I have a rest handler that accepts POST and PUT requests with<br><br>
“application/json” content type.<br><br>
<br><br>
I have content_types_accepted function defined as follows:<br><br>
<br><br>
content_types_accepted(Req, State) -><br><br>
<br><br>
<br><br>
{[{‘application/json', from_json}], Req, State}.<br><br>
<br><br>
<br><br>
<br><br>
The problem I have is within a request that has two headers:<br><br>
<br><br>
*Content-type*: application/json<br><br>
*Accept*: application/json<br><br>
<br><br>
With this combination I receive *406*.<br><br>
<br><br>
<br><br>
You can repeat it with test:<br><br>
<br><br>
http_SUITE.erl:<br><br>
1072 rest_postonly(Config) -><br><br>
1073 Client = ?config(client, Config),<br><br>
1074 Headers = [<br><br>
1075 {<<"content-type">>, <<"text/plain">>},<br><br>
1076 {<<"accept">>, <<"text/plain">>}<br><br>
1077 ],<br></div></div><br>
1078 {ok, Client2} = cowboy_client:request(<<"POST"<u></u>__>>,<div class="im"><br><br>
1079 build_url("/postonly", Config), Headers, "12345",<br><br>
Client),<br></div><br>
1080 {ok, 204, _, _} = cowboy_client:response(__<u></u>Client2).<div class="im"><br><br>
<br><br>
My solution to that was to add a content_types_provided function:<br><br>
<br><br>
<br><br>
content_types_provided(Req, State) -><br><br>
<br><br>
<br><br>
ContentTypes = [{{<<"application">>, <<"json">>, '*'}, to_json}],<br><br>
<br><br>
<br><br>
{ContentTypes, Req, State}.<br><br>
<br><br>
<br><br>
<br><br>
But it is useless as *to_json* callback registered is not called<br><br>
anyhow.<br><br>
<br><br>
Adding *content_types_provided* function is a correct solution<br><br>
in this case?<br><br>
<br><br>
Or I am missing something here?<br><br>
“Accept” header is not relevant only in case of GET requests?<br><br>
<br><br>
Thank for help,<br><br>
Łukasz Biedrycki<br><br>
<br><br>
<br></div><br>
______________________________<u></u>___________________<br><br>
Extend mailing list<br><br>
<a href="mailto:[email protected]" target="_blank">[email protected]</a> <mailto:<a href="mailto:[email protected]" target="_blank">Extend@lists.<u></u>ninenines.eu</a>><br><br>
<a href="https://lists.ninenines.eu/__listinfo/extend" target="_blank">https://lists.ninenines.eu/__<u></u>listinfo/extend</a><div class="im"><br><br>
<<a href="https://lists.ninenines.eu/listinfo/extend" target="_blank">https://lists.ninenines.eu/<u></u>listinfo/extend</a>><br><br>
<br><br>
<br><br>
--<br><br>
Loïc Hoguin<br><br>
<a href="http://ninenines.eu" target="_blank">http://ninenines.eu</a><br><br>
<br><br>
<br><br>
</div></blockquote><div class="HOEnZb"><div class="h5"><br>
<br><br>
-- <br><br>
Loïc Hoguin<br><br>
<a href="http://ninenines.eu" target="_blank">http://ninenines.eu</a><br><br>
</div></div></blockquote></div><br></div><br>
</tt>
|