- Added CURLINFO_PRIMARY_IP as a new information retrievable with

curl_easy_getinfo. It returns a pointer to a string with the most recently
  used IP address. Modified test case 500 to also verify this feature. The
  implementing of this feature was sponsored by Lenny Rachitsky at NeuStar.
This commit is contained in:
Daniel Stenberg 2008-06-06 17:33:35 +00:00
Родитель afc66554d7
Коммит 930a45e7a9
9 изменённых файлов: 48 добавлений и 7 удалений

Просмотреть файл

@ -7,6 +7,12 @@
Changelog
Daniel Stenberg (6 Jun 2008)
- Added CURLINFO_PRIMARY_IP as a new information retrievable with
curl_easy_getinfo. It returns a pointer to a string with the most recently
used IP address. Modified test case 500 to also verify this feature. The
implementing of this feature was sponsored by Lenny Rachitsky at NeuStar.
Version 7.18.2 (4 June 2008)
Daniel Fandrich (3 Jun 2008)

Просмотреть файл

@ -10,7 +10,7 @@ Curl and libcurl 7.18.3
This release includes the following changes:
o
o Added CURLINFO_PRIMARY_IP
This release includes the following bugfixes:
@ -31,6 +31,6 @@ New curl mirrors:
This release would not have looked like this without help, code, reports and
advice from friends like these:
Lenny Rachitsky
Thanks! (and sorry if I forgot to mention someone)

Просмотреть файл

@ -159,6 +159,12 @@ counted). Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know
how many times libcurl successfully reused existing connection(s) or not. See
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
to make persistent connections to save time. (Added in 7.12.3)
.IP CURLINFO_PRIMARY_IP
Pass a pointer to a char pointer to receive the pointer to a zero-terminated
string holding the IP address of the most recent connection done with this
\fBcurl\fP handle. This string may be IPv6 if that's enabled. Note that you
get a pointer to a memory area that will be re-used at next request so you
need to copy the string if you want to keep the information. (Added in 7.18.3)
.IP CURLINFO_COOKIELIST
Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all
cookies cURL knows (expired ones, too). Don't forget to

Просмотреть файл

@ -1596,9 +1596,10 @@ typedef enum {
CURLINFO_LASTSOCKET = CURLINFO_LONG + 29,
CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30,
CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31,
CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32,
/* Fill in new entries below here! */
CURLINFO_LASTONE = 31
CURLINFO_LASTONE = 32
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as

Просмотреть файл

@ -775,9 +775,12 @@ singleipconnect(struct connectdata *conn,
/* FIXME: do we have Curl_printable_address-like with struct sockaddr* as
argument? */
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
if(addr->family==AF_UNIX)
if(addr->family==AF_UNIX) {
infof(data, " Trying %s... ",
((const struct sockaddr_un*)(&addr->addr))->sun_path);
snprintf(data->info.ip, MAX_IPADR_LEN, "%s",
((const struct sockaddr_un*)(&addr->addr))->sun_path);
}
else
#endif
{
@ -789,8 +792,10 @@ singleipconnect(struct connectdata *conn,
iptoprint = &((const struct sockaddr_in*)(&addr->addr))->sin_addr;
if(Curl_inet_ntop(addr->family, iptoprint, addr_buf,
sizeof(addr_buf)) != NULL)
sizeof(addr_buf)) != NULL) {
infof(data, " Trying %s... ", addr_buf);
snprintf(data->info.ip, MAX_IPADR_LEN, "%s", addr_buf);
}
}
if(data->set.tcp_nodelay)

Просмотреть файл

@ -210,6 +210,10 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
option had been enabled! */
*param_charp = data->info.wouldredirect;
break;
case CURLINFO_PRIMARY_IP:
/* Return the ip address of the most recent (primary) connection */
*param_charp = data->info.ip;
break;
default:
return CURLE_BAD_FUNCTION_ARGUMENT;
}

Просмотреть файл

@ -48,6 +48,8 @@
#define CURL_DEFAULT_USER "anonymous"
#define CURL_DEFAULT_PASSWORD "ftp@example.com"
#define MAX_IPADR_LEN (4*9) /* should be enough to hold the longest ipv6 one */
#include "cookie.h"
#include "formdata.h"
@ -1036,6 +1038,9 @@ struct PureInfo {
long numconnects; /* how many new connection did libcurl created */
char *contenttype; /* the content type of the object */
char *wouldredirect; /* URL this would've been redirected to if asked to */
char ip[MAX_IPADR_LEN]; /* this buffer gets the numerical ip version stored
at the connect *attempt* so it will get the last
tried connect IP even on failures */
};

Просмотреть файл

@ -32,13 +32,16 @@ lib500
simple libcurl HTTP GET tool
</name>
<command>
http://%HOSTIP:%HTTPPORT/500
http://%HOSTIP:%HTTPPORT/500 log/ip500
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<file name="log/ip500" mode="text">
IP: %HOSTIP
</file>
<protocol>
GET /500 HTTP/1.1
Host: %HOSTIP:%HTTPPORT

Просмотреть файл

@ -14,6 +14,7 @@ int test(char *URL)
{
CURLcode res;
CURL *curl;
char *ipstr=NULL;
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
@ -31,7 +32,17 @@ int test(char *URL)
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if(!res) {
FILE *moo;
res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ipstr);
moo = fopen(libtest_arg2, "wb");
if(moo) {
fprintf(moo, "IP: %s\n", ipstr);
fclose(moo);
}
}
curl_easy_cleanup(curl);
curl_global_cleanup();
return (int)res;