[glib/wip/danw/tls-new-apis: 2/4] GTlsConnection: add ALPN support



commit 7ac2ef9d35681a71277cd56b585266ed298d4b58
Author: Dan Winship <danw gnome org>
Date:   Tue Dec 9 10:38:18 2014 +0100

    GTlsConnection: add ALPN support
    
    Add functions and properties to support TLS Application-Layer Protocol
    Negotiation (which is needed for HTTP/2 support).

 gio/gtlsconnection.c |   91 +++++++++++++++++++++++++++++++++++++++++++++++++-
 gio/gtlsconnection.h |    7 ++++
 2 files changed, 97 insertions(+), 1 deletions(-)
---
diff --git a/gio/gtlsconnection.c b/gio/gtlsconnection.c
index bd06516..dda9d7a 100644
--- a/gio/gtlsconnection.c
+++ b/gio/gtlsconnection.c
@@ -81,7 +81,9 @@ enum {
   PROP_INTERACTION,
   PROP_CERTIFICATE,
   PROP_PEER_CERTIFICATE,
-  PROP_PEER_CERTIFICATE_ERRORS
+  PROP_PEER_CERTIFICATE_ERRORS,
+  PROP_ADVERTISED_PROTOCOLS,
+  PROP_NEGOTIATED_PROTOCOL
 };
 
 static void
@@ -244,6 +246,37 @@ g_tls_connection_class_init (GTlsConnectionClass *klass)
                                                       0,
                                                       G_PARAM_READABLE |
                                                       G_PARAM_STATIC_STRINGS));
+  /**
+   * GTlsConnection:advertised-protocols:
+   *
+   * The list of application-layer protocols that the connection
+   * advertises that it is willing to speak. See
+   * g_tls_connection_set_advertised_protocols().
+   *
+   * Since: 2.46
+   */
+  g_object_class_install_property (gobject_class, PROP_ADVERTISED_PROTOCOLS,
+                                   g_param_spec_boxed ("advertised-protocols",
+                                                       P_("Advertised Protocols"),
+                                                       P_("Application-layer protocols available on this 
connection"),
+                                                       G_TYPE_STRV,
+                                                       G_PARAM_READWRITE |
+                                                       G_PARAM_STATIC_STRINGS));
+  /**
+   * GTlsConnection:negotiated-protocol:
+   *
+   * The application-layer protocol negotiated during the TLS
+   * handshake. See g_tls_connection_get_negotiated_protocol().
+   *
+   * Since: 2.46
+   */
+  g_object_class_install_property (gobject_class, PROP_NEGOTIATED_PROTOCOL,
+                                   g_param_spec_string ("negotiated-protocol",
+                                                        P_("Negotiated Protocol"),
+                                                        P_("Application-layer protocol negotiated for this 
connection"),
+                                                        NULL,
+                                                        G_PARAM_READABLE |
+                                                        G_PARAM_STATIC_STRINGS));
 
   /**
    * GTlsConnection::accept-certificate:
@@ -726,6 +759,62 @@ g_tls_connection_get_rehandshake_mode (GTlsConnection       *conn)
 }
 
 /**
+ * g_tls_connection_set_advertised_protocols:
+ * @conn: a #GTlsConnection
+ * @protocols: (array null-terminated=1): a %NULL-terminated array
+ *   of ALPN protocol names (eg, "http/1.1", "h2")
+ *
+ * Sets the list of application-layer protocols to advertise that the
+ * caller is willing to speak on this connection. The
+ * Application-Layer Protocol Negotiation (ALPN) extension will be
+ * used to negotiate a compatible protocol with the peer; use
+ * g_tls_connection_get_negotiated_protocol() to find the negotiated
+ * protocol after the handshake.
+ *
+ * Since: 2.46
+ */
+void
+g_tls_connection_set_advertised_protocols (GTlsConnection     *conn,
+                                           const char * const *protocols)
+{
+  g_return_if_fail (G_IS_TLS_CONNECTION (conn));
+  g_return_if_fail (protocols != NULL);
+
+  g_object_set (G_OBJECT (conn),
+                "advertised-protocols", protocols,
+                NULL);
+}
+
+/**
+ * g_tls_connection_get_negotiated_protocol:
+ * @conn: a #GTlsConnection
+ *
+ * Gets the name of the application-layer protocol negotiated during
+ * the handshake.
+ *
+ * If the peer did not use the ALPN extension, or did not advertise a
+ * protocol that matched one of @conn's protocols, or the TLS backend
+ * does not support ALPN, then this will be %NULL.
+ *
+ * Since: 2.46
+ */
+const char *
+g_tls_connection_get_negotiated_protocol (GTlsConnection *conn)
+{
+  char *protocol;
+  const char *interned_protocol;
+
+  g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL);
+
+  g_object_get (G_OBJECT (conn),
+                "negotiated-protocol", &protocol,
+                NULL);
+  interned_protocol = protocol ? g_intern_string (protocol) : NULL;
+  g_free (protocol);
+  return interned_protocol;
+}
+
+/**
  * g_tls_connection_handshake:
  * @conn: a #GTlsConnection
  * @cancellable: (allow-none): a #GCancellable, or %NULL
diff --git a/gio/gtlsconnection.h b/gio/gtlsconnection.h
index 15b29aa..553be66 100644
--- a/gio/gtlsconnection.h
+++ b/gio/gtlsconnection.h
@@ -115,6 +115,13 @@ void                  g_tls_connection_set_rehandshake_mode        (GTlsConnecti
 GLIB_AVAILABLE_IN_ALL
 GTlsRehandshakeMode   g_tls_connection_get_rehandshake_mode        (GTlsConnection       *conn);
 
+GLIB_AVAILABLE_IN_2_46
+void                  g_tls_connection_set_advertised_protocols    (GTlsConnection       *conn,
+                                                                    const char * const   *protocols);
+
+GLIB_AVAILABLE_IN_2_46
+const char *          g_tls_connection_get_negotiated_protocol     (GTlsConnection       *conn);
+
 GLIB_AVAILABLE_IN_ALL
 gboolean              g_tls_connection_handshake                   (GTlsConnection       *conn,
                                                                    GCancellable         *cancellable,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]