penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

commit 83458b8df4f36e4693b51fd34e158a6e9f9a621e

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-06-09T17:47:38Z
subjectBetter logging
commit 83458b8df4f36e4693b51fd34e158a6e9f9a621e
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-06-09T17:47:38Z

    Better logging
---
 src/stream_conn.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/stream_conn.c b/src/stream_conn.c
index 8f4f422..81fffcf 100644
--- a/src/stream_conn.c
+++ b/src/stream_conn.c
@@ -239,9 +239,31 @@ void stream_upstream_event_cb(struct bufferevent *bev, short events, void *arg)
 			client_sni = stream_sniff_log_sni(&conn->sniff);
 		}
 
-		LOG_WARN(conn->upstream_connected
-				? "upstream I/O timed out"
-				: "upstream connect timed out",
+		if (!conn->upstream_connected) {
+			LOG_WARN("upstream connect timed out",
+				"listen", _LOGV_ENDPOINT(&r->listen),
+				"upstream", _LOGV_ENDPOINT(&r->upstream),
+				"client_addr", _LOGV_SOCKADDR(&conn->peer_addr, conn->peer_addr_len,
+					peer_buf, sizeof(peer_buf)),
+				"client_sni", _LOGV(client_sni)
+			);
+			goto out_free;
+		}
+
+		if (!client_has_pending_output(conn) && bev_output_len(conn->upstream) == 0) {
+			LOG_DEBUG("stream idle timed out",
+				"listen", _LOGV_ENDPOINT(&r->listen),
+				"upstream", _LOGV_ENDPOINT(&r->upstream),
+				"client_addr", _LOGV_SOCKADDR(&conn->peer_addr, conn->peer_addr_len,
+					peer_buf, sizeof(peer_buf)),
+				"client_sni", _LOGV(client_sni)
+			);
+			goto out_free;
+		}
+
+		LOG_WARN("stream I/O stalled timed out",
+			"client_output", _LOGV(bev_output_len(conn->client)),
+			"upstream_output", _LOGV(bev_output_len(conn->upstream)),
 			"listen", _LOGV_ENDPOINT(&r->listen),
 			"upstream", _LOGV_ENDPOINT(&r->upstream),
 			"client_addr", _LOGV_SOCKADDR(&conn->peer_addr, conn->peer_addr_len,