sizeof(isc_nm_http_session_t));
}
+isc_nmhandle_t *
+isc__nm_httpsession_handle(isc_nm_http_session_t *session) {
+ REQUIRE(VALID_HTTP2_SESSION(session));
+
+ return (session->handle);
+}
+
static http_cstream_t *
find_http_cstream(int32_t stream_id, isc_nm_http_session_t *session) {
http_cstream_t *cstream = NULL;
const char *uri, bool post, isc_nm_cb_t cb, void *cbarg,
isc_tlsctx_t *tlsctx,
isc_tlsctx_client_session_cache_t *client_sess_cache,
- unsigned int timeout) {
+ unsigned int timeout, bool proxy,
+ isc_nm_proxyheader_info_t *proxy_info) {
isc_sockaddr_t local_interface;
isc_nmsocket_t *sock = NULL;
isc__networker_t *worker = NULL;
if (tlsctx != NULL) {
isc_nm_tlsconnect(mgr, local, peer, transport_connect_cb, sock,
- tlsctx, client_sess_cache, timeout, false,
+ tlsctx, client_sess_cache, timeout, proxy,
NULL);
+ } else if (proxy) {
+ isc_nm_proxystreamconnect(mgr, local, peer,
+ transport_connect_cb, sock, timeout,
+ proxy_info);
} else {
isc_nm_tcpconnect(mgr, local, peer, transport_connect_cb, sock,
timeout);
isc_nm_listenhttp(isc_nm_t *mgr, uint32_t workers, isc_sockaddr_t *iface,
int backlog, isc_quota_t *quota, isc_tlsctx_t *ctx,
isc_nm_http_endpoints_t *eps, uint32_t max_concurrent_streams,
- isc_nmsocket_t **sockp) {
+ bool proxy, isc_nmsocket_t **sockp) {
isc_nmsocket_t *sock = NULL;
isc_result_t result;
isc__networker_t *worker = NULL;
if (ctx != NULL) {
result = isc_nm_listentls(mgr, workers, iface,
httplisten_acceptcb, sock, backlog,
- quota, ctx, false, &sock->outer);
+ quota, ctx, proxy, &sock->outer);
+ } else if (proxy) {
+ result = isc_nm_listenproxystream(mgr, workers, iface,
+ httplisten_acceptcb, sock,
+ backlog, quota, &sock->outer);
} else {
result = isc_nm_listentcp(mgr, workers, iface,
httplisten_acceptcb, sock, backlog,
if ((sock->type == isc_nm_httplistener ||
sock->type == isc_nm_httpsocket ||
- sock->type == isc_nm_tcpsocket ||
- sock->type == isc_nm_tlssocket) &&
+ sock->type == isc_nm_tcpsocket || sock->type == isc_nm_tlssocket ||
+ sock->type == isc_nm_proxystreamsocket) &&
sock->h2.session != NULL)
{
if (sock->h2.connect.uri != NULL) {
static isc_nm_http_endpoints_t *endpoints = NULL;
+static atomic_bool use_PROXY = false;
+
static isc_nm_t **nm = NULL;
/* Timeout for soft-timeout tests (0.05 seconds) */
isc_nm_httpconnect(mgr, NULL, &tcp_listen_addr, uri, post,
connect_send_cb, data, ctx, client_sess_cache,
- timeout);
+ timeout, atomic_load(&use_PROXY), NULL);
}
static int
assert_int_equal(result, ISC_R_SUCCESS);
result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
&tcp_listen_addr, 0, NULL, NULL, endpoints,
- 0, &listen_sock);
+ 0, false, &listen_sock);
assert_int_not_equal(result, ISC_R_SUCCESS);
assert_null(listen_sock);
result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
&tcp_listen_addr, 0, NULL, NULL, endpoints,
- 0, &listen_sock);
+ 0, atomic_load(&use_PROXY), &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_loop_teardown(mainloop, listen_sock_close, listen_sock);
result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
&tcp_listen_addr, 0, NULL, NULL, endpoints,
- 0, &listen_sock);
+ 0, atomic_load(&use_PROXY), &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_loop_teardown(mainloop, listen_sock_close, listen_sock);
result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
&tcp_listen_addr, 0, NULL, NULL, endpoints,
- 0, &listen_sock);
+ 0, atomic_load(&use_PROXY), &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
isc_loop_teardown(mainloop, listen_sock_close, listen_sock);
ISC_NM_HTTP_DEFAULT_PATH);
isc_nm_httpconnect(connect_nm, NULL, &tcp_listen_addr, req_url,
atomic_load(&POST), timeout_request_cb, NULL, ctx,
- client_sess_cache, T_SOFT);
+ client_sess_cache, T_SOFT, atomic_load(&use_PROXY),
+ NULL);
}
static int
doh_receive_request_cb, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
- result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
- &tcp_listen_addr, 0, quotap,
- atomic_load(&use_TLS) ? server_tlsctx : NULL,
- endpoints, 0, &listen_sock);
+ result = isc_nm_listenhttp(
+ listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap,
+ atomic_load(&use_TLS) ? server_tlsctx : NULL, endpoints, 0,
+ atomic_load(&use_PROXY), &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
sockaddr_to_url(&tcp_listen_addr, atomic_load(&use_TLS), req_url,
doh_receive_request_cb, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
- result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
- &tcp_listen_addr, 0, quotap,
- atomic_load(&use_TLS) ? server_tlsctx : NULL,
- endpoints, 0, &listen_sock);
+ result = isc_nm_listenhttp(
+ listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap,
+ atomic_load(&use_TLS) ? server_tlsctx : NULL, endpoints, 0,
+ atomic_load(&use_PROXY), &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
sockaddr_to_url(&tcp_listen_addr, atomic_load(&use_TLS), req_url,
isc_nm_httpconnect(connect_nm, NULL, &tcp_listen_addr, req_url,
atomic_load(&POST), doh_connect_send_two_requests_cb,
- NULL, ctx, client_sess_cache, 5000);
+ NULL, ctx, client_sess_cache, 5000,
+ atomic_load(&use_PROXY), NULL);
isc_loop_teardown(mainloop, listen_sock_close, listen_sock);
}
doh_receive_request_cb, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
- result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
- &tcp_listen_addr, 0, quotap,
- atomic_load(&use_TLS) ? server_tlsctx : NULL,
- endpoints, 0, &listen_sock);
+ result = isc_nm_listenhttp(
+ listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap,
+ atomic_load(&use_TLS) ? server_tlsctx : NULL, endpoints, 0,
+ atomic_load(&use_PROXY), &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
for (size_t i = 0; i < nthreads; i++) {
result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL,
&tcp_listen_addr, 0, quotap, server_tlsctx,
- endpoints, 0, &listen_sock);
+ endpoints, 0, atomic_load(&use_PROXY),
+ &listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
/*