ssize_t data_len = nread;
const struct sockaddr *src_addr = session_get_peer(s);
const struct sockaddr *dst_addr = NULL;
- struct proxy_result proxy;
- bool has_proxy = false;
if (!session_flags(s)->outgoing && !session_flags(s)->no_proxy &&
proxy_header_present(data, data_len)) {
if (!proxy_allowed(&the_worker->engine->net, src_addr)) {
return;
}
- ssize_t trimmed = proxy_process_header(&proxy, s, data, data_len);
+ struct proxy_result *proxy = session_proxy_create(s);
+ ssize_t trimmed = proxy_process_header(proxy, s, data, data_len);
if (trimmed < 0) {
if (kr_log_is_debug(IO, NULL)) {
if (trimmed == KNOT_EMALF) {
return;
}
- if (proxy.command != PROXY2_CMD_LOCAL && proxy.family != AF_UNSPEC) {
- has_proxy = true;
- src_addr = &proxy.src_addr.ip;
- dst_addr = &proxy.dst_addr.ip;
+ if (proxy->command != PROXY2_CMD_LOCAL && proxy->family != AF_UNSPEC) {
+ src_addr = &proxy->src_addr.ip;
+ dst_addr = &proxy->dst_addr.ip;
if (kr_log_is_debug(IO, NULL)) {
kr_log_debug(IO, "<= TCP stream from '%s'\n",
.src_addr = src_addr,
.comm_addr = session_get_peer(s),
.dst_addr = dst_addr,
- .proxy = (has_proxy) ? &proxy : NULL
+ .proxy = session_proxy_get(s)
};
int ret = session_wirebuf_process(s, &comm);
if (ret < 0) {
struct tls_ctx *tls_ctx; /**< server side tls-related data. */
struct tls_client_ctx *tls_client_ctx; /**< client side tls-related data. */
+ struct proxy_result *proxy; /**< PROXYv2 data for TCP. May be `NULL` if not proxied. */
+
#if ENABLE_DOH2
struct http_ctx *http_ctx; /**< server side http-related data. */
#endif
if (session->handle && session->handle->type == UV_TCP) {
free(session->wire_buf);
}
+ if (session->proxy) {
+ free(session->proxy);
+ }
#if ENABLE_DOH2
http_free(session->http_ctx);
#endif
}
}
+struct proxy_result *session_proxy_create(struct session *session)
+{
+ if (!kr_fails_assert(!session->proxy)) {
+ session->proxy = calloc(1, sizeof(struct proxy_result));
+ kr_require(session->proxy);
+ }
+
+ return session->proxy;
+}
+
+struct proxy_result *session_proxy_get(struct session *session)
+{
+ return session->proxy;
+}
+
void session_tasklist_finalize(struct session *session, int status)
{
while (session_tasklist_get_len(session) > 0) {
struct worker_ctx;
struct session;
struct io_comm_data;
+struct proxy_result;
struct session_flags {
bool outgoing : 1; /**< True: to upstream; false: from a client. */
/** Finalize all tasks in the list. */
void session_waitinglist_finalize(struct session *session, int status);
+/** PROXYv2 data. */
+/** Creates zero-initialized PROXYv2 data for the session. Should only be called
+ * once per session. */
+struct proxy_result *session_proxy_create(struct session *session);
+/** Gets the session's PROXYv2 data, if it exists. If it does not, returns `NULL`. */
+struct proxy_result *session_proxy_get(struct session *session);
+
/** List of tasks associated with session. */
/** Check if list is empty. */
bool session_tasklist_is_empty(const struct session *session);