From 65e8ba8e1d77f8a31cc7c9d424eee5880e3f08c8 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 7 Nov 2012 23:30:25 +0100 Subject: [PATCH] writeout: -w now supports remote_ip/port and local_ip/port Added mention to the curl.1 man page. Test case 1223 verifies remote_ip/port. --- docs/curl.1 | 14 ++++++++++ src/tool_writeout.c | 32 ++++++++++++++++++++++ tests/data/Makefile.am | 2 +- tests/data/test1223 | 60 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 tests/data/test1223 diff --git a/docs/curl.1 b/docs/curl.1 index 63bf455ad..a13291c0b 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -1524,6 +1524,13 @@ same info. The numerical code that was found in the last response (from a proxy) to a curl CONNECT request. (Added in 7.12.4) .TP +.B local_ip +The IP address of the local end of the most recently done connection - can be +either IPv4 or IPv6 (Added in 7.29.0) +.TP +.B local_port +The local port number of the most recently done connection (Added in 7.29.0) +.TP .B num_connects Number of new connects made in the recent transfer. (Added in 7.12.3) .TP @@ -1534,6 +1541,13 @@ Number of redirects that were followed in the request. (Added in 7.12.3) When an HTTP request was made without -L to follow redirects, this variable will show the actual URL a redirect \fIwould\fP take you to. (Added in 7.18.2) .TP +.B remote_ip +The remote IP address of the most recently done connection - can be either +IPv4 or IPv6 (Added in 7.29.0) +.TP +.B remote_port +The remote port number of the most recently done connection (Added in 7.29.0) +.TP .B size_download The total amount of bytes that were downloaded. .TP diff --git a/src/tool_writeout.c b/src/tool_writeout.c index bbb23af00..e84b7ef22 100644 --- a/src/tool_writeout.c +++ b/src/tool_writeout.c @@ -54,6 +54,10 @@ typedef enum { VAR_REDIRECT_URL, VAR_SSL_VERIFY_RESULT, VAR_EFFECTIVE_FILENAME, + VAR_PRIMARY_IP, + VAR_PRIMARY_PORT, + VAR_LOCAL_IP, + VAR_LOCAL_PORT, VAR_NUM_OF_VARS /* must be the last */ } replaceid; @@ -88,6 +92,10 @@ static const struct variable replacements[]={ {"redirect_url", VAR_REDIRECT_URL}, {"ssl_verify_result", VAR_SSL_VERIFY_RESULT}, {"filename_effective", VAR_EFFECTIVE_FILENAME}, + {"remote_ip", VAR_PRIMARY_IP}, + {"remote_port", VAR_PRIMARY_PORT}, + {"local_ip", VAR_LOCAL_IP}, + {"local_port", VAR_LOCAL_PORT}, {NULL, VAR_NONE} }; @@ -247,6 +255,30 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo) if(outs->filename) fprintf(stream, "%s", outs->filename); break; + case VAR_PRIMARY_IP: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, + &stringp)) + fprintf(stream, "%s", stringp); + break; + case VAR_PRIMARY_PORT: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_PRIMARY_PORT, + &longinfo)) + fprintf(stream, "%ld", longinfo); + break; + case VAR_LOCAL_IP: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_LOCAL_IP, + &stringp)) + fprintf(stream, "%s", stringp); + break; + case VAR_LOCAL_PORT: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_LOCAL_PORT, + &longinfo)) + fprintf(stream, "%ld", longinfo); + break; default: break; } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index bf71a43ff..89c96ce13 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -78,7 +78,7 @@ test1118 test1119 test1120 test1121 test1122 test1123 test1124 test1125 \ test1126 test1127 test1128 test1129 test1130 test1131 test1132 \ test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \ test1208 test1209 test1210 test1211 \ -test1220 test1221 test1222 \ +test1220 test1221 test1222 test1223 \ test1300 test1301 test1302 test1303 test1304 test1305 \ test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \ test1314 test1315 test1316 test1317 test1318 test1319 test1320 test1321 \ diff --git a/tests/data/test1223 b/tests/data/test1223 new file mode 100644 index 000000000..2885bc59a --- /dev/null +++ b/tests/data/test1223 @@ -0,0 +1,60 @@ + + + +HTTP +HTTP GET + + + +# +# disable data check since it gets sent to stdout and is verified there + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 4 +Connection: close +Content-Type: text/html + +hej + + + +# +# Client-side + + +http + + +HTTP GET -w remote_ip and -w remote_port + + +http://%HOSTIP:%HTTPPORT/1223 -w 'IP %{remote_ip} and PORT %{remote_port}\n' + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /1223 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 4 +Connection: close +Content-Type: text/html + +hej +IP %HOSTIP and PORT %HTTPPORT + + +