PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/testsuite/cookies_SUITE.erl

https://github.com/avtobiff/yaws
Erlang | 372 lines | 286 code | 54 blank | 32 comment | 0 complexity | ec01b8e88b0c226a16c47c39a9b5250e MD5 | raw file
  1. -module(cookies_SUITE).
  2. -include("testsuite.hrl").
  3. -compile(export_all).
  4. all() ->
  5. [
  6. parse_set_cookies,
  7. parse_cookies,
  8. parse_invalid_set_cookies,
  9. parse_invalid_cookies,
  10. format_cookies,
  11. get_multiple_cookies,
  12. cookie_key_case_insensitive,
  13. set_cookie_expires,
  14. real_cookies,
  15. real_setcookies,
  16. set_cookie,
  17. set_cookie_duplicates
  18. ].
  19. groups() ->
  20. [
  21. ].
  22. %%====================================================================
  23. init_per_suite(Config) ->
  24. Config.
  25. end_per_suite(_Config) ->
  26. ok.
  27. init_per_group(_Group, Config) ->
  28. Config.
  29. end_per_group(_Group, _Config) ->
  30. ok.
  31. init_per_testcase(_Test, Config) ->
  32. Config.
  33. end_per_testcase(_Test, _Config) ->
  34. ok.
  35. %%====================================================================
  36. parse_set_cookies(_Config) ->
  37. %% Set-Cookie: value
  38. ?assertEqual(
  39. #setcookie{key="value"},
  40. yaws_api:parse_set_cookie("value")
  41. ),
  42. %% Set-Cookie: name=value
  43. ?assertEqual(
  44. #setcookie{key="name", value="value"},
  45. yaws_api:parse_set_cookie("name=value")
  46. ),
  47. %% Set-Cookie: name="value [quoted]"
  48. ?assertEqual(
  49. #setcookie{key="name", value="value [quoted]", quoted=true},
  50. yaws_api:parse_set_cookie("name=\"value [quoted]\"")
  51. ),
  52. %% Set-Cookie: name=value; path=/
  53. ?assertEqual(
  54. #setcookie{key="name", value="value", path="/"},
  55. yaws_api:parse_set_cookie("name=value; Path=/")
  56. ),
  57. %% Set-Cookie: name=value; domain=test.com
  58. ?assertEqual(
  59. #setcookie{key="name", value="value", domain="test.com"},
  60. yaws_api:parse_set_cookie("name=value; Domain=test.com")
  61. ),
  62. %% Set-Cookie: name=value; max-age=86400
  63. ?assertEqual(
  64. #setcookie{key="name", value="value", max_age="86400"},
  65. yaws_api:parse_set_cookie("name=value; Max-Age=86400")
  66. ),
  67. %% Set-Cookie: name=value; expires="Sat, 02 May 2009 23:38:25 GMT"
  68. ?assertEqual(
  69. #setcookie{key="name", value="value", expires="Sat, 02 May 2009 23:38:25 GMT"},
  70. yaws_api:parse_set_cookie("name=value; Expires=Sat, 02 May 2009 23:38:25 GMT")
  71. ),
  72. %% Set-Cookie: name=value; secure
  73. ?assertEqual(
  74. #setcookie{key="name", value="value", secure=true},
  75. yaws_api:parse_set_cookie("name=value; Secure")
  76. ),
  77. %% Set-Cookie: name=value; HttpOnly
  78. ?assertEqual(
  79. #setcookie{key="name", value="value", http_only=true},
  80. yaws_api:parse_set_cookie("name=value; HttpOnly")
  81. ),
  82. %% Set-Cookie: name=value; comment="This is a comment"
  83. ?assertEqual(
  84. #setcookie{key="name", value="value",
  85. extensions=[{"comment", "This is a comment", true}]},
  86. yaws_api:parse_set_cookie("name=value; Comment=\"This is a comment\"")
  87. ),
  88. %% Set-Cookie: name=value; discard
  89. ?assertEqual(
  90. #setcookie{key="name", value="value",
  91. extensions=[{"discard", undefined, false}]},
  92. yaws_api:parse_set_cookie("name=value; discard")
  93. ),
  94. %% Set-Cookie: name=value; ext1=val1; ext2="val2"; ext3
  95. ?assertEqual(
  96. #setcookie{key="name", value="value",
  97. extensions=[{"ext1", "val1", false}, {"ext2", "val2", true},
  98. {"ext3", undefined, false}]},
  99. yaws_api:parse_set_cookie("name=value; ext1=val1; ext2=\"val2\"; ext3")
  100. ),
  101. %% Set-Cookie: value1, value2, name=value
  102. ?assertEqual(
  103. [#setcookie{key="value1"}, #setcookie{key="value2"},
  104. #setcookie{key="name", value="value"}],
  105. yaws_api:parse_set_cookie("value1 , value2, name=value")
  106. ),
  107. ok.
  108. parse_cookies(_Config) ->
  109. %% Cookie: value
  110. ?assertEqual(
  111. [#cookie{key="value"}],
  112. yaws_api:parse_cookie("value")
  113. ),
  114. %% Cookie: name=value
  115. ?assertEqual(
  116. [#cookie{key="name", value="value"}],
  117. yaws_api:parse_cookie("name=value")
  118. ),
  119. %% Cookie: name="value [quoted]"
  120. ?assertEqual(
  121. [#cookie{key="name", value="value [quoted]", quoted=true}],
  122. yaws_api:parse_cookie("name=\"value [quoted]\"")
  123. ),
  124. %% Cookie: name=value; $path=/
  125. ?assertEqual(
  126. [#cookie{key="name", value="value"},
  127. #cookie{key="$path", value="/"}],
  128. yaws_api:parse_cookie("name=value; $path=/")
  129. ),
  130. %% Cookie: name=value; $port=443
  131. ?assertEqual(
  132. [#cookie{key="name", value="value"},
  133. #cookie{key="$port", value="443"}],
  134. yaws_api:parse_cookie("name=value; $port=443")
  135. ),
  136. %% Cookie: name=value; $domain=test.com
  137. ?assertEqual(
  138. [#cookie{key="name", value="value"},
  139. #cookie{key="$domain", value="test.com"}],
  140. yaws_api:parse_cookie("name=value; $domain=test.com")
  141. ),
  142. %% Cookie: $version=1, value1, value2; name=value
  143. ?assertEqual(
  144. [#cookie{key="$version", value="1"}, #cookie{key="value1"},
  145. #cookie{key="value2"}, #cookie{key="name", value="value"}],
  146. yaws_api:parse_cookie("$version=1, value1, value2; name=value")
  147. ),
  148. %% Cookies with trailing spaces
  149. ?assertEqual(
  150. [#cookie{key="value"}],
  151. yaws_api:parse_cookie("value ")
  152. ),
  153. ?assertEqual(
  154. [#cookie{key="name", value="value"}],
  155. yaws_api:parse_cookie("name=value ")
  156. ),
  157. ?assertEqual(
  158. [#cookie{key="name", value="value"}],
  159. yaws_api:parse_cookie("name=value; ")
  160. ),
  161. ?assertEqual(
  162. [#cookie{key="name", value="value [quoted]", quoted=true}],
  163. yaws_api:parse_cookie("name=\"value [quoted]\" \n")
  164. ),
  165. ?assertEqual(
  166. [#cookie{key="$version", value="1"}, #cookie{key="value1"},
  167. #cookie{key="value2"}, #cookie{key="name", value="value"}],
  168. yaws_api:parse_cookie(" $version = 1\n , value1\t , value2\r\n; name =\n\t value ; ")
  169. ),
  170. ok.
  171. parse_invalid_set_cookies(_Config) ->
  172. ?assertEqual([], yaws_api:parse_set_cookie("name=value [quoted]")),
  173. ?assertEqual([], yaws_api:parse_set_cookie("name1=value1 name2=value2")),
  174. ?assertEqual([], yaws_api:parse_set_cookie("name1=value1 domain=test.com path=/")),
  175. ?assertEqual([], yaws_api:parse_set_cookie("name=value; secure=1")),
  176. ok.
  177. parse_invalid_cookies(_Config) ->
  178. ?assertEqual([], yaws_api:parse_cookie("name=value [quoted]")),
  179. ?assertEqual([], yaws_api:parse_cookie("name1=value1 name2=value2")),
  180. ok.
  181. format_cookies(_Config) ->
  182. %% Cookie: value
  183. ?assertEqual(
  184. "value",
  185. lists:flatten(
  186. yaws_api:format_cookie(#cookie{key="value"})
  187. )
  188. ),
  189. %% Cookie: name=value
  190. ?assertEqual(
  191. "name=value",
  192. lists:flatten(
  193. yaws_api:format_cookie(#cookie{key="name", value="value"})
  194. )
  195. ),
  196. %% Cookie: name="value [quoted]"
  197. ?assertEqual(
  198. "name=\"value [quoted]\"",
  199. lists:flatten(
  200. yaws_api:format_cookie(
  201. #cookie{key="name", value="value [quoted]", quoted=true}
  202. )
  203. )
  204. ),
  205. %% Cookie: value1; value2; name=value
  206. ?assertEqual(
  207. "value1; value2; name=value",
  208. lists:flatten(
  209. yaws_api:format_cookie([#cookie{key="value1"}, #cookie{key="value2"},
  210. #cookie{key="name", value="value"}])
  211. )
  212. ),
  213. ok.
  214. get_multiple_cookies(_Config) ->
  215. ?assertEqual("1234", yaws_api:find_cookie_val("abc", ["abc=1234;def=5678"])),
  216. ?assertEqual("5678", yaws_api:find_cookie_val("def", ["abc=1234;def=5678"])),
  217. ?assertEqual([], yaws_api:find_cookie_val("ghij", ["abc=1234;def=5678"])),
  218. ok.
  219. cookie_key_case_insensitive(_Config) ->
  220. ?assertEqual("1234", yaws_api:find_cookie_val("abc", ["abc=1234"])),
  221. ?assertEqual("1234", yaws_api:find_cookie_val("abc", ["ABC=1234"])),
  222. ?assertEqual("1234", yaws_api:find_cookie_val("AbC", ["aBc=1234"])),
  223. ok.
  224. set_cookie_expires(_Config) ->
  225. %% rfc1123 date format
  226. ?assertEqual(
  227. #setcookie{key="a", value="b", expires="Sat, 02 May 2009 23:38:25 GMT"},
  228. yaws_api:parse_set_cookie("a=b; Expires=Sat, 02 May 2009 23:38:25 GMT")
  229. ),
  230. %% rfc1123 date format with hyphens
  231. ?assertEqual(
  232. #setcookie{key="a", value="b", expires="Sat, 02-May-2009 23:38:25 GMT"},
  233. yaws_api:parse_set_cookie("a=b; Expires=Sat, 02-May-2009 23:38:25 GMT")
  234. ),
  235. %% rfc1036 date format
  236. ?assertEqual(
  237. #setcookie{key="a", value="b", expires="Saturday, 02-May-2009 23:38:25 GMT"},
  238. yaws_api:parse_set_cookie("a=b; Expires=Saturday, 02-May-2009 23:38:25 GMT")
  239. ),
  240. %% AINSI C's astime format: must be in double quotes
  241. ?assertEqual(
  242. #setcookie{key="a", value="b", expires="Sat May 2 23:38:25 2009"},
  243. yaws_api:parse_set_cookie("a=b; Expires=\"Sat May 2 23:38:25 2009\"")
  244. ),
  245. ok.
  246. real_cookies(_Config) ->
  247. File = filename:join(?data_srcdir(?MODULE), "cookies.dump"),
  248. {ok, Io} = file:open(File, read),
  249. ?assertEqual(ok, parse_cookies(Io, file:read_line(Io), 1)),
  250. ok.
  251. real_setcookies(_Config) ->
  252. File = filename:join(?data_srcdir(?MODULE), "setcookies.dump"),
  253. {ok, Io} = file:open(File, read),
  254. ?assertEqual(ok, parse_set_cookies(Io, file:read_line(Io), 1)),
  255. ok.
  256. set_cookie(_Config) ->
  257. ?assertEqual(
  258. "a=bcd; Comment=OK; Domain=g.com; Path=/; SameSite=Lax; Max-Age=1; "
  259. "Expires=Tue, 03 Jan 2012 10:00:05 GMT; HttpOnly; Secure",
  260. begin
  261. {header, {set_cookie, L}} = yaws_api:set_cookie("a", "bcd",
  262. [{expires, {{2012,1,3},{10,0,5}}},
  263. {max_age, 1}, secure, http_only, {same_site, lax},
  264. {path, "/"}, {domain, "g.com"}, {comment, "OK"}]),
  265. lists:flatten(L)
  266. end),
  267. ?assertEqual(
  268. "a=bcd; Path=/home",
  269. begin
  270. {header, {set_cookie, L}} =
  271. yaws_api:set_cookie("a", "bcd", [{path, "/home"}]),
  272. lists:flatten(L)
  273. end),
  274. ?assertEqual(
  275. "a=bcd",
  276. begin
  277. {header, {set_cookie, L}} = yaws_api:set_cookie("a", "bcd", []),
  278. lists:flatten(L)
  279. end).
  280. set_cookie_duplicates(_Config) ->
  281. Cookie = "Cookie",
  282. put(outh, #outh{}),
  283. yaws:accumulate_header({set_cookie, Cookie}),
  284. yaws:accumulate_header({"Set-Cookie", Cookie}),
  285. yaws:accumulate_header({set_cookie, {multi, [Cookie, Cookie, Cookie]}}),
  286. yaws:accumulate_header({"Set-Cookie", {multi, [Cookie, Cookie, Cookie]}}),
  287. ?assertEqual([["Set-Cookie: ", Cookie, "\r\n"]], (get(outh))#outh.set_cookie).
  288. %%====================================================================
  289. parse_cookies(Io, eof, _) ->
  290. file:close(Io),
  291. ok;
  292. parse_cookies(Io, {error, Reason}, LNo) ->
  293. file:close(Io),
  294. {error, Reason, LNo};
  295. parse_cookies(Io, {ok, Line0}, LNo) ->
  296. Line = string:strip(Line0, right, $\n),
  297. Cookies = yaws_api:parse_cookie(Line),
  298. ?assertMatch({LNo, [C|_]} when is_record(C, cookie), {LNo, Cookies}),
  299. ?assertEqual(
  300. string:to_lower(Line),
  301. string:to_lower(lists:flatten(yaws_api:format_cookie(Cookies)))
  302. ),
  303. parse_cookies(Io, file:read_line(Io), LNo+1).
  304. parse_set_cookies(Io, eof, _) ->
  305. file:close(Io),
  306. ok;
  307. parse_set_cookies(Io, {error, Reason}, LNo) ->
  308. file:close(Io),
  309. {error, Reason, LNo};
  310. parse_set_cookies(Io, {ok, Line0}, LNo) ->
  311. Line = string:strip(Line0, right, $\n),
  312. SetCookie = yaws_api:parse_set_cookie(Line),
  313. ?assertMatch({LNo, C} when is_record(C, setcookie), {LNo, SetCookie}),
  314. ?assertEqual(
  315. string:to_lower(string:substr(Line, 1, string:chr(Line, $=)-1)),
  316. SetCookie#setcookie.key
  317. ),
  318. parse_set_cookies(Io, file:read_line(Io), LNo+1).