| 1 | import net.http |
| 2 | |
| 3 | struct SetCookieTestCase { |
| 4 | cookie &http.Cookie |
| 5 | raw string |
| 6 | } |
| 7 | |
| 8 | struct ReadSetCookiesTestCase { |
| 9 | header map[string][]string |
| 10 | cookies []&http.Cookie |
| 11 | } |
| 12 | |
| 13 | struct AddCookieTestCase { |
| 14 | cookie []&http.Cookie |
| 15 | raw string |
| 16 | } |
| 17 | |
| 18 | const write_set_cookie_tests = [ |
| 19 | SetCookieTestCase{ |
| 20 | cookie: &http.Cookie{ |
| 21 | name: 'cookie-1' |
| 22 | value: 'v1' |
| 23 | } |
| 24 | raw: 'cookie-1=v1' |
| 25 | }, |
| 26 | SetCookieTestCase{ |
| 27 | cookie: &http.Cookie{ |
| 28 | name: 'cookie-2' |
| 29 | value: 'two' |
| 30 | max_age: 3600 |
| 31 | } |
| 32 | raw: 'cookie-2=two; Max-Age=3600' |
| 33 | }, |
| 34 | SetCookieTestCase{ |
| 35 | cookie: &http.Cookie{ |
| 36 | name: 'cookie-3' |
| 37 | value: 'three' |
| 38 | domain: '.example.com' |
| 39 | } |
| 40 | raw: 'cookie-3=three; domain=example.com' |
| 41 | }, |
| 42 | SetCookieTestCase{ |
| 43 | cookie: &http.Cookie{ |
| 44 | name: 'cookie-4' |
| 45 | value: 'four' |
| 46 | path: '/restricted/' |
| 47 | } |
| 48 | raw: 'cookie-4=four; path=/restricted/' |
| 49 | }, |
| 50 | SetCookieTestCase{ |
| 51 | cookie: &http.Cookie{ |
| 52 | name: 'cookie-5' |
| 53 | value: 'five' |
| 54 | domain: 'wrong;bad.abc' |
| 55 | } |
| 56 | raw: 'cookie-5=five' |
| 57 | }, |
| 58 | SetCookieTestCase{ |
| 59 | cookie: &http.Cookie{ |
| 60 | name: 'cookie-6' |
| 61 | value: 'six' |
| 62 | domain: 'bad-.abc' |
| 63 | } |
| 64 | raw: 'cookie-6=six' |
| 65 | }, |
| 66 | // SetCookieTestCase{ |
| 67 | // cookie: &http.Cookie{name: 'cookie-7', value: 'seven', domain: '127.0.0.1'}, |
| 68 | // raw: 'cookie-7=seven; domain=127.0.0.1' |
| 69 | // }, |
| 70 | SetCookieTestCase{ |
| 71 | cookie: &http.Cookie{ |
| 72 | name: 'cookie-8' |
| 73 | value: 'eight' |
| 74 | domain: '::1' |
| 75 | } |
| 76 | raw: 'cookie-8=eight' |
| 77 | }, |
| 78 | // { |
| 79 | // cookie: &http.Cookie{name: 'cookie-9', value: 'expiring', expires: time.unix(1257894000, 0)}, |
| 80 | // 'cookie-9=expiring; Expires=Tue, 10 Nov 2009 23:00:00 GMT', |
| 81 | // }, |
| 82 | // According to IETF 6265 Section 5.1.1.5, the year cannot be less than 1601 |
| 83 | // SetCookieTestCase{ |
| 84 | // cookie: &http.Cookie{name: 'cookie-10', value: 'expiring-1601', expires: time.parse('Mon, 01 Jan 1601 01:01:01 GMT')}, |
| 85 | // raw: 'cookie-10=expiring-1601; Expires=Mon, 01 Jan 1601 01:01:01 GMT' |
| 86 | // }, |
| 87 | // SetCookieTestCase{ |
| 88 | // cookie: &http.Cookie{name: 'cookie-11', value: 'invalid-expiry', expires: time.parse('Mon, 01 Jan 1600 01:01:01 GMT')}, |
| 89 | // raw: 'cookie-11=invalid-expiry' |
| 90 | // }, |
| 91 | SetCookieTestCase{ |
| 92 | cookie: &http.Cookie{ |
| 93 | name: 'cookie-12' |
| 94 | value: 'samesite-default' |
| 95 | same_site: .same_site_default_mode |
| 96 | } |
| 97 | raw: 'cookie-12=samesite-default; SameSite' |
| 98 | }, |
| 99 | SetCookieTestCase{ |
| 100 | cookie: &http.Cookie{ |
| 101 | name: 'cookie-13' |
| 102 | value: 'samesite-lax' |
| 103 | same_site: .same_site_lax_mode |
| 104 | } |
| 105 | raw: 'cookie-13=samesite-lax; SameSite=Lax' |
| 106 | }, |
| 107 | SetCookieTestCase{ |
| 108 | cookie: &http.Cookie{ |
| 109 | name: 'cookie-14' |
| 110 | value: 'samesite-strict' |
| 111 | same_site: .same_site_strict_mode |
| 112 | } |
| 113 | raw: 'cookie-14=samesite-strict; SameSite=Strict' |
| 114 | }, |
| 115 | SetCookieTestCase{ |
| 116 | cookie: &http.Cookie{ |
| 117 | name: 'cookie-15' |
| 118 | value: 'samesite-none' |
| 119 | same_site: .same_site_none_mode |
| 120 | } |
| 121 | raw: 'cookie-15=samesite-none; SameSite=None' |
| 122 | }, |
| 123 | // The 'special' cookies have values containing commas or spaces which |
| 124 | // are disallowed by RFC 6265 but are common in the wild. |
| 125 | SetCookieTestCase{ |
| 126 | cookie: &http.Cookie{ |
| 127 | name: 'special-1' |
| 128 | value: 'a z' |
| 129 | } |
| 130 | raw: 'special-1=a z' |
| 131 | }, |
| 132 | SetCookieTestCase{ |
| 133 | cookie: &http.Cookie{ |
| 134 | name: 'special-2' |
| 135 | value: ' z' |
| 136 | } |
| 137 | raw: 'special-2=" z"' |
| 138 | }, |
| 139 | SetCookieTestCase{ |
| 140 | cookie: &http.Cookie{ |
| 141 | name: 'special-3' |
| 142 | value: 'a ' |
| 143 | } |
| 144 | raw: 'special-3="a "' |
| 145 | }, |
| 146 | SetCookieTestCase{ |
| 147 | cookie: &http.Cookie{ |
| 148 | name: 'special-4' |
| 149 | value: ' ' |
| 150 | } |
| 151 | raw: 'special-4=" "' |
| 152 | }, |
| 153 | SetCookieTestCase{ |
| 154 | cookie: &http.Cookie{ |
| 155 | name: 'special-5' |
| 156 | value: 'a,z' |
| 157 | } |
| 158 | raw: 'special-5=a,z' |
| 159 | }, |
| 160 | SetCookieTestCase{ |
| 161 | cookie: &http.Cookie{ |
| 162 | name: 'special-6' |
| 163 | value: ',z' |
| 164 | } |
| 165 | raw: 'special-6=",z"' |
| 166 | }, |
| 167 | SetCookieTestCase{ |
| 168 | cookie: &http.Cookie{ |
| 169 | name: 'special-7' |
| 170 | value: 'a,' |
| 171 | } |
| 172 | raw: 'special-7="a,"' |
| 173 | }, |
| 174 | SetCookieTestCase{ |
| 175 | cookie: &http.Cookie{ |
| 176 | name: 'special-8' |
| 177 | value: ',' |
| 178 | } |
| 179 | raw: 'special-8=","' |
| 180 | }, |
| 181 | SetCookieTestCase{ |
| 182 | cookie: &http.Cookie{ |
| 183 | name: 'empty-value' |
| 184 | value: '' |
| 185 | } |
| 186 | raw: 'empty-value=' |
| 187 | }, |
| 188 | SetCookieTestCase{ |
| 189 | cookie: &http.Cookie{ |
| 190 | name: '' |
| 191 | } |
| 192 | raw: '' |
| 193 | }, |
| 194 | SetCookieTestCase{ |
| 195 | cookie: &http.Cookie{ |
| 196 | name: '\t' |
| 197 | } |
| 198 | raw: '' |
| 199 | }, |
| 200 | SetCookieTestCase{ |
| 201 | cookie: &http.Cookie{ |
| 202 | name: '\r' |
| 203 | } |
| 204 | raw: '' |
| 205 | }, |
| 206 | SetCookieTestCase{ |
| 207 | cookie: &http.Cookie{ |
| 208 | name: 'a\nb' |
| 209 | value: 'v' |
| 210 | } |
| 211 | raw: '' |
| 212 | }, |
| 213 | SetCookieTestCase{ |
| 214 | cookie: &http.Cookie{ |
| 215 | name: 'a\nb' |
| 216 | value: 'v' |
| 217 | } |
| 218 | raw: '' |
| 219 | }, |
| 220 | SetCookieTestCase{ |
| 221 | cookie: &http.Cookie{ |
| 222 | name: 'a\rb' |
| 223 | value: 'v' |
| 224 | } |
| 225 | raw: '' |
| 226 | }, |
| 227 | SetCookieTestCase{ |
| 228 | cookie: &http.Cookie{ |
| 229 | name: 'complex-value' |
| 230 | value: 'a b,c;d' |
| 231 | } |
| 232 | raw: 'complex-value="a b,c;d"' |
| 233 | }, |
| 234 | ] |
| 235 | const add_cookies_tests = [ |
| 236 | AddCookieTestCase{ |
| 237 | cookie: [] |
| 238 | raw: '' |
| 239 | }, |
| 240 | AddCookieTestCase{ |
| 241 | cookie: [&http.Cookie{ |
| 242 | name: 'cookie-1' |
| 243 | value: 'v1' |
| 244 | }] |
| 245 | raw: 'cookie-1=v1' |
| 246 | }, |
| 247 | AddCookieTestCase{ |
| 248 | cookie: [&http.Cookie{ |
| 249 | name: 'cookie-1' |
| 250 | value: 'v1' |
| 251 | }, &http.Cookie{ |
| 252 | name: 'cookie-2' |
| 253 | value: 'v2' |
| 254 | }, |
| 255 | &http.Cookie{ |
| 256 | name: 'cookie-3' |
| 257 | value: 'v3' |
| 258 | }] |
| 259 | raw: 'cookie-1=v1; cookie-2=v2; cookie-3=v3' |
| 260 | }, |
| 261 | ] |
| 262 | |
| 263 | fn test_write_set_cookies() { |
| 264 | for _, tt in write_set_cookie_tests { |
| 265 | assert tt.cookie.str() == tt.raw |
| 266 | } |
| 267 | } |
| 268 | |