From: Daniel Stenberg Date: Thu, 22 Feb 2024 07:38:53 +0000 (+0100) Subject: CURLINFO_USED_PROXY: return bool whether the proxy was used X-Git-Tag: curl-8_7_0~153 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cc04c7367740bb6db0e47368247b8b0c70c376cb;p=thirdparty%2Fcurl.git CURLINFO_USED_PROXY: return bool whether the proxy was used Adds test536 to verify Closes #12719 --- diff --git a/docs/libcurl/curl_easy_getinfo.md b/docs/libcurl/curl_easy_getinfo.md index eb5608be9c..bd18aa7c63 100644 --- a/docs/libcurl/curl_easy_getinfo.md +++ b/docs/libcurl/curl_easy_getinfo.md @@ -120,6 +120,10 @@ See CURLINFO_PRETRANSFER_TIME_T(3) 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. diff --git a/docs/libcurl/opts/CURLINFO_USED_PROXY.md b/docs/libcurl/opts/CURLINFO_USED_PROXY.md new file mode 100644 index 0000000000..98fafa78f1 --- /dev/null +++ b/docs/libcurl/opts/CURLINFO_USED_PROXY.md @@ -0,0 +1,69 @@ +--- +c: Copyright (C) Daniel Stenberg, , 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 + +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. diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc index be7035bf00..7a292b81d5 100644 --- a/docs/libcurl/opts/Makefile.inc +++ b/docs/libcurl/opts/Makefile.inc @@ -95,6 +95,7 @@ man_MANS = \ 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 \ diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index c20008a731..a627dd68b6 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -506,6 +506,7 @@ CURLINFO_TLS_SSL_PTR 7.48.0 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 diff --git a/include/curl/curl.h b/include/curl/curl.h index eb06022501..b2377b7895 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -2938,7 +2938,8 @@ typedef enum { 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 diff --git a/lib/connect.c b/lib/connect.c index 55bd49d8d3..5e0f8b2392 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -158,6 +158,13 @@ void Curl_persistconninfo(struct Curl_easy *data, struct connectdata *conn, 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 * diff --git a/lib/getinfo.c b/lib/getinfo.c index 2f74629e1e..aaf17713f3 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -180,7 +180,6 @@ static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info, *param_charp = NULL; #endif break; - default: return CURLE_UNKNOWN_OPTION; } @@ -334,6 +333,15 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info, 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; } diff --git a/lib/urldata.h b/lib/urldata.h index c0e6445198..5f61f26302 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1167,6 +1167,7 @@ struct PureInfo { 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 */ }; diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 546e4ad482..c20f90d945 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -80,7 +80,7 @@ test499 test500 test501 test502 test503 test504 test505 test506 test507 \ 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 \ diff --git a/tests/data/test536 b/tests/data/test536 new file mode 100644 index 0000000000..dc78f2a651 --- /dev/null +++ b/tests/data/test536 @@ -0,0 +1,76 @@ + + + +HTTP +HTTP GET +HTTP proxy +CURLOPT_PROXY +CURLOPT_NOBODY +CURLINFO_USED_PROXY + + + +# +# Server-side + + +HTTP/1.1 200 OK swsclose +Date: Tue, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Last-Modified: Tue, 13 Jun 2000 12:10:00 GMT +ETag: "21025-dc7-39462498" +Accept-Ranges: bytes +Content-Length: 6 + +hello + + + +# +# Client-side + + +http + + +lib%TESTNUMBER + + +CURLINFO_USED_PROXY + + +# provides: +# 0 - the proxy URL +# 1 - the non-proxy using URL +# 2 - the CURLOPT_RESOLVE string to change IP for the name +# + +http://%HOSTIP:%HTTPPORT goingdirect.com:%HTTPPORT goingdirect.com:%HTTPPORT:%HOSTIP + + +proxy + + + +# +# Verify data after the test has been "shot" + + +GET http://usingproxy.com/ HTTP/1.1 +Host: usingproxy.com +Accept: */* +Proxy-Connection: Keep-Alive + +GET / HTTP/1.1 +Host: goingdirect.com:%HTTPPORT +Accept: */* + + + +hello +This used the proxy +hello +This DID NOT use the proxy + + + diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index c4d36a26b3..1a61deb623 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc @@ -42,7 +42,8 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect libprereq \ 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 \ @@ -168,6 +169,8 @@ lib532_CPPFLAGS = $(AM_CPPFLAGS) -DLIB532 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) diff --git a/tests/libtest/lib536.c b/tests/libtest/lib536.c new file mode 100644 index 0000000000..7e53e22555 --- /dev/null +++ b/tests/libtest/lib536.c @@ -0,0 +1,84 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , 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; +}