diff --git a/mongoose.c b/mongoose.c
index e0e370a998340e9c897201dbae99ca10dbdc2b04..6aabb5c0ab857342fa6c58110728d5cdd0307bae 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -5113,9 +5113,9 @@ struct mg_http_proto_data {
 static void mg_http_conn_destructor(void *proto_data);
 struct mg_connection *mg_connect_http_base(
     struct mg_mgr *mgr, MG_CB(mg_event_handler_t ev_handler, void *user_data),
-    struct mg_connect_opts opts, const char *schema, const char *schema_ssl,
-    const char *url, struct mg_str *path, struct mg_str *user_info,
-    struct mg_str *host);
+    struct mg_connect_opts opts, const char *scheme1, const char *scheme2,
+    const char *scheme_ssl1, const char *scheme_ssl2, const char *url,
+    struct mg_str *path, struct mg_str *user_info, struct mg_str *host);
 
 static struct mg_http_proto_data *mg_http_get_proto_data(
     struct mg_connection *c) {
@@ -7119,9 +7119,9 @@ void mg_http_reverse_proxy(struct mg_connection *nc,
   mg_asprintf(&purl, sizeof(burl), "%.*s%.*s", (int) upstream.len, upstream.p,
               (int) (hm->uri.len - mount.len), hm->uri.p + mount.len);
 
-  be =
-      mg_connect_http_base(nc->mgr, MG_CB(mg_reverse_proxy_handler, NULL), opts,
-                           "http", "https", purl, &path, &user_info, &host);
+  be = mg_connect_http_base(nc->mgr, MG_CB(mg_reverse_proxy_handler, NULL),
+                            opts, "http", NULL, "https", NULL, purl, &path,
+                            &user_info, &host);
   LOG(LL_DEBUG, ("Proxying %.*s to %s (rule: %.*s)", (int) hm->uri.len,
                  hm->uri.p, purl, (int) mount.len, mount.p));
 
@@ -7725,9 +7725,9 @@ void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_data,
 
 struct mg_connection *mg_connect_http_base(
     struct mg_mgr *mgr, MG_CB(mg_event_handler_t ev_handler, void *user_data),
-    struct mg_connect_opts opts, const char *schema, const char *schema_ssl,
-    const char *url, struct mg_str *path, struct mg_str *user_info,
-    struct mg_str *host) {
+    struct mg_connect_opts opts, const char *scheme1, const char *scheme2,
+    const char *scheme_ssl1, const char *scheme_ssl2, const char *url,
+    struct mg_str *path, struct mg_str *user_info, struct mg_str *host) {
   struct mg_connection *nc = NULL;
   unsigned int port_i = 0;
   int use_ssl = 0;
@@ -7741,10 +7741,12 @@ struct mg_connection *mg_connect_http_base(
     goto out;
   }
 
-  if (mg_vcmp(&scheme, schema) == 0) {
+  if (scheme.len == 0 || mg_vcmp(&scheme, scheme1) == 0 ||
+      (scheme2 != NULL && mg_vcmp(&scheme, scheme2) == 0)) {
     use_ssl = 0;
     if (port_i == 0) port_i = 80;
-  } else if (mg_vcmp(&scheme, schema_ssl) == 0) {
+  } else if (mg_vcmp(&scheme, scheme_ssl1) == 0 ||
+             (scheme2 != NULL && mg_vcmp(&scheme, scheme_ssl2) == 0)) {
     use_ssl = 1;
     if (port_i == 0) port_i = 443;
   } else {
@@ -7791,7 +7793,7 @@ struct mg_connection *mg_connect_http_opt(
   struct mbuf auth;
   struct mg_connection *nc =
       mg_connect_http_base(mgr, MG_CB(ev_handler, user_data), opts, "http",
-                           "https", url, &path, &user, &host);
+                           NULL, "https", NULL, url, &path, &user, &host);
 
   if (nc == NULL) {
     return NULL;
@@ -9304,8 +9306,8 @@ struct mg_connection *mg_connect_ws_opt(
   struct mg_str null_str = MG_NULL_STR;
   struct mg_str host = MG_NULL_STR, path = MG_NULL_STR, user_info = MG_NULL_STR;
   struct mg_connection *nc =
-      mg_connect_http_base(mgr, MG_CB(ev_handler, user_data), opts, "ws", "wss",
-                           url, &path, &user_info, &host);
+      mg_connect_http_base(mgr, MG_CB(ev_handler, user_data), opts, "http",
+                           "ws", "https", "wss", url, &path, &user_info, &host);
   if (nc != NULL) {
     mg_send_websocket_handshake3v(nc, path, host, mg_mk_str(protocol),
                                   mg_mk_str(extra_headers), user_info,