Browse Source

Simplify mg_connect_client implementation

bel2125 8 years ago
parent
commit
f40e5644ae
1 changed files with 78 additions and 79 deletions
  1. 78 79
      src/civetweb.c

+ 78 - 79
src/civetweb.c

@@ -3279,6 +3279,8 @@ static int
 send_additional_header(struct mg_connection *conn)
 {
 	int i = 0;
+	(void)conn;
+
 #if 0
 	i += mg_printf(conn, "Strict-Transport-Security: max-age=%u\r\n", 3600);
 	i += mg_printf(conn, "X-Some-Test-Header: %u\r\n", 42);
@@ -13342,9 +13344,10 @@ mg_connect_client_impl(const struct mg_client_options *client_options,
 	                    ebuf_len,
 	                    &sock,
 	                    &sa)) {
-		;
-	} else if ((conn = (struct mg_connection *)
-	                mg_calloc(1, sizeof(*conn) + MAX_REQUEST_SIZE)) == NULL) {
+		return NULL;
+	}
+	if ((conn = (struct mg_connection *)
+	         mg_calloc(1, sizeof(*conn) + MAX_REQUEST_SIZE)) == NULL) {
 		mg_snprintf(NULL,
 		            NULL, /* No truncation check for ebuf */
 		            ebuf,
@@ -13352,11 +13355,13 @@ mg_connect_client_impl(const struct mg_client_options *client_options,
 		            "calloc(): %s",
 		            strerror(ERRNO));
 		closesocket(sock);
+		return NULL;
+	}
+
 #ifndef NO_SSL
 #ifdef OPENSSL_API_1_1
-	} else if (use_ssl
-	           && (conn->client_ssl_ctx = SSL_CTX_new(TLS_client_method()))
-	                  == NULL) {
+	if (use_ssl
+	    && (conn->client_ssl_ctx = SSL_CTX_new(TLS_client_method())) == NULL) {
 		mg_snprintf(NULL,
 		            NULL, /* No truncation check for ebuf */
 		            ebuf,
@@ -13364,11 +13369,12 @@ mg_connect_client_impl(const struct mg_client_options *client_options,
 		            "SSL_CTX_new error");
 		closesocket(sock);
 		mg_free(conn);
-		conn = NULL;
+		return NULL;
+	}
 #else
-	} else if (use_ssl
-	           && (conn->client_ssl_ctx = SSL_CTX_new(SSLv23_client_method()))
-	                  == NULL) {
+	if (use_ssl
+	    && (conn->client_ssl_ctx = SSL_CTX_new(SSLv23_client_method()))
+	           == NULL) {
 		mg_snprintf(NULL,
 		            NULL, /* No truncation check for ebuf */
 		            ebuf,
@@ -13376,98 +13382,91 @@ mg_connect_client_impl(const struct mg_client_options *client_options,
 		            "SSL_CTX_new error");
 		closesocket(sock);
 		mg_free(conn);
-		conn = NULL;
+		return NULL;
+	}
 #endif /* OPENSSL_API_1_1 */
 #endif /* NO_SSL */
 
-	} else {
 
 #ifdef USE_IPV6
-		socklen_t len = (sa.sa.sa_family == AF_INET)
-		                    ? sizeof(conn->client.rsa.sin)
-		                    : sizeof(conn->client.rsa.sin6);
-		struct sockaddr *psa =
-		    (sa.sa.sa_family == AF_INET)
-		        ? (struct sockaddr *)&(conn->client.rsa.sin)
-		        : (struct sockaddr *)&(conn->client.rsa.sin6);
+	socklen_t len = (sa.sa.sa_family == AF_INET)
+	                    ? sizeof(conn->client.rsa.sin)
+	                    : sizeof(conn->client.rsa.sin6);
+	struct sockaddr *psa = (sa.sa.sa_family == AF_INET)
+	                           ? (struct sockaddr *)&(conn->client.rsa.sin)
+	                           : (struct sockaddr *)&(conn->client.rsa.sin6);
 #else
-		socklen_t len = sizeof(conn->client.rsa.sin);
-		struct sockaddr *psa = (struct sockaddr *)&(conn->client.rsa.sin);
+	socklen_t len = sizeof(conn->client.rsa.sin);
+	struct sockaddr *psa = (struct sockaddr *)&(conn->client.rsa.sin);
 #endif
 
-		conn->buf_size = MAX_REQUEST_SIZE;
-		conn->buf = (char *)(conn + 1);
-		conn->ctx = &fake_ctx;
-		conn->client.sock = sock;
-		conn->client.lsa = sa;
+	conn->buf_size = MAX_REQUEST_SIZE;
+	conn->buf = (char *)(conn + 1);
+	conn->ctx = &fake_ctx;
+	conn->client.sock = sock;
+	conn->client.lsa = sa;
 
-		if (getsockname(sock, psa, &len) != 0) {
-			mg_cry(conn,
-			       "%s: getsockname() failed: %s",
-			       __func__,
-			       strerror(ERRNO));
-		}
+	if (getsockname(sock, psa, &len) != 0) {
+		mg_cry(conn, "%s: getsockname() failed: %s", __func__, strerror(ERRNO));
+	}
 
-		conn->client.is_ssl = use_ssl ? 1 : 0;
-		(void)pthread_mutex_init(&conn->mutex, &pthread_mutex_attr);
+	conn->client.is_ssl = use_ssl ? 1 : 0;
+	(void)pthread_mutex_init(&conn->mutex, &pthread_mutex_attr);
 
 #ifndef NO_SSL
-		if (use_ssl) {
-			fake_ctx.ssl_ctx = conn->client_ssl_ctx;
-
-			/* TODO: Check ssl_verify_peer and ssl_ca_path here.
-			 * SSL_CTX_set_verify call is needed to switch off server
-			 * certificate checking, which is off by default in OpenSSL and
-			 * on in yaSSL. */
-			/* TODO: SSL_CTX_set_verify(conn->client_ssl_ctx,
-			 * SSL_VERIFY_PEER, verify_ssl_server); */
-
-			if (client_options->client_cert) {
-				if (!ssl_use_pem_file(&fake_ctx,
-				                      client_options->client_cert,
-				                      NULL)) {
-					mg_snprintf(NULL,
-					            NULL, /* No truncation check for ebuf */
-					            ebuf,
-					            ebuf_len,
-					            "Can not use SSL client certificate");
-					SSL_CTX_free(conn->client_ssl_ctx);
-					closesocket(sock);
-					mg_free(conn);
-					conn = NULL;
-				}
-			}
-
-			if (client_options->server_cert) {
-				SSL_CTX_load_verify_locations(conn->client_ssl_ctx,
-				                              client_options->server_cert,
-				                              NULL);
-				SSL_CTX_set_verify(conn->client_ssl_ctx, SSL_VERIFY_PEER, NULL);
-			} else {
-				SSL_CTX_set_verify(conn->client_ssl_ctx, SSL_VERIFY_NONE, NULL);
-			}
-
-			if (!sslize(conn,
-			            conn->client_ssl_ctx,
-			            SSL_connect,
-			            &(conn->ctx->stop_flag))) {
+	if (use_ssl) {
+		fake_ctx.ssl_ctx = conn->client_ssl_ctx;
+
+		/* TODO: Check ssl_verify_peer and ssl_ca_path here.
+		 * SSL_CTX_set_verify call is needed to switch off server
+		 * certificate checking, which is off by default in OpenSSL and
+		 * on in yaSSL. */
+		/* TODO: SSL_CTX_set_verify(conn->client_ssl_ctx,
+		 * SSL_VERIFY_PEER, verify_ssl_server); */
+
+		if (client_options->client_cert) {
+			if (!ssl_use_pem_file(&fake_ctx,
+			                      client_options->client_cert,
+			                      NULL)) {
 				mg_snprintf(NULL,
 				            NULL, /* No truncation check for ebuf */
 				            ebuf,
 				            ebuf_len,
-				            "SSL connection error");
+				            "Can not use SSL client certificate");
 				SSL_CTX_free(conn->client_ssl_ctx);
 				closesocket(sock);
 				mg_free(conn);
-				conn = NULL;
+				return NULL;
 			}
 		}
-#endif
-	}
 
-	if (conn) {
-		set_blocking_mode(sock, 0);
+		if (client_options->server_cert) {
+			SSL_CTX_load_verify_locations(conn->client_ssl_ctx,
+			                              client_options->server_cert,
+			                              NULL);
+			SSL_CTX_set_verify(conn->client_ssl_ctx, SSL_VERIFY_PEER, NULL);
+		} else {
+			SSL_CTX_set_verify(conn->client_ssl_ctx, SSL_VERIFY_NONE, NULL);
+		}
+
+		if (!sslize(conn,
+		            conn->client_ssl_ctx,
+		            SSL_connect,
+		            &(conn->ctx->stop_flag))) {
+			mg_snprintf(NULL,
+			            NULL, /* No truncation check for ebuf */
+			            ebuf,
+			            ebuf_len,
+			            "SSL connection error");
+			SSL_CTX_free(conn->client_ssl_ctx);
+			closesocket(sock);
+			mg_free(conn);
+			return NULL;
+		}
 	}
+#endif
+
+	set_blocking_mode(sock, 0);
 
 	return conn;
 }