Add libpq connection option to disable SSL compression
authorMagnus Hagander
Mon, 28 Nov 2011 12:13:42 +0000 (13:13 +0100)
committerMagnus Hagander
Mon, 28 Nov 2011 12:13:42 +0000 (13:13 +0100)
This can be used to remove the overhead of SSL compression on
fast networks.

Laurenz Albe

doc/src/sgml/libpq.sgml
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-secure.c
src/interfaces/libpq/libpq-int.h

index 3d5f98ba2a663d5bbf2e8f9cdb1e25e6b9e3edfc..252ff8cc855f68d1041ea94695101dfee992b422 100644 (file)
@@ -494,6 +494,28 @@ PGconn *PQconnectdbParams(const char * const *keywords,
          
         
 
+        
+         sslcompression
+         
+          
+           If set to 1 (default), data sent over SSL connections will be
+           compressed (this requires OpenSSL version
+           0.9.8 or later).
+           If set to 0, compression will be disabled (this requires
+           OpenSSL 1.0.0 or later).
+           This parameter is ignored if a connection without SSL is made,
+           or if the version of OpenSSL used does not support
+           it.
+          
+          
+           Compression uses CPU time, but can improve throughput if
+           the network is the bottleneck.
+           Disabling compression can improve response time and throughput
+           if CPU performance is the limiting factor.
+          
+         
+        
+
         
          sslcert
          
@@ -6308,6 +6330,16 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
      
     
 
+    
+     
+      
+       PGSSLCOMPRESSION
+      
+      PGSSLCOMPRESSION behaves the same as the 
+      linkend="libpq-connect-sslcompression"> connection parameter.
+     
+    
+
     
      
       
index ed9dce941e1d57cce51f2c21bf29769dfe2ee542..50f3f83aaebff31e39b641614ae4ba2b3f9c7a46 100644 (file)
@@ -222,6 +222,9 @@ static const PQconninfoOption PQconninfoOptions[] = {
    {"sslmode", "PGSSLMODE", DefaultSSLMode, NULL,
    "SSL-Mode", "", 8},         /* sizeof("disable") == 8 */
 
+   {"sslcompression", "PGSSLCOMPRESSION", "1", NULL,
+   "SSL-Compression", "", 1},
+
    {"sslcert", "PGSSLCERT", NULL, NULL,
    "SSL-Client-Cert", "", 64},
 
@@ -621,6 +624,8 @@ fillPGconn(PGconn *conn, PQconninfoOption *connOptions)
    conn->keepalives_count = tmp ? strdup(tmp) : NULL;
    tmp = conninfo_getval(connOptions, "sslmode");
    conn->sslmode = tmp ? strdup(tmp) : NULL;
+   tmp = conninfo_getval(connOptions, "sslcompression");
+   conn->sslcompression = tmp ? strdup(tmp) : NULL;
    tmp = conninfo_getval(connOptions, "sslkey");
    conn->sslkey = tmp ? strdup(tmp) : NULL;
    tmp = conninfo_getval(connOptions, "sslcert");
index 9c6ced6a8280130aaac2b680691430fd92490953..c6963bed9480f9fb61afc70c6e91b7583f9e0bfb 100644 (file)
@@ -1292,6 +1292,16 @@ initialize_SSL(PGconn *conn)
        }
    }
 
+   /*
+    * If the OpenSSL version used supports it (from 1.0.0 on)
+    * and the user requested it, disable SSL compression.
+    */
+#ifdef SSL_OP_NO_COMPRESSION
+   if (conn->sslcompression && conn->sslcompression[0] == '0') {
+       SSL_set_options(conn->ssl, SSL_OP_NO_COMPRESSION);
+   }
+#endif
+
    return 0;
 }
 
index d56ef5d489b5f9964fe4a335ac2de501a2ffd224..64dfcb27fb1b79496cd3ed134c406298587b4f59 100644 (file)
@@ -310,6 +310,7 @@ struct pg_conn
    char       *keepalives_count;       /* maximum number of TCP keepalive
                                         * retransmits */
    char       *sslmode;        /* SSL mode (require,prefer,allow,disable) */
+   char       *sslcompression; /* SSL compression (0 or 1) */
    char       *sslkey;         /* client key filename */
    char       *sslcert;        /* client certificate filename */
    char       *sslrootcert;    /* root certificate filename */