Time during which this transfer was held in a waiting queue.
See CURLINFO_QUEUE_TIME_T(3)
+## CURLINFO_USED_PROXY
+
+Whether the proxy was used (Added in 8.7.0). See CURLINFO_USED_PROXY(3)
+
## CURLINFO_STARTTRANSFER_TIME
Time from start until just when the first byte is received.
--- /dev/null
+---
+c: Copyright (C) Daniel Stenberg, <daniel.se>, et al.
+SPDX-License-Identifier: curl
+Title: CURLINFO_USED_PROXY
+Section: 3
+Source: libcurl
+See-also:
+ - CURLOPT_NOPROXY (3)
+ - CURLOPT_PROXY (3)
+ - curl_easy_getinfo (3)
+ - curl_easy_setopt (3)
+---
+
+# NAME
+
+CURLINFO_USED_PROXY - whether the transfer used a proxy
+
+# SYNOPSIS
+
+~~~c
+#include <curl/curl.h>
+
+CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_USED_PROXY,
+ long *authp);
+~~~
+
+# DESCRIPTION
+
+Pass a pointer to a long. It gets set to zero set if no proxy was used in the
+previous transfer or a non-zero value if a proxy was used.
+
+# PROTOCOLS
+
+HTTP(S)
+
+# EXAMPLE
+
+~~~c
+int main(int argc, char *argv[])
+{
+ CURL *curl = curl_easy_init();
+ if(curl) {
+ CURLcode res;
+ curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
+ curl_easy_setopt(curl, CURLOPT_PROXY, "http://127.0.0.1:80");
+ curl_easy_setopt(curl, CURLOPT_NOPROXY, "example.com");
+
+ res = curl_easy_perform(curl);
+
+ if(!res) {
+ /* extract the available proxy authentication types */
+ long used;
+ res = curl_easy_getinfo(curl, CURLINFO_USED_PROXY, &used);
+ if(!res) {
+ printf("The proxy was %sused\n", used ? "": "NOT ");
+ }
+ }
+ curl_easy_cleanup(curl);
+ }
+}
+~~~
+
+# AVAILABILITY
+
+Added in 8.7.0
+
+# RETURN VALUE
+
+Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
CURLINFO_TLS_SSL_PTR.3 \
CURLINFO_TOTAL_TIME.3 \
CURLINFO_TOTAL_TIME_T.3 \
+ CURLINFO_USED_PROXY.3 \
CURLINFO_XFER_ID.3 \
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \
CURLINFO_TOTAL_TIME 7.4.1
CURLINFO_TOTAL_TIME_T 7.61.0
CURLINFO_TYPEMASK 7.4.1
+CURLINFO_USED_PROXY 8.7.0
CURLINFO_XFER_ID 8.2.0
CURLIOCMD_NOP 7.12.3
CURLIOCMD_RESTARTREAD 7.12.3
CURLINFO_XFER_ID = CURLINFO_OFF_T + 63,
CURLINFO_CONN_ID = CURLINFO_OFF_T + 64,
CURLINFO_QUEUE_TIME_T = CURLINFO_OFF_T + 65,
- CURLINFO_LASTONE = 65
+ CURLINFO_USED_PROXY = CURLINFO_LONG + 66,
+ CURLINFO_LASTONE = 66
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
data->info.conn_primary_port = conn->port;
data->info.conn_remote_port = conn->remote_port;
data->info.conn_local_port = local_port;
+ data->info.used_proxy =
+#ifdef CURL_DISABLE_PROXY
+ 0
+#else
+ conn->bits.proxy
+#endif
+ ;
}
static const struct Curl_addrinfo *
*param_charp = NULL;
#endif
break;
-
default:
return CURLE_UNKNOWN_OPTION;
}
case CURLINFO_PROTOCOL:
*param_longp = data->info.conn_protocol;
break;
+ case CURLINFO_USED_PROXY:
+ *param_longp =
+#ifdef CURL_DISABLE_PROXY
+ 0
+#else
+ data->info.used_proxy
+#endif
+ ;
+ break;
default:
return CURLE_UNKNOWN_OPTION;
}
CURLproxycode pxcode;
BIT(timecond); /* set to TRUE if the time condition didn't match, which
thus made the document NOT get fetched */
+ BIT(used_proxy); /* the transfer used a proxy */
};
test508 test509 test510 test511 test512 test513 test514 test515 test516 \
test517 test518 test519 test520 test521 test522 test523 test524 test525 \
test526 test527 test528 test529 test530 test531 test532 test533 test534 \
-test535 test537 test538 test539 test540 test541 test542 test543 \
+test535 test536 test537 test538 test539 test540 test541 test542 test543 \
test544 test545 test546 test547 test548 test549 test550 test551 test552 \
test553 test554 test555 test556 test557 test558 test559 test560 test561 \
test562 test563 test564 test565 test566 test567 test568 test569 test570 \
--- /dev/null
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+HTTP proxy
+CURLOPT_PROXY
+CURLOPT_NOBODY
+CURLINFO_USED_PROXY
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK swsclose\r
+Date: Tue, 09 Nov 2010 14:49:00 GMT\r
+Server: test-server/fake\r
+Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT\r
+ETag: "21025-dc7-39462498"\r
+Accept-Ranges: bytes\r
+Content-Length: 6\r
+\r
+hello
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib%TESTNUMBER
+</tool>
+<name>
+CURLINFO_USED_PROXY
+</name>
+
+# provides:
+# 0 - the proxy URL
+# 1 - the non-proxy using URL
+# 2 - the CURLOPT_RESOLVE string to change IP for the name
+#
+<command>
+http://%HOSTIP:%HTTPPORT goingdirect.com:%HTTPPORT goingdirect.com:%HTTPPORT:%HOSTIP
+</command>
+<features>
+proxy
+</features>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol crlf="yes">
+GET http://usingproxy.com/ HTTP/1.1
+Host: usingproxy.com
+Accept: */*
+Proxy-Connection: Keep-Alive
+
+GET / HTTP/1.1
+Host: goingdirect.com:%HTTPPORT
+Accept: */*
+
+</protocol>
+<stdout mode="text">
+hello
+This used the proxy
+hello
+This DID NOT use the proxy
+</stdout>
+</verify>
+</testcase>
lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 lib508 lib509 \
lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 lib518 lib519 \
lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib529 lib530 lib532 \
- lib533 lib537 lib539 lib540 lib541 lib542 lib543 lib544 lib545 \
+ lib533 lib536 lib537 lib539 lib540 lib541 lib542 lib543 \
+ lib544 lib545 \
lib547 lib548 lib549 lib552 lib553 lib554 lib555 lib556 lib557 lib558 \
lib559 lib560 lib562 lib564 lib565 lib566 lib567 lib568 lib569 lib570 \
lib571 lib572 lib573 lib574 lib575 lib576 lib578 lib579 lib582 \
lib533_SOURCES = lib533.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib533_LDADD = $(TESTUTIL_LIBS)
+lib536_SOURCES = lib536.c $(SUPPORTFILES)
+
lib537_SOURCES = lib537.c $(SUPPORTFILES) $(WARNLESS) $(MULTIBYTE)
lib539_SOURCES = lib539.c $(SUPPORTFILES)
--- /dev/null
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+#define WITH_PROXY "http://usingproxy.com/"
+#define WITHOUT_PROXY libtest_arg2
+
+static void proxystat(CURL *curl)
+{
+ long wasproxy;
+ if(!curl_easy_getinfo(curl, CURLINFO_USED_PROXY, &wasproxy)) {
+ printf("This %sthe proxy\n", wasproxy ? "used ":
+ "DID NOT use ");
+ }
+}
+
+int test(char *URL)
+{
+ CURLcode res = CURLE_OK;
+ CURL *curl;
+ struct curl_slist *host = NULL;
+
+ if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
+ fprintf(stderr, "curl_global_init() failed\n");
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ curl = curl_easy_init();
+ if(!curl) {
+ fprintf(stderr, "curl_easy_init() failed\n");
+ curl_global_cleanup();
+ return TEST_ERR_MAJOR_BAD;
+ }
+
+ host = curl_slist_append(NULL, libtest_arg3);
+ if(!host)
+ goto test_cleanup;
+
+ test_setopt(curl, CURLOPT_RESOLVE, host);
+ test_setopt(curl, CURLOPT_PROXY, URL);
+ test_setopt(curl, CURLOPT_URL, WITH_PROXY);
+ test_setopt(curl, CURLOPT_NOPROXY, "goingdirect.com");
+ test_setopt(curl, CURLOPT_VERBOSE, 1L);
+
+ res = curl_easy_perform(curl);
+ if(!res) {
+ proxystat(curl);
+ test_setopt(curl, CURLOPT_URL, WITHOUT_PROXY);
+ res = curl_easy_perform(curl);
+ if(!res)
+ proxystat(curl);
+ }
+
+test_cleanup:
+
+ curl_easy_cleanup(curl);
+ curl_slist_free_all(host);
+ curl_global_cleanup();
+
+ return (int)res;
+}