From 62064b62ad99f9c64f93e5a71a34e2bb9a8d213a Mon Sep 17 00:00:00 2001
From: Remi Gacogne <remi.gacogne@powerdns.com>
Date: Tue, 7 Jan 2025 17:47:22 +0100
Subject: [PATCH] ffi: expose Server Name Indication to FFI

---
 quiche/include/quiche.h |  3 +++
 quiche/src/ffi.rs       | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/quiche/include/quiche.h b/quiche/include/quiche.h
index 24fdcc911f..59a96feb00 100644
--- a/quiche/include/quiche.h
+++ b/quiche/include/quiche.h
@@ -489,6 +489,9 @@ void quiche_conn_peer_cert(const quiche_conn *conn, const uint8_t **out, size_t
 // Returns the serialized cryptographic session for the connection.
 void quiche_conn_session(const quiche_conn *conn, const uint8_t **out, size_t *out_len);
 
+// Returns the server name requested by the client.
+void quiche_conn_server_name(const quiche_conn *conn, const uint8_t **out, size_t *out_len);
+
 // Returns true if the connection handshake is complete.
 bool quiche_conn_is_established(const quiche_conn *conn);
 
diff --git a/quiche/src/ffi.rs b/quiche/src/ffi.rs
index a1286821ea..eb03a160ee 100644
--- a/quiche/src/ffi.rs
+++ b/quiche/src/ffi.rs
@@ -1142,6 +1142,20 @@ pub extern "C" fn quiche_conn_session(
     }
 }
 
+#[no_mangle]
+pub extern "C" fn quiche_conn_server_name(
+    conn: &Connection, out: &mut *const u8, out_len: &mut size_t,
+) {
+    match conn.server_name() {
+        Some(server_name) => {
+            *out = server_name.as_ptr();
+            *out_len = server_name.len();
+        },
+
+        None => *out_len = 0,
+    }
+}
+
 #[no_mangle]
 pub extern "C" fn quiche_conn_is_established(conn: &Connection) -> bool {
     conn.is_established()