stream_use_PROXY, NULL);
}
+void
+set_proxyheader_info(isc_nm_proxyheader_info_t *pi) {
+ proxy_info = pi;
+}
+
isc_nm_proxyheader_info_t *
get_proxyheader_info(void) {
if (proxy_info != NULL) {
return (r);
}
+typedef struct proxy_addrs {
+ isc_sockaddr_t src_addr;
+ isc_sockaddr_t dst_addr;
+} proxy_addrs_t;
+
+static void
+proxy2_handler_save_addrs_cb(const isc_result_t result,
+ const isc_proxy2_command_t cmd, const int socktype,
+ const isc_sockaddr_t *restrict src_addr,
+ const isc_sockaddr_t *restrict dst_addr,
+ const isc_region_t *restrict tlv_data,
+ const isc_region_t *restrict extra, void *cbarg) {
+ proxy_addrs_t *addrs = (proxy_addrs_t *)cbarg;
+
+ UNUSED(cmd);
+ UNUSED(socktype);
+ UNUSED(tlv_data);
+ UNUSED(extra);
+
+ REQUIRE(result == ISC_R_SUCCESS);
+
+ if (src_addr != NULL) {
+ addrs->src_addr = *src_addr;
+ }
+
+ if (dst_addr != NULL) {
+ addrs->dst_addr = *dst_addr;
+ }
+}
+
void
proxy_verify_endpoints(isc_nmhandle_t *handle) {
isc_sockaddr_t local, peer;
} else if (proxy_info == NULL) {
assert_true(isc_sockaddr_equal(&peer, &proxy_src));
assert_true(isc_sockaddr_equal(&local, &proxy_dst));
+ } else if (proxy_info != NULL && !proxy_info->complete) {
+ assert_true(isc_sockaddr_equal(
+ &peer, &proxy_info->proxy_info.src_addr));
+ assert_true(isc_sockaddr_equal(
+ &local, &proxy_info->proxy_info.dst_addr));
+ } else if (proxy_info != NULL && proxy_info->complete) {
+ proxy_addrs_t addrs = { 0 };
+ RUNTIME_CHECK(isc_proxy2_header_handle_directly(
+ &proxy_info->complete_header,
+ proxy2_handler_save_addrs_cb,
+ &addrs) == ISC_R_SUCCESS);
+
+ assert_true(isc_sockaddr_equal(&peer, &addrs.src_addr));
+ assert_true(isc_sockaddr_equal(&local, &addrs.dst_addr));
}
}
#include <tests/isc.h>
+static isc_nm_proxyheader_info_t custom_info;
+
+char complete_proxy_data[] = { 0x0d, 0x0a, 0x0d, 0x0a, 0x00, 0x0d, 0x0a,
+ 0x51, 0x55, 0x49, 0x54, 0x0a, 0x21, 0x11,
+ 0x00, 0x0c, 0x01, 0x02, 0x03, 0x04, 0x04,
+ 0x03, 0x02, 0x01, 0x14, 0xe9, 0x14, 0xe9 };
+
/* TCP */
ISC_LOOP_TEST_IMPL(proxystream_noop) {
stream_noop(arg);
return;
}
+static void
+proxystream_recv_one_prerendered(void **arg ISC_ATTR_UNUSED) {
+ isc_region_t header = { 0 };
+ header.base = (unsigned char *)complete_proxy_data;
+ header.length = sizeof(complete_proxy_data);
+
+ isc_nm_proxyheader_info_init_complete(&custom_info, &header);
+
+ set_proxyheader_info(&custom_info);
+
+ stream_recv_one(arg);
+}
+
+ISC_LOOP_TEST_IMPL(proxystream_recv_one_prerendered) {
+ proxystream_recv_one_prerendered(arg);
+ return;
+}
+
ISC_LOOP_TEST_IMPL(proxystream_recv_two) {
stream_recv_two(arg);
return;
return;
}
+ISC_LOOP_TEST_IMPL(proxystreamtls_recv_one_prerendered) {
+ proxystream_recv_one_prerendered(arg);
+ return;
+}
+
ISC_LOOP_TEST_IMPL(proxystreamtls_recv_two) {
stream_recv_two(arg);
return;
proxystream_timeout_recovery_teardown)
ISC_TEST_ENTRY_CUSTOM(proxystream_recv_one, proxystream_recv_one_setup,
proxystream_recv_one_teardown)
+ISC_TEST_ENTRY_CUSTOM(proxystream_recv_one_prerendered,
+ proxystream_recv_one_setup, proxystream_recv_one_teardown)
ISC_TEST_ENTRY_CUSTOM(proxystream_recv_two, proxystream_recv_two_setup,
proxystream_recv_two_teardown)
ISC_TEST_ENTRY_CUSTOM(proxystream_recv_send, proxystream_recv_send_setup,
proxystreamtls_timeout_recovery_teardown)
ISC_TEST_ENTRY_CUSTOM(proxystreamtls_recv_one, proxystreamtls_recv_one_setup,
proxystreamtls_recv_one_teardown)
+ISC_TEST_ENTRY_CUSTOM(proxystreamtls_recv_one_prerendered,
+ proxystreamtls_recv_one_setup,
+ proxystreamtls_recv_one_teardown)
ISC_TEST_ENTRY_CUSTOM(proxystreamtls_recv_two, proxystreamtls_recv_two_setup,
proxystreamtls_recv_two_teardown)
ISC_TEST_ENTRY_CUSTOM(proxystreamtls_recv_send, proxystreamtls_recv_send_setup,