summaryrefslogtreecommitdiffstats
path: root/archives/extend/attachments/20140203/088e7e6a/attachment.html
blob: 4979bf48fbf82e52c876b98a699285397fa34536 (plain) (blame)
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>
&lt;div&nbsp;dir=&quot;ltr&quot;&gt;Ok,&lt;div&gt;it&nbsp;is&nbsp;more&nbsp;clear&nbsp;for&nbsp;me. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Last&nbsp;question&nbsp;I&nbsp;have&nbsp;is&nbsp;about&nbsp;content_types_provided&nbsp;function.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Is&nbsp;it&nbsp;safe&nbsp;to&nbsp;define&nbsp;it&nbsp;like&nbsp;this?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;<br>
<br>
content_types_provided(R,&nbsp;S)&nbsp;-&gt;&lt;/div&gt;&lt;div&gt; &nbsp; &lt;span&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt;ContentTypes&nbsp;=&nbsp;[{{&lt;&lt;&quot;application&quot;&gt;&gt;,&nbsp;&lt;&lt;&quot;json&quot;&gt;&gt;,&nbsp;&#39;*&#39;},&nbsp;&lt;b&gt;undefined&lt;/b&gt;}],&lt;/span&gt;&lt;/div&gt;<br>
<br>
&lt;div&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt; &nbsp; {ContentTypes,&nbsp;Req,&nbsp;State}.&lt;/div&gt;&lt;div&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt;<br>
<br>
Callback&nbsp;in&nbsp;content_types_provided&nbsp;is&nbsp;useless&nbsp;for&nbsp;POST&nbsp;requests,&nbsp;as&nbsp;it&nbsp;won’t&nbsp;be&nbsp;called. &lt;/div&gt;&lt;div&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt;Is&nbsp;it&nbsp;safe&nbsp;to&nbsp;use&nbsp;&lt;b&gt;undefined&nbsp;&lt;/b&gt;atom,&nbsp;to&nbsp;have&nbsp;a&nbsp;source&nbsp;code&nbsp;clearer?&lt;/div&gt;<br>
<br>
&lt;div&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&nbsp;style=&quot;color:rgb(0,0,0);font-family:Helvetica;font-size:13px&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&nbsp;class=&quot;gmail_extra&quot;&gt;&lt;br&gt;&lt;br&gt;&lt;div&nbsp;class=&quot;gmail_quote&quot;&gt;On&nbsp;Mon,&nbsp;Feb&nbsp;3,&nbsp;2014&nbsp;at&nbsp;7:37&nbsp;PM,&nbsp;Loïc&nbsp;Hoguin&nbsp;&lt;span&nbsp;dir=&quot;ltr&quot;&gt;&lt;&lt;a&nbsp;href=&quot;mailto:[email protected]&quot;&nbsp;target=&quot;_blank&quot;&gt;[email protected]&lt;/a&gt;&gt;&lt;/span&gt;&nbsp;wrote:&lt;br&gt;<br>
<br>
&lt;blockquote&nbsp;class=&quot;gmail_quote&quot;&nbsp;style=&quot;margin:0&nbsp;0&nbsp;0&nbsp;.8ex;border-left:1px&nbsp;#ccc&nbsp;solid;padding-left:1ex&quot;&gt;If&nbsp;Accept&nbsp;is&nbsp;sent&nbsp;and&nbsp;is&nbsp;different&nbsp;than&nbsp;text/html,&nbsp;yes.&lt;br&gt;<br>
&lt;br&gt;<br>
This&nbsp;is&nbsp;how&nbsp;HTTP&nbsp;is&nbsp;defined.&nbsp;If&nbsp;the&nbsp;client&nbsp;says&nbsp;it&nbsp;speaks&nbsp;only&nbsp;content-type&nbsp;X&nbsp;but&nbsp;you&nbsp;can&nbsp;only&nbsp;reply&nbsp;with&nbsp;content-type&nbsp;Y,&nbsp;you&nbsp;error&nbsp;out&nbsp;early&nbsp;and&nbsp;stop&nbsp;processing&nbsp;the&nbsp;request.&nbsp;On&nbsp;the&nbsp;other&nbsp;hand&nbsp;if&nbsp;the&nbsp;client&nbsp;doesn&#39;t&nbsp;say&nbsp;what&nbsp;content-type&nbsp;it&nbsp;speaks&nbsp;then&nbsp;the&nbsp;server&nbsp;can&nbsp;choose&nbsp;whichever&nbsp;one&nbsp;it&nbsp;wants.&lt;div&nbsp;class=&quot;im&quot;&gt;<br>
<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
On&nbsp;02/03/2014&nbsp;07:26&nbsp;PM,&nbsp;Łukasz&nbsp;Biedrycki&nbsp;wrote:&lt;br&gt;<br>
&lt;/div&gt;&lt;blockquote&nbsp;class=&quot;gmail_quote&quot;&nbsp;style=&quot;margin:0&nbsp;0&nbsp;0&nbsp;.8ex;border-left:1px&nbsp;#ccc&nbsp;solid;padding-left:1ex&quot;&gt;&lt;div&nbsp;class=&quot;im&quot;&gt;<br>
My&nbsp;application&nbsp;sends&nbsp;both&nbsp;headers:&nbsp;“Content-type”&nbsp;and&nbsp;“Accept”&nbsp;header&lt;br&gt;<br>
using&nbsp;POST&nbsp;method.&lt;br&gt;<br>
&lt;br&gt;<br>
For&nbsp;POST&nbsp;rest&nbsp;handler&nbsp;do&nbsp;I&nbsp;have&nbsp;to&nbsp;specify&nbsp;both:&nbsp;content_types_accepted&lt;br&gt;<br>
and&nbsp;content_types_provided&nbsp;to&nbsp;manage&nbsp;this&nbsp;kind&nbsp;of&nbsp;request?&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
On&nbsp;Mon,&nbsp;Feb&nbsp;3,&nbsp;2014&nbsp;at&nbsp;7:23&nbsp;PM,&nbsp;Loïc&nbsp;Hoguin&nbsp;&lt;&lt;a&nbsp;href=&quot;mailto:[email protected]&quot;&nbsp;target=&quot;_blank&quot;&gt;[email protected]&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&nbsp;class=&quot;h5&quot;&gt;<br>
&lt;mailto:&lt;a&nbsp;href=&quot;mailto:[email protected]&quot;&nbsp;target=&quot;_blank&quot;&gt;[email protected]&lt;/a&gt;&gt;&gt;&nbsp;wrote:&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp;The&nbsp;content-type&nbsp;provided&nbsp;is&nbsp;relevant&nbsp;for&nbsp;any&nbsp;response,&nbsp;not&nbsp;just&lt;br&gt;<br>
 &nbsp; &nbsp;responses&nbsp;to&nbsp;GET&nbsp;requests.&nbsp;It&nbsp;defaults&nbsp;to&nbsp;text/html.&nbsp;If&nbsp;your&nbsp;client&lt;br&gt;<br>
 &nbsp; &nbsp;doesn&#39;t&nbsp;send&nbsp;that&nbsp;content-type,&nbsp;you&nbsp;have&nbsp;to&nbsp;define&nbsp;the&nbsp;callback.&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp;I&nbsp;notice&nbsp;that&nbsp;the&nbsp;documentation&nbsp;is&nbsp;incorrect&nbsp;about&nbsp;the&nbsp;relevant&lt;br&gt;<br>
 &nbsp; &nbsp;methods&nbsp;for&nbsp;this&nbsp;callback,&nbsp;I&nbsp;will&nbsp;open&nbsp;a&nbsp;ticket&nbsp;to&nbsp;fix&nbsp;it&nbsp;soon.&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp;On&nbsp;02/03/2014&nbsp;07:13&nbsp;PM,&nbsp;Łukasz&nbsp;Biedrycki&nbsp;wrote:&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Hi,&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;I&nbsp;have&nbsp;a&nbsp;rest&nbsp;handler&nbsp;that&nbsp;accepts&nbsp;POST&nbsp;and&nbsp;PUT&nbsp;requests&nbsp;with&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;“application/json”&nbsp;content&nbsp;type.&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;I&nbsp;have&nbsp;content_types_accepted&nbsp;function&nbsp;defined&nbsp;as&nbsp;follows:&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;content_types_accepted(Req,&nbsp;State)&nbsp;-&gt;&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{[{‘application/json&#39;,&nbsp;from_json}],&nbsp;Req,&nbsp;State}.&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;The&nbsp;problem&nbsp;I&nbsp;have&nbsp;is&nbsp;within&nbsp;a&nbsp;request&nbsp;that&nbsp;has&nbsp;two&nbsp;headers:&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;*Content-type*:&nbsp;application/json&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;*Accept*:&nbsp;application/json&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;With&nbsp;this&nbsp;combination&nbsp;I&nbsp;receive&nbsp;*406*.&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;You&nbsp;can&nbsp;repeat&nbsp;it&nbsp;with&nbsp;test:&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;http_SUITE.erl:&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1072&nbsp;rest_postonly(Config)&nbsp;-&gt;&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1073&nbsp; &nbsp; &nbsp;Client&nbsp;=&nbsp;?config(client,&nbsp;Config),&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1074&nbsp; &nbsp; &nbsp;Headers&nbsp;=&nbsp;[&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1075&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&lt;&lt;&quot;content-type&quot;&gt;&gt;,&nbsp;&lt;&lt;&quot;text/plain&quot;&gt;&gt;},&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1076&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&lt;&lt;&quot;accept&quot;&gt;&gt;,&nbsp;&lt;&lt;&quot;text/plain&quot;&gt;&gt;}&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1077&nbsp; &nbsp; &nbsp;],&lt;br&gt;&lt;/div&gt;&lt;/div&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1078&nbsp; &nbsp; &nbsp;{ok,&nbsp;Client2}&nbsp;=&nbsp;cowboy_client:request(&lt;&lt;&quot;POST&quot;&lt;u&gt;&lt;/u&gt;__&gt;&gt;,&lt;div&nbsp;class=&quot;im&quot;&gt;&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1079&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;build_url(&quot;/postonly&quot;,&nbsp;Config),&nbsp;Headers,&nbsp;&quot;12345&quot;,&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Client),&lt;br&gt;&lt;/div&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;1080&nbsp; &nbsp; &nbsp;{ok,&nbsp;204,&nbsp;_,&nbsp;_}&nbsp;=&nbsp;cowboy_client:response(__&lt;u&gt;&lt;/u&gt;Client2).&lt;div&nbsp;class=&quot;im&quot;&gt;&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;My&nbsp;solution&nbsp;to&nbsp;that&nbsp;was&nbsp;to&nbsp;add&nbsp;a&nbsp;content_types_provided&nbsp;function:&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;content_types_provided(Req,&nbsp;State)&nbsp;-&gt;&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;ContentTypes&nbsp;=&nbsp;[{{&lt;&lt;&quot;application&quot;&gt;&gt;,&nbsp;&lt;&lt;&quot;json&quot;&gt;&gt;,&nbsp;&#39;*&#39;},&nbsp;to_json}],&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{ContentTypes,&nbsp;Req,&nbsp;State}.&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;But&nbsp;it&nbsp;is&nbsp;useless&nbsp;as&nbsp;*to_json*&nbsp;callback&nbsp;registered&nbsp;is&nbsp;not&nbsp;called&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;anyhow.&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Adding&nbsp;*content_types_provided*&nbsp;function&nbsp;is&nbsp;a&nbsp;correct&nbsp;solution&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;in&nbsp;this&nbsp;case?&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Or&nbsp;I&nbsp;am&nbsp;missing&nbsp;something&nbsp;here?&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;“Accept”&nbsp;header&nbsp;is&nbsp;not&nbsp;relevant&nbsp;only&nbsp;in&nbsp;case&nbsp;of&nbsp;GET&nbsp;requests?&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Thank&nbsp;for&nbsp;help,&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Łukasz&nbsp;Biedrycki&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;&lt;/div&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;______________________________&lt;u&gt;&lt;/u&gt;___________________&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Extend&nbsp;mailing&nbsp;list&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;a&nbsp;href=&quot;mailto:[email protected]&quot;&nbsp;target=&quot;_blank&quot;&gt;[email protected]&lt;/a&gt;&nbsp;&lt;mailto:&lt;a&nbsp;href=&quot;mailto:[email protected]&quot;&nbsp;target=&quot;_blank&quot;&gt;Extend@lists.&lt;u&gt;&lt;/u&gt;ninenines.eu&lt;/a&gt;&gt;&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;a&nbsp;href=&quot;https://lists.ninenines.eu/__listinfo/extend&quot;&nbsp;target=&quot;_blank&quot;&gt;https://lists.ninenines.eu/__&lt;u&gt;&lt;/u&gt;listinfo/extend&lt;/a&gt;&lt;div&nbsp;class=&quot;im&quot;&gt;&lt;br&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt;a&nbsp;href=&quot;https://lists.ninenines.eu/listinfo/extend&quot;&nbsp;target=&quot;_blank&quot;&gt;https://lists.ninenines.eu/&lt;u&gt;&lt;/u&gt;listinfo/extend&lt;/a&gt;&gt;&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
 &nbsp; &nbsp;--&lt;br&gt;<br>
 &nbsp; &nbsp;Loïc&nbsp;Hoguin&lt;br&gt;<br>
 &nbsp; &nbsp;&lt;a&nbsp;href=&quot;http://ninenines.eu&quot;&nbsp;target=&quot;_blank&quot;&gt;http://ninenines.eu&lt;/a&gt;&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;br&gt;<br>
&lt;/div&gt;&lt;/blockquote&gt;&lt;div&nbsp;class=&quot;HOEnZb&quot;&gt;&lt;div&nbsp;class=&quot;h5&quot;&gt;<br>
&lt;br&gt;<br>
--&nbsp;&lt;br&gt;<br>
Loïc&nbsp;Hoguin&lt;br&gt;<br>
&lt;a&nbsp;href=&quot;http://ninenines.eu&quot;&nbsp;target=&quot;_blank&quot;&gt;http://ninenines.eu&lt;/a&gt;&lt;br&gt;<br>
&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;<br>

</tt>