12c593315Sopenharmony_ci/* 22c593315Sopenharmony_ci * nghttp2 - HTTP/2 C Library 32c593315Sopenharmony_ci * 42c593315Sopenharmony_ci * Copyright (c) 2013 Tatsuhiro Tsujikawa 52c593315Sopenharmony_ci * 62c593315Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining 72c593315Sopenharmony_ci * a copy of this software and associated documentation files (the 82c593315Sopenharmony_ci * "Software"), to deal in the Software without restriction, including 92c593315Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish, 102c593315Sopenharmony_ci * distribute, sublicense, and/or sell copies of the Software, and to 112c593315Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to 122c593315Sopenharmony_ci * the following conditions: 132c593315Sopenharmony_ci * 142c593315Sopenharmony_ci * The above copyright notice and this permission notice shall be 152c593315Sopenharmony_ci * included in all copies or substantial portions of the Software. 162c593315Sopenharmony_ci * 172c593315Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 182c593315Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 192c593315Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 202c593315Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 212c593315Sopenharmony_ci * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 222c593315Sopenharmony_ci * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 232c593315Sopenharmony_ci * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 242c593315Sopenharmony_ci */ 252c593315Sopenharmony_ci#include "shrpx_downstream_test.h" 262c593315Sopenharmony_ci 272c593315Sopenharmony_ci#include <iostream> 282c593315Sopenharmony_ci 292c593315Sopenharmony_ci#include <CUnit/CUnit.h> 302c593315Sopenharmony_ci 312c593315Sopenharmony_ci#include "shrpx_downstream.h" 322c593315Sopenharmony_ci 332c593315Sopenharmony_cinamespace shrpx { 342c593315Sopenharmony_ci 352c593315Sopenharmony_civoid test_downstream_field_store_append_last_header(void) { 362c593315Sopenharmony_ci BlockAllocator balloc(16, 16); 372c593315Sopenharmony_ci FieldStore fs(balloc, 0); 382c593315Sopenharmony_ci fs.alloc_add_header_name(StringRef::from_lit("alpha")); 392c593315Sopenharmony_ci auto bravo = StringRef::from_lit("BRAVO"); 402c593315Sopenharmony_ci fs.append_last_header_key(bravo.c_str(), bravo.size()); 412c593315Sopenharmony_ci // Add more characters so that relloc occurs 422c593315Sopenharmony_ci auto golf = StringRef::from_lit("golF0123456789"); 432c593315Sopenharmony_ci fs.append_last_header_key(golf.c_str(), golf.size()); 442c593315Sopenharmony_ci 452c593315Sopenharmony_ci auto charlie = StringRef::from_lit("Charlie"); 462c593315Sopenharmony_ci fs.append_last_header_value(charlie.c_str(), charlie.size()); 472c593315Sopenharmony_ci auto delta = StringRef::from_lit("deltA"); 482c593315Sopenharmony_ci fs.append_last_header_value(delta.c_str(), delta.size()); 492c593315Sopenharmony_ci // Add more characters so that relloc occurs 502c593315Sopenharmony_ci auto echo = StringRef::from_lit("echo0123456789"); 512c593315Sopenharmony_ci fs.append_last_header_value(echo.c_str(), echo.size()); 522c593315Sopenharmony_ci 532c593315Sopenharmony_ci fs.add_header_token(StringRef::from_lit("echo"), 542c593315Sopenharmony_ci StringRef::from_lit("foxtrot"), false, -1); 552c593315Sopenharmony_ci 562c593315Sopenharmony_ci auto ans = 572c593315Sopenharmony_ci HeaderRefs{{StringRef::from_lit("alphabravogolf0123456789"), 582c593315Sopenharmony_ci StringRef::from_lit("CharliedeltAecho0123456789")}, 592c593315Sopenharmony_ci {StringRef::from_lit("echo"), StringRef::from_lit("foxtrot")}}; 602c593315Sopenharmony_ci CU_ASSERT(ans == fs.headers()); 612c593315Sopenharmony_ci} 622c593315Sopenharmony_ci 632c593315Sopenharmony_civoid test_downstream_field_store_header(void) { 642c593315Sopenharmony_ci BlockAllocator balloc(16, 16); 652c593315Sopenharmony_ci FieldStore fs(balloc, 0); 662c593315Sopenharmony_ci fs.add_header_token(StringRef::from_lit("alpha"), StringRef::from_lit("0"), 672c593315Sopenharmony_ci false, -1); 682c593315Sopenharmony_ci fs.add_header_token(StringRef::from_lit(":authority"), 692c593315Sopenharmony_ci StringRef::from_lit("1"), false, http2::HD__AUTHORITY); 702c593315Sopenharmony_ci fs.add_header_token(StringRef::from_lit("content-length"), 712c593315Sopenharmony_ci StringRef::from_lit("2"), false, 722c593315Sopenharmony_ci http2::HD_CONTENT_LENGTH); 732c593315Sopenharmony_ci 742c593315Sopenharmony_ci // By token 752c593315Sopenharmony_ci CU_ASSERT(HeaderRef(StringRef{":authority"}, StringRef{"1"}) == 762c593315Sopenharmony_ci *fs.header(http2::HD__AUTHORITY)); 772c593315Sopenharmony_ci CU_ASSERT(nullptr == fs.header(http2::HD__METHOD)); 782c593315Sopenharmony_ci 792c593315Sopenharmony_ci // By name 802c593315Sopenharmony_ci CU_ASSERT(HeaderRef(StringRef{"alpha"}, StringRef{"0"}) == 812c593315Sopenharmony_ci *fs.header(StringRef::from_lit("alpha"))); 822c593315Sopenharmony_ci CU_ASSERT(nullptr == fs.header(StringRef::from_lit("bravo"))); 832c593315Sopenharmony_ci} 842c593315Sopenharmony_ci 852c593315Sopenharmony_civoid test_downstream_crumble_request_cookie(void) { 862c593315Sopenharmony_ci Downstream d(nullptr, nullptr, 0); 872c593315Sopenharmony_ci auto &req = d.request(); 882c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit(":method"), 892c593315Sopenharmony_ci StringRef::from_lit("get"), false, -1); 902c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit(":path"), 912c593315Sopenharmony_ci StringRef::from_lit("/"), false, -1); 922c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 932c593315Sopenharmony_ci StringRef::from_lit("alpha; bravo; ; ;; charlie;;"), 942c593315Sopenharmony_ci true, http2::HD_COOKIE); 952c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 962c593315Sopenharmony_ci StringRef::from_lit(";delta"), false, 972c593315Sopenharmony_ci http2::HD_COOKIE); 982c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 992c593315Sopenharmony_ci StringRef::from_lit("echo"), false, http2::HD_COOKIE); 1002c593315Sopenharmony_ci 1012c593315Sopenharmony_ci std::vector<nghttp2_nv> nva; 1022c593315Sopenharmony_ci d.crumble_request_cookie(nva); 1032c593315Sopenharmony_ci 1042c593315Sopenharmony_ci auto num_cookies = d.count_crumble_request_cookie(); 1052c593315Sopenharmony_ci 1062c593315Sopenharmony_ci CU_ASSERT(5 == nva.size()); 1072c593315Sopenharmony_ci CU_ASSERT(5 == num_cookies); 1082c593315Sopenharmony_ci 1092c593315Sopenharmony_ci HeaderRefs cookies; 1102c593315Sopenharmony_ci std::transform(std::begin(nva), std::end(nva), std::back_inserter(cookies), 1112c593315Sopenharmony_ci [](const nghttp2_nv &nv) { 1122c593315Sopenharmony_ci return HeaderRef(StringRef{nv.name, nv.namelen}, 1132c593315Sopenharmony_ci StringRef{nv.value, nv.valuelen}, 1142c593315Sopenharmony_ci nv.flags & NGHTTP2_NV_FLAG_NO_INDEX); 1152c593315Sopenharmony_ci }); 1162c593315Sopenharmony_ci 1172c593315Sopenharmony_ci HeaderRefs ans = { 1182c593315Sopenharmony_ci {StringRef::from_lit("cookie"), StringRef::from_lit("alpha")}, 1192c593315Sopenharmony_ci {StringRef::from_lit("cookie"), StringRef::from_lit("bravo")}, 1202c593315Sopenharmony_ci {StringRef::from_lit("cookie"), StringRef::from_lit("charlie")}, 1212c593315Sopenharmony_ci {StringRef::from_lit("cookie"), StringRef::from_lit("delta")}, 1222c593315Sopenharmony_ci {StringRef::from_lit("cookie"), StringRef::from_lit("echo")}}; 1232c593315Sopenharmony_ci 1242c593315Sopenharmony_ci CU_ASSERT(ans == cookies); 1252c593315Sopenharmony_ci CU_ASSERT(cookies[0].no_index); 1262c593315Sopenharmony_ci CU_ASSERT(cookies[1].no_index); 1272c593315Sopenharmony_ci CU_ASSERT(cookies[2].no_index); 1282c593315Sopenharmony_ci} 1292c593315Sopenharmony_ci 1302c593315Sopenharmony_civoid test_downstream_assemble_request_cookie(void) { 1312c593315Sopenharmony_ci Downstream d(nullptr, nullptr, 0); 1322c593315Sopenharmony_ci auto &req = d.request(); 1332c593315Sopenharmony_ci 1342c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit(":method"), 1352c593315Sopenharmony_ci StringRef::from_lit("get"), false, -1); 1362c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit(":path"), 1372c593315Sopenharmony_ci StringRef::from_lit("/"), false, -1); 1382c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 1392c593315Sopenharmony_ci StringRef::from_lit("alpha"), false, 1402c593315Sopenharmony_ci http2::HD_COOKIE); 1412c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 1422c593315Sopenharmony_ci StringRef::from_lit("bravo;"), false, 1432c593315Sopenharmony_ci http2::HD_COOKIE); 1442c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 1452c593315Sopenharmony_ci StringRef::from_lit("charlie; "), false, 1462c593315Sopenharmony_ci http2::HD_COOKIE); 1472c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 1482c593315Sopenharmony_ci StringRef::from_lit("delta;;"), false, 1492c593315Sopenharmony_ci http2::HD_COOKIE); 1502c593315Sopenharmony_ci CU_ASSERT("alpha; bravo; charlie; delta" == d.assemble_request_cookie()); 1512c593315Sopenharmony_ci} 1522c593315Sopenharmony_ci 1532c593315Sopenharmony_civoid test_downstream_rewrite_location_response_header(void) { 1542c593315Sopenharmony_ci Downstream d(nullptr, nullptr, 0); 1552c593315Sopenharmony_ci auto &req = d.request(); 1562c593315Sopenharmony_ci auto &resp = d.response(); 1572c593315Sopenharmony_ci d.set_request_downstream_host(StringRef::from_lit("localhost2")); 1582c593315Sopenharmony_ci req.authority = StringRef::from_lit("localhost:8443"); 1592c593315Sopenharmony_ci resp.fs.add_header_token(StringRef::from_lit("location"), 1602c593315Sopenharmony_ci StringRef::from_lit("http://localhost2:3000/"), 1612c593315Sopenharmony_ci false, http2::HD_LOCATION); 1622c593315Sopenharmony_ci d.rewrite_location_response_header(StringRef::from_lit("https")); 1632c593315Sopenharmony_ci auto location = resp.fs.header(http2::HD_LOCATION); 1642c593315Sopenharmony_ci CU_ASSERT("https://localhost:8443/" == (*location).value); 1652c593315Sopenharmony_ci} 1662c593315Sopenharmony_ci 1672c593315Sopenharmony_civoid test_downstream_supports_non_final_response(void) { 1682c593315Sopenharmony_ci Downstream d(nullptr, nullptr, 0); 1692c593315Sopenharmony_ci auto &req = d.request(); 1702c593315Sopenharmony_ci 1712c593315Sopenharmony_ci req.http_major = 3; 1722c593315Sopenharmony_ci req.http_minor = 0; 1732c593315Sopenharmony_ci 1742c593315Sopenharmony_ci CU_ASSERT(d.supports_non_final_response()); 1752c593315Sopenharmony_ci 1762c593315Sopenharmony_ci req.http_major = 2; 1772c593315Sopenharmony_ci req.http_minor = 0; 1782c593315Sopenharmony_ci 1792c593315Sopenharmony_ci CU_ASSERT(d.supports_non_final_response()); 1802c593315Sopenharmony_ci 1812c593315Sopenharmony_ci req.http_major = 1; 1822c593315Sopenharmony_ci req.http_minor = 1; 1832c593315Sopenharmony_ci 1842c593315Sopenharmony_ci CU_ASSERT(d.supports_non_final_response()); 1852c593315Sopenharmony_ci 1862c593315Sopenharmony_ci req.http_major = 1; 1872c593315Sopenharmony_ci req.http_minor = 0; 1882c593315Sopenharmony_ci 1892c593315Sopenharmony_ci CU_ASSERT(!d.supports_non_final_response()); 1902c593315Sopenharmony_ci 1912c593315Sopenharmony_ci req.http_major = 0; 1922c593315Sopenharmony_ci req.http_minor = 9; 1932c593315Sopenharmony_ci 1942c593315Sopenharmony_ci CU_ASSERT(!d.supports_non_final_response()); 1952c593315Sopenharmony_ci} 1962c593315Sopenharmony_ci 1972c593315Sopenharmony_civoid test_downstream_find_affinity_cookie(void) { 1982c593315Sopenharmony_ci Downstream d(nullptr, nullptr, 0); 1992c593315Sopenharmony_ci 2002c593315Sopenharmony_ci auto &req = d.request(); 2012c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), StringRef{}, false, 2022c593315Sopenharmony_ci http2::HD_COOKIE); 2032c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 2042c593315Sopenharmony_ci StringRef::from_lit("a=b;;c=d"), false, 2052c593315Sopenharmony_ci http2::HD_COOKIE); 2062c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("content-length"), 2072c593315Sopenharmony_ci StringRef::from_lit("599"), false, 2082c593315Sopenharmony_ci http2::HD_CONTENT_LENGTH); 2092c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 2102c593315Sopenharmony_ci StringRef::from_lit("lb=deadbeef;LB=f1f2f3f4"), false, 2112c593315Sopenharmony_ci http2::HD_COOKIE); 2122c593315Sopenharmony_ci req.fs.add_header_token(StringRef::from_lit("cookie"), 2132c593315Sopenharmony_ci StringRef::from_lit("short=e1e2e3e"), false, 2142c593315Sopenharmony_ci http2::HD_COOKIE); 2152c593315Sopenharmony_ci 2162c593315Sopenharmony_ci uint32_t aff; 2172c593315Sopenharmony_ci 2182c593315Sopenharmony_ci aff = d.find_affinity_cookie(StringRef::from_lit("lb")); 2192c593315Sopenharmony_ci 2202c593315Sopenharmony_ci CU_ASSERT(0xdeadbeef == aff); 2212c593315Sopenharmony_ci 2222c593315Sopenharmony_ci aff = d.find_affinity_cookie(StringRef::from_lit("LB")); 2232c593315Sopenharmony_ci 2242c593315Sopenharmony_ci CU_ASSERT(0xf1f2f3f4 == aff); 2252c593315Sopenharmony_ci 2262c593315Sopenharmony_ci aff = d.find_affinity_cookie(StringRef::from_lit("short")); 2272c593315Sopenharmony_ci 2282c593315Sopenharmony_ci CU_ASSERT(0 == aff); 2292c593315Sopenharmony_ci} 2302c593315Sopenharmony_ci 2312c593315Sopenharmony_ci} // namespace shrpx 232