| 289 | } |
| 290 | |
| 291 | void SC::HttpURLParserTest::testQueryParams() |
| 292 | { |
| 293 | HttpURLParser urlParser; |
| 294 | StringSpan value; |
| 295 | |
| 296 | // Multiple query parameters |
| 297 | SC_TEST_EXPECT(urlParser.parse("http://example.com/path?key1=value1&key2=value2&key3=value3")); |
| 298 | SC_TEST_EXPECT(urlParser.search == "?key1=value1&key2=value2&key3=value3"); |
| 299 | SC_TEST_EXPECT(urlParser.getQueryValue("key2", value)); |
| 300 | SC_TEST_EXPECT(value == "value2"); |
| 301 | SC_TEST_EXPECT(HttpURLParser::getQueryValue("key1=value1&key2=value2", "key1", value)); |
| 302 | SC_TEST_EXPECT(value == "value1"); |
| 303 | |
| 304 | // Query parameter with empty value |
| 305 | SC_TEST_EXPECT(urlParser.parse("http://example.com/path?empty=&key=value")); |
| 306 | SC_TEST_EXPECT(urlParser.search == "?empty=&key=value"); |
| 307 | SC_TEST_EXPECT(urlParser.getQueryValue("empty", value)); |
| 308 | SC_TEST_EXPECT(value.isEmpty()); |
| 309 | |
| 310 | // Query parameter with no value |
| 311 | SC_TEST_EXPECT(urlParser.parse("http://example.com/path?flag&key=value")); |
| 312 | SC_TEST_EXPECT(urlParser.search == "?flag&key=value"); |
| 313 | SC_TEST_EXPECT(urlParser.getQueryValue("flag", value)); |
| 314 | SC_TEST_EXPECT(value.isEmpty()); |
| 315 | |
| 316 | // Only query parameters, no path |
| 317 | SC_TEST_EXPECT(urlParser.parse("http://example.com?query=value")); |
| 318 | SC_TEST_EXPECT(urlParser.pathname == "/"); |
| 319 | SC_TEST_EXPECT(urlParser.search == "?query=value"); |
| 320 | |
| 321 | // Query parameters with special characters |
| 322 | SC_TEST_EXPECT(urlParser.parse("http://example.com/path?q=hello%20world&special=%2B%2D")); |
| 323 | SC_TEST_EXPECT(urlParser.search == "?q=hello%20world&special=%2B%2D"); |
| 324 | SC_TEST_EXPECT(urlParser.getQueryValue("q", value)); |
| 325 | SC_TEST_EXPECT(value == "hello%20world"); |
| 326 | SC_TEST_EXPECT(urlParser.getQueryValue("special", value)); |
| 327 | SC_TEST_EXPECT(value == "%2B%2D"); |
| 328 | |
| 329 | // First repeated key wins |
| 330 | SC_TEST_EXPECT(urlParser.parse("http://example.com/path?name=first&name=second")); |
| 331 | SC_TEST_EXPECT(urlParser.getQueryValue("name", value)); |
| 332 | SC_TEST_EXPECT(value == "first"); |
| 333 | |
| 334 | // Missing and empty search |
| 335 | SC_TEST_EXPECT(not urlParser.getQueryValue("missing", value)); |
| 336 | SC_TEST_EXPECT(value.isEmpty()); |
| 337 | SC_TEST_EXPECT(not HttpURLParser::getQueryValue("", "missing", value)); |
| 338 | SC_TEST_EXPECT(not HttpURLParser::getQueryValue("?", "missing", value)); |
| 339 | |
| 340 | // UTF8 values stay raw and zero-copy. |
| 341 | SC_TEST_EXPECT(urlParser.parse("http://example.com/path?q=tëst&vâlue=ok"_u8)); |
| 342 | SC_TEST_EXPECT(urlParser.getQueryValue("q", value)); |
| 343 | SC_TEST_EXPECT(value == "tëst"_u8); |
| 344 | SC_TEST_EXPECT(urlParser.getQueryValue("vâlue"_u8, value)); |
| 345 | SC_TEST_EXPECT(value == "ok"); |
| 346 | |
| 347 | HttpURLQueryIterator iterator("?flag&empty=&key=value"); |
| 348 | HttpURLQueryItem item; |
nothing calls this directly
no test coverage detected