]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
CURLINFO_USED_PROXY: return bool whether the proxy was used
authorDaniel Stenberg <daniel@haxx.se>
Thu, 22 Feb 2024 07:38:53 +0000 (08:38 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 22 Feb 2024 07:38:53 +0000 (08:38 +0100)
Adds test536 to verify

Closes #12719

12 files changed:
docs/libcurl/curl_easy_getinfo.md
docs/libcurl/opts/CURLINFO_USED_PROXY.md [new file with mode: 0644]
docs/libcurl/opts/Makefile.inc
docs/libcurl/symbols-in-versions
include/curl/curl.h
lib/connect.c
lib/getinfo.c
lib/urldata.h
tests/data/Makefile.inc
tests/data/test536 [new file with mode: 0644]
tests/libtest/Makefile.inc
tests/libtest/lib536.c [new file with mode: 0644]

index eb5608be9c1d2b9686dde8f8a1ef25d9d572dd42..bd18aa7c63821b47e9626a5af4501cf0e5940856 100644 (file)
@@ -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 (file)
index 0000000..98fafa7
--- /dev/null
@@ -0,0 +1,69 @@
+---
+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.
index be7035bf00d2b4067861b1b0a284d2730abfab41..7a292b81d5189d3ac03bf0edddb392bc04853a6c 100644 (file)
@@ -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        \
index c20008a7313d36fe92cc9a5832f850a72caf1086..a627dd68b6c37d7a337addb3072cf0a54292a724 100644 (file)
@@ -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
index eb06022501c6fb16ae687b8b5d31faaef92d476e..b2377b7895b9884409e1f13984e139435f77d8a8 100644 (file)
@@ -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
index 55bd49d8d3140354e317c2507c213e67318addf6..5e0f8b239230fa3a65e0bbc934e5ef8c8d0590b2 100644 (file)
@@ -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 *
index 2f74629e1e7e0f1d13d01fdd33959a135b6fb294..aaf17713f3e1b6e4d173a044834c5cca9caace32 100644 (file)
@@ -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;
   }
index c0e64451987cceb4539b33226b7eff3a3f1c1403..5f61f26302bfc89a5fee59f154c08380f0e667cc 100644 (file)
@@ -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 */
 };
 
 
index 546e4ad482da3d1ad662850ceac3bb4ea26faadd..c20f90d945cc90c00304f9462419ad70d53aacad 100644 (file)
@@ -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 (file)
index 0000000..dc78f2a
--- /dev/null
@@ -0,0 +1,76 @@
+<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>
index c4d36a26b3fcc77671ccea39eb9314f4b141e639..1a61deb623416bc3c1df559a7e7c164038a8732d 100644 (file)
@@ -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 (file)
index 0000000..7e53e22
--- /dev/null
@@ -0,0 +1,84 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  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;
+}