diff --git a/docs/libcurl/opts/CURLINFO_SCHEME.md b/docs/libcurl/opts/CURLINFO_SCHEME.md
index 5b89bfc142..22e0a7a8e4 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.md
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.md
@@ -33,8 +33,11 @@ string holding the URL scheme used for the most recent connection done with
this CURL **handle**.
The **scheme** pointer is NULL or points to private memory. You MUST NOT
-free - it gets freed when you call curl_easy_cleanup(3) on the
-corresponding CURL handle.
+free - it gets freed when you call curl_easy_cleanup(3) on the corresponding
+CURL handle.
+
+The returned scheme might be upper or lowercase. Do comparisons case
+insensitively.
# EXAMPLE
diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c
index b9ddf7c56f..76eff787b9 100644
--- a/lib/curl_rtmp.c
+++ b/lib/curl_rtmp.c
@@ -68,7 +68,7 @@ static Curl_send rtmp_send;
*/
const struct Curl_handler Curl_handler_rtmp = {
- "RTMP", /* scheme */
+ "rtmp", /* scheme */
rtmp_setup_connection, /* setup_connection */
rtmp_do, /* do_it */
rtmp_done, /* done */
@@ -92,7 +92,7 @@ const struct Curl_handler Curl_handler_rtmp = {
};
const struct Curl_handler Curl_handler_rtmpt = {
- "RTMPT", /* scheme */
+ "rtmpt", /* scheme */
rtmp_setup_connection, /* setup_connection */
rtmp_do, /* do_it */
rtmp_done, /* done */
@@ -116,7 +116,7 @@ const struct Curl_handler Curl_handler_rtmpt = {
};
const struct Curl_handler Curl_handler_rtmpe = {
- "RTMPE", /* scheme */
+ "rtmpe", /* scheme */
rtmp_setup_connection, /* setup_connection */
rtmp_do, /* do_it */
rtmp_done, /* done */
@@ -140,7 +140,7 @@ const struct Curl_handler Curl_handler_rtmpe = {
};
const struct Curl_handler Curl_handler_rtmpte = {
- "RTMPTE", /* scheme */
+ "rtmpte", /* scheme */
rtmp_setup_connection, /* setup_connection */
rtmp_do, /* do_it */
rtmp_done, /* done */
@@ -164,7 +164,7 @@ const struct Curl_handler Curl_handler_rtmpte = {
};
const struct Curl_handler Curl_handler_rtmps = {
- "RTMPS", /* scheme */
+ "rtmps", /* scheme */
rtmp_setup_connection, /* setup_connection */
rtmp_do, /* do_it */
rtmp_done, /* done */
@@ -188,7 +188,7 @@ const struct Curl_handler Curl_handler_rtmps = {
};
const struct Curl_handler Curl_handler_rtmpts = {
- "RTMPTS", /* scheme */
+ "rtmpts", /* scheme */
rtmp_setup_connection, /* setup_connection */
rtmp_do, /* do_it */
rtmp_done, /* done */
diff --git a/lib/dict.c b/lib/dict.c
index 5404671c64..a26a28b7b2 100644
--- a/lib/dict.c
+++ b/lib/dict.c
@@ -76,7 +76,7 @@ static CURLcode dict_do(struct Curl_easy *data, bool *done);
*/
const struct Curl_handler Curl_handler_dict = {
- "DICT", /* scheme */
+ "dict", /* scheme */
ZERO_NULL, /* setup_connection */
dict_do, /* do_it */
ZERO_NULL, /* done */
diff --git a/lib/file.c b/lib/file.c
index cae1cee59c..db860225b0 100644
--- a/lib/file.c
+++ b/lib/file.c
@@ -109,7 +109,7 @@ static CURLcode file_setup_connection(struct Curl_easy *data,
*/
const struct Curl_handler Curl_handler_file = {
- "FILE", /* scheme */
+ "file", /* scheme */
file_setup_connection, /* setup_connection */
file_do, /* do_it */
file_done, /* done */
diff --git a/lib/ftp.c b/lib/ftp.c
index 9e10704f2c..cdd93d84ea 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -163,7 +163,7 @@ static CURLcode ftp_dophase_done(struct Curl_easy *data,
*/
const struct Curl_handler Curl_handler_ftp = {
- "FTP", /* scheme */
+ "ftp", /* scheme */
ftp_setup_connection, /* setup_connection */
ftp_do, /* do_it */
ftp_done, /* done */
@@ -195,7 +195,7 @@ const struct Curl_handler Curl_handler_ftp = {
*/
const struct Curl_handler Curl_handler_ftps = {
- "FTPS", /* scheme */
+ "ftps", /* scheme */
ftp_setup_connection, /* setup_connection */
ftp_do, /* do_it */
ftp_done, /* done */
diff --git a/lib/gopher.c b/lib/gopher.c
index 7ba070a769..311bd3798e 100644
--- a/lib/gopher.c
+++ b/lib/gopher.c
@@ -62,7 +62,7 @@ static CURLcode gopher_connecting(struct Curl_easy *data, bool *done);
*/
const struct Curl_handler Curl_handler_gopher = {
- "GOPHER", /* scheme */
+ "gopher", /* scheme */
ZERO_NULL, /* setup_connection */
gopher_do, /* do_it */
ZERO_NULL, /* done */
@@ -87,7 +87,7 @@ const struct Curl_handler Curl_handler_gopher = {
#ifdef USE_SSL
const struct Curl_handler Curl_handler_gophers = {
- "GOPHERS", /* scheme */
+ "gophers", /* scheme */
ZERO_NULL, /* setup_connection */
gopher_do, /* do_it */
ZERO_NULL, /* done */
diff --git a/lib/http.c b/lib/http.c
index 92d991c1a7..839b829479 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -109,7 +109,7 @@ static void http_exp100_send_anyway(struct Curl_easy *data);
* HTTP handler interface.
*/
const struct Curl_handler Curl_handler_http = {
- "HTTP", /* scheme */
+ "http", /* scheme */
Curl_http_setup_conn, /* setup_connection */
Curl_http, /* do_it */
Curl_http_done, /* done */
@@ -138,7 +138,7 @@ const struct Curl_handler Curl_handler_http = {
* HTTPS handler interface.
*/
const struct Curl_handler Curl_handler_https = {
- "HTTPS", /* scheme */
+ "https", /* scheme */
Curl_http_setup_conn, /* setup_connection */
Curl_http, /* do_it */
Curl_http_done, /* done */
diff --git a/lib/imap.c b/lib/imap.c
index 679bfae977..f6e98bd81d 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -117,7 +117,7 @@ static CURLcode imap_get_message(struct Curl_easy *data, struct bufref *out);
*/
const struct Curl_handler Curl_handler_imap = {
- "IMAP", /* scheme */
+ "imap", /* scheme */
imap_setup_connection, /* setup_connection */
imap_do, /* do_it */
imap_done, /* done */
@@ -147,7 +147,7 @@ const struct Curl_handler Curl_handler_imap = {
*/
const struct Curl_handler Curl_handler_imaps = {
- "IMAPS", /* scheme */
+ "imaps", /* scheme */
imap_setup_connection, /* setup_connection */
imap_do, /* do_it */
imap_done, /* done */
diff --git a/lib/ldap.c b/lib/ldap.c
index a545f87d9d..0afc32c92f 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -164,7 +164,7 @@ static CURLcode ldap_do(struct Curl_easy *data, bool *done);
*/
const struct Curl_handler Curl_handler_ldap = {
- "LDAP", /* scheme */
+ "ldap", /* scheme */
ZERO_NULL, /* setup_connection */
ldap_do, /* do_it */
ZERO_NULL, /* done */
@@ -193,7 +193,7 @@ const struct Curl_handler Curl_handler_ldap = {
*/
const struct Curl_handler Curl_handler_ldaps = {
- "LDAPS", /* scheme */
+ "ldaps", /* scheme */
ZERO_NULL, /* setup_connection */
ldap_do, /* do_it */
ZERO_NULL, /* done */
diff --git a/lib/mqtt.c b/lib/mqtt.c
index 6f150cee45..4ca24eb41c 100644
--- a/lib/mqtt.c
+++ b/lib/mqtt.c
@@ -75,7 +75,7 @@ static CURLcode mqtt_setup_conn(struct Curl_easy *data,
*/
const struct Curl_handler Curl_handler_mqtt = {
- "MQTT", /* scheme */
+ "mqtt", /* scheme */
mqtt_setup_conn, /* setup_connection */
mqtt_do, /* do_it */
mqtt_done, /* done */
diff --git a/lib/openldap.c b/lib/openldap.c
index a5fac50577..0348ef5bab 100644
--- a/lib/openldap.c
+++ b/lib/openldap.c
@@ -117,7 +117,7 @@ static Curl_recv oldap_recv;
*/
const struct Curl_handler Curl_handler_ldap = {
- "LDAP", /* scheme */
+ "ldap", /* scheme */
oldap_setup_connection, /* setup_connection */
oldap_do, /* do_it */
oldap_done, /* done */
@@ -146,7 +146,7 @@ const struct Curl_handler Curl_handler_ldap = {
*/
const struct Curl_handler Curl_handler_ldaps = {
- "LDAPS", /* scheme */
+ "ldaps", /* scheme */
oldap_setup_connection, /* setup_connection */
oldap_do, /* do_it */
oldap_done, /* done */
diff --git a/lib/pop3.c b/lib/pop3.c
index 85c12cbf2c..9a30331529 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -112,7 +112,7 @@ static CURLcode pop3_get_message(struct Curl_easy *data, struct bufref *out);
*/
const struct Curl_handler Curl_handler_pop3 = {
- "POP3", /* scheme */
+ "pop3", /* scheme */
pop3_setup_connection, /* setup_connection */
pop3_do, /* do_it */
pop3_done, /* done */
@@ -142,7 +142,7 @@ const struct Curl_handler Curl_handler_pop3 = {
*/
const struct Curl_handler Curl_handler_pop3s = {
- "POP3S", /* scheme */
+ "pop3s", /* scheme */
pop3_setup_connection, /* setup_connection */
pop3_do, /* do_it */
pop3_done, /* done */
diff --git a/lib/rtsp.c b/lib/rtsp.c
index 89fe4bbb85..1f162daa06 100644
--- a/lib/rtsp.c
+++ b/lib/rtsp.c
@@ -100,7 +100,7 @@ CURLcode rtsp_parse_transport(struct Curl_easy *data, const char *transport);
* RTSP handler interface.
*/
const struct Curl_handler Curl_handler_rtsp = {
- "RTSP", /* scheme */
+ "rtsp", /* scheme */
rtsp_setup_connection, /* setup_connection */
rtsp_do, /* do_it */
rtsp_done, /* done */
diff --git a/lib/smb.c b/lib/smb.c
index 2ce6dbf7fc..cab1e757f3 100644
--- a/lib/smb.c
+++ b/lib/smb.c
@@ -259,7 +259,7 @@ static CURLcode smb_parse_url_path(struct Curl_easy *data,
* SMB handler interface
*/
const struct Curl_handler Curl_handler_smb = {
- "SMB", /* scheme */
+ "smb", /* scheme */
smb_setup_connection, /* setup_connection */
smb_do, /* do_it */
ZERO_NULL, /* done */
@@ -287,7 +287,7 @@ const struct Curl_handler Curl_handler_smb = {
* SMBS handler interface
*/
const struct Curl_handler Curl_handler_smbs = {
- "SMBS", /* scheme */
+ "smbs", /* scheme */
smb_setup_connection, /* setup_connection */
smb_do, /* do_it */
ZERO_NULL, /* done */
diff --git a/lib/smtp.c b/lib/smtp.c
index a0cb38a8f5..dd231a521e 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -118,7 +118,7 @@ static CURLcode cr_eob_add(struct Curl_easy *data);
*/
const struct Curl_handler Curl_handler_smtp = {
- "SMTP", /* scheme */
+ "smtp", /* scheme */
smtp_setup_connection, /* setup_connection */
smtp_do, /* do_it */
smtp_done, /* done */
@@ -148,7 +148,7 @@ const struct Curl_handler Curl_handler_smtp = {
*/
const struct Curl_handler Curl_handler_smtps = {
- "SMTPS", /* scheme */
+ "smtps", /* scheme */
smtp_setup_connection, /* setup_connection */
smtp_do, /* do_it */
smtp_done, /* done */
diff --git a/lib/telnet.c b/lib/telnet.c
index 7c28504494..227a166f2f 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -173,7 +173,7 @@ struct TELNET {
*/
const struct Curl_handler Curl_handler_telnet = {
- "TELNET", /* scheme */
+ "telnet", /* scheme */
ZERO_NULL, /* setup_connection */
telnet_do, /* do_it */
telnet_done, /* done */
diff --git a/lib/tftp.c b/lib/tftp.c
index 4667ae1e42..09355f1e6e 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -168,7 +168,7 @@ static CURLcode tftp_translate_code(tftp_error_t error);
*/
const struct Curl_handler Curl_handler_tftp = {
- "TFTP", /* scheme */
+ "tftp", /* scheme */
tftp_setup_connection, /* setup_connection */
tftp_do, /* do_it */
tftp_done, /* done */
diff --git a/lib/url.c b/lib/url.c
index fc3a4356e4..d7e58abc3e 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -2083,19 +2083,13 @@ static char *detect_proxy(struct Curl_easy *data,
* For compatibility, the all-uppercase versions of these variables are
* checked if the lowercase versions don't exist.
*/
- char proxy_env[128];
- const char *protop = conn->handler->scheme;
+ char proxy_env[20];
char *envp = proxy_env;
#ifdef CURL_DISABLE_VERBOSE_STRINGS
(void)data;
#endif
- /* Now, build _proxy and check for such a one to use */
- while(*protop)
- *envp++ = Curl_raw_tolower(*protop++);
-
- /* append _proxy */
- strcpy(envp, "_proxy");
+ msnprintf(proxy_env, sizeof(proxy_env), "%s_proxy", conn->handler->scheme);
/* read the protocol proxy: */
proxy = curl_getenv(proxy_env);
@@ -2118,7 +2112,6 @@ static char *detect_proxy(struct Curl_easy *data,
proxy = curl_getenv(proxy_env);
}
- envp = proxy_env;
if(!proxy) {
#ifdef USE_WEBSOCKETS
/* websocket proxy fallbacks */
diff --git a/lib/urldata.h b/lib/urldata.h
index aa3cc44474..7a0878ab71 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -657,7 +657,7 @@ enum doh_slots {
*/
struct Curl_handler {
- const char *scheme; /* URL scheme name. */
+ const char *scheme; /* URL scheme name in lowercase */
/* Complement to setup_connection_internals(). This is done before the
transfer "owns" the connection. */
diff --git a/tests/data/test1438 b/tests/data/test1438
index 90610a8297..cbf19550d0 100644
--- a/tests/data/test1438
+++ b/tests/data/test1438
@@ -44,7 +44,7 @@ Connection: close
Content-Type: text/plain
testdata
-HTTP
+http
GET /%TESTNUMBER HTTP/1.1
diff --git a/tests/data/test970 b/tests/data/test970
index 94e00df1ce..c87a296faf 100644
--- a/tests/data/test970
+++ b/tests/data/test970
@@ -59,7 +59,7 @@ Accept: */*
-{"certs":"","content_type":"text/html","conn_id":0,"errormsg":null,"exitcode":0,"filename_effective":"%LOGDIR/out%TESTNUMBER","ftp_entry_path":null,"http_code":200,"http_connect":0,"http_version":"1.1","local_ip":"127.0.0.1","local_port":13,"method":"GET","num_certs":0,"num_connects":1,"num_headers":9,"num_redirects":0,"proxy_ssl_verify_result":0,"proxy_used":0,"redirect_url":null,"referer":null,"remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"response_code":200,"scheme":"HTTP","size_download":445,"size_header":4019,"size_request":4019,"size_upload":0,"speed_download":13,"speed_upload":13,"ssl_verify_result":0,"time_appconnect":0.000013,"time_connect":0.000013,"time_namelookup":0.000013,"time_pretransfer":0.000013,"time_redirect":0.000013,"time_starttransfer":0.000013,"time_total":0.000013,"url":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","url.scheme":"http","url.user":null,"url.password":null,"url.options":null,"url.host":"%HOSTIP","url.port":"%HTTPPORT","url.path":"/%TESTNUMBER","url.query":null,"url.fragment":null,"url.zoneid":null,"urle.scheme":"http","urle.user":null,"urle.password":null,"urle.options":null,"urle.host":"%HOSTIP","urle.port":"%HTTPPORT","urle.path":"/%TESTNUMBER","urle.query":null,"urle.fragment":null,"urle.zoneid":null,"url_effective":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","urlnum":0,"xfer_id":0,"curl_version":"curl-unit-test-fake-version"}
+{"certs":"","content_type":"text/html","conn_id":0,"errormsg":null,"exitcode":0,"filename_effective":"%LOGDIR/out%TESTNUMBER","ftp_entry_path":null,"http_code":200,"http_connect":0,"http_version":"1.1","local_ip":"127.0.0.1","local_port":13,"method":"GET","num_certs":0,"num_connects":1,"num_headers":9,"num_redirects":0,"proxy_ssl_verify_result":0,"proxy_used":0,"redirect_url":null,"referer":null,"remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"response_code":200,"scheme":"http","size_download":445,"size_header":4019,"size_request":4019,"size_upload":0,"speed_download":13,"speed_upload":13,"ssl_verify_result":0,"time_appconnect":0.000013,"time_connect":0.000013,"time_namelookup":0.000013,"time_pretransfer":0.000013,"time_redirect":0.000013,"time_starttransfer":0.000013,"time_total":0.000013,"url":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","url.scheme":"http","url.user":null,"url.password":null,"url.options":null,"url.host":"%HOSTIP","url.port":"%HTTPPORT","url.path":"/%TESTNUMBER","url.query":null,"url.fragment":null,"url.zoneid":null,"urle.scheme":"http","urle.user":null,"urle.password":null,"urle.options":null,"urle.host":"%HOSTIP","urle.port":"%HTTPPORT","urle.path":"/%TESTNUMBER","urle.query":null,"urle.fragment":null,"urle.zoneid":null,"url_effective":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","urlnum":0,"xfer_id":0,"curl_version":"curl-unit-test-fake-version"}
diff --git a/tests/data/test972 b/tests/data/test972
index 735c959976..ebaf4a346e 100644
--- a/tests/data/test972
+++ b/tests/data/test972
@@ -60,7 +60,7 @@ Accept: */*
-{"certs":"","content_type":"text/html","conn_id":0,"errormsg":null,"exitcode":0,"filename_effective":"%LOGDIR/out972","ftp_entry_path":null,"http_code":200,"http_connect":0,"http_version":"1.1","local_ip":"%HOSTIP","local_port":13,"method":"GET","num_certs":0,"num_connects":1,"num_headers":9,"num_redirects":0,"proxy_ssl_verify_result":0,"proxy_used":0,"redirect_url":null,"referer":null,"remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"response_code":200,"scheme":"HTTP","size_download":445,"size_header":4019,"size_request":4019,"size_upload":0,"speed_download":13,"speed_upload":13,"ssl_verify_result":0,"time_appconnect":0.000013,"time_connect":0.000013,"time_namelookup":0.000013,"time_pretransfer":0.000013,"time_redirect":0.000013,"time_starttransfer":0.000013,"time_total":0.000013,"url":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","url.scheme":"http","url.user":null,"url.password":null,"url.options":null,"url.host":"%HOSTIP","url.port":"%HTTPPORT","url.path":"/%TESTNUMBER","url.query":null,"url.fragment":null,"url.zoneid":null,"urle.scheme":"http","urle.user":null,"urle.password":null,"urle.options":null,"urle.host":"%HOSTIP","urle.port":"%HTTPPORT","urle.path":"/%TESTNUMBER","urle.query":null,"urle.fragment":null,"urle.zoneid":null,"url_effective":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","urlnum":0,"xfer_id":0,"curl_version":"curl-unit-test-fake-version"}
+{"certs":"","content_type":"text/html","conn_id":0,"errormsg":null,"exitcode":0,"filename_effective":"%LOGDIR/out972","ftp_entry_path":null,"http_code":200,"http_connect":0,"http_version":"1.1","local_ip":"%HOSTIP","local_port":13,"method":"GET","num_certs":0,"num_connects":1,"num_headers":9,"num_redirects":0,"proxy_ssl_verify_result":0,"proxy_used":0,"redirect_url":null,"referer":null,"remote_ip":"%HOSTIP","remote_port":%HTTPPORT,"response_code":200,"scheme":"http","size_download":445,"size_header":4019,"size_request":4019,"size_upload":0,"speed_download":13,"speed_upload":13,"ssl_verify_result":0,"time_appconnect":0.000013,"time_connect":0.000013,"time_namelookup":0.000013,"time_pretransfer":0.000013,"time_redirect":0.000013,"time_starttransfer":0.000013,"time_total":0.000013,"url":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","url.scheme":"http","url.user":null,"url.password":null,"url.options":null,"url.host":"%HOSTIP","url.port":"%HTTPPORT","url.path":"/%TESTNUMBER","url.query":null,"url.fragment":null,"url.zoneid":null,"urle.scheme":"http","urle.user":null,"urle.password":null,"urle.options":null,"urle.host":"%HOSTIP","urle.port":"%HTTPPORT","urle.path":"/%TESTNUMBER","urle.query":null,"urle.fragment":null,"urle.zoneid":null,"url_effective":"http://%HOSTIP:%HTTPPORT/%TESTNUMBER","urlnum":0,"xfer_id":0,"curl_version":"curl-unit-test-fake-version"}
diff --git a/tests/libtest/lib1536.c b/tests/libtest/lib1536.c
index 9ba7ec18e9..85e54b06f9 100644
--- a/tests/libtest/lib1536.c
+++ b/tests/libtest/lib1536.c
@@ -71,9 +71,9 @@ int test(char *URL)
__FILE__, __LINE__, res, curl_easy_strerror(res));
goto test_cleanup;
}
- if(!scheme || memcmp(scheme, "HTTP", 5) != 0) {
+ if(!scheme || memcmp(scheme, "http", 5) != 0) {
fprintf(stderr, "%s:%d scheme of http resource is incorrect; "
- "expected 'HTTP' but is %s\n",
+ "expected 'http' but is %s\n",
__FILE__, __LINE__,
(scheme == NULL ? "NULL" : "invalid"));
res = CURLE_HTTP_RETURNED_ERROR;