From 7bdd586bffe6d9eb0e236b2a6517fabf248346b4 Mon Sep 17 00:00:00 2001
From: Alessandro Ghedini <alessandro@ghedini.me>
Date: Sat, 14 Feb 2015 16:59:01 +0100
Subject: [PATCH 2/3] nss: add support for TLS False Start

---
 lib/vtls/nss.c  | 27 +++++++++++++++++++++++++++
 lib/vtls/nssg.h |  3 +++
 2 files changed, 30 insertions(+)

diff --git a/lib/vtls/nss.c b/lib/vtls/nss.c
index f55c476..f3635c9 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -733,6 +733,13 @@ static void HandshakeCallback(PRFileDesc *sock, void *arg)
 #endif
 }
 
+static SECStatus CanFalseStartCallback(PRFileDesc *fd, void *client_data,
+                                       PRBool *canFalseStart)
+{
+  *canFalseStart = true;
+  return PR_SUCCESS;
+}
+
 static void display_cert_info(struct SessionHandle *data,
                               CERTCertificate *cert)
 {
@@ -1653,6 +1660,18 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
   }
 #endif
 
+#ifdef SSL_ENABLE_FALSE_START
+  if(data->set.ssl.falsestart) {
+    if(SSL_OptionSet(connssl->handle, SSL_ENABLE_FALSE_START, PR_TRUE)
+        != SECSuccess)
+      goto error;
+
+    if(SSL_SetCanFalseStartCallback(connssl->handle, CanFalseStartCallback,
+        conn) != SECSuccess)
+      goto error;
+  }
+#endif
+
 #ifdef USE_NGHTTP2
   if(data->set.httpversion == CURL_HTTP_VERSION_2_0) {
 #ifdef SSL_ENABLE_NPN
@@ -1950,4 +1969,12 @@ bool Curl_nss_cert_status_request(void)
 #endif
 }
 
+bool Curl_nss_false_start(void) {
+#ifdef SSL_ENABLE_FALSE_START
+  return TRUE;
+#else
+  return FALSE;
+#endif
+}
+
 #endif /* USE_NSS */
diff --git a/lib/vtls/nssg.h b/lib/vtls/nssg.h
index 38e7545..d0e7412 100644
--- a/lib/vtls/nssg.h
+++ b/lib/vtls/nssg.h
@@ -58,6 +58,8 @@ void Curl_nss_md5sum(unsigned char *tmp, /* input */
 
 bool Curl_nss_cert_status_request(void);
 
+bool Curl_nss_false_start(void);
+
 /* Set the API backend definition to NSS */
 #define CURL_SSL_BACKEND CURLSSLBACKEND_NSS
 
@@ -88,6 +90,7 @@ bool Curl_nss_cert_status_request(void);
 #define curlssl_random(x,y,z) Curl_nss_random(x,y,z)
 #define curlssl_md5sum(a,b,c,d) Curl_nss_md5sum(a,b,c,d)
 #define curlssl_cert_status_request() Curl_nss_cert_status_request()
+#define curlssl_false_start() Curl_nss_false_start()
 
 #endif /* USE_NSS */
 #endif /* HEADER_CURL_NSSG_H */
-- 
2.1.4


