1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

add CURLINFO_SCHEME, CURLINFO_PROTOCOL, and %{scheme}

Adds access to the effectively used protocol/scheme to both libcurl and
curl, both in string and numeric (CURLPROTO_*) form.

Note that the string form will be uppercase, as it is just the internal
string.

As these strings are declared internally as const, and all other strings
returned by curl_easy_getinfo() are de-facto const as well, string
handling in getinfo.c got const-ified.

Closes #1137
This commit is contained in:
Frank Gevaerts 2016-11-23 10:44:18 +01:00 committed by Daniel Stenberg
parent 54789f9444
commit ba410f6c64
10 changed files with 150 additions and 4 deletions

View File

@ -2068,6 +2068,9 @@ IPv4 or IPv6 (Added in 7.29.0)
.B remote_port .B remote_port
The remote port number of the most recently done connection (Added in 7.29.0) The remote port number of the most recently done connection (Added in 7.29.0)
.TP .TP
.B scheme
The URL scheme (sometimes called protocol) that was effectively used (Added in 7.52.0)
.TP
.B size_download .B size_download
The total amount of bytes that were downloaded. The total amount of bytes that were downloaded.
.TP .TP

View File

@ -183,6 +183,12 @@ See \fICURLINFO_RTSP_SERVER_CSEQ(3)\fP
.IP CURLINFO_RTSP_CSEQ_RECV .IP CURLINFO_RTSP_CSEQ_RECV
RTSP CSeq last received. RTSP CSeq last received.
See \fICURLINFO_RTSP_CSEQ_RECV(3)\fP See \fICURLINFO_RTSP_CSEQ_RECV(3)\fP
.IP CURLINFO_PROTOCOL
The protocol used for the connection. (Added in 7.52.0)
See \fICURLINFO_PROTOCOL(3)\fP
.IP CURLINFO_SCHEME
The scheme used for the connection. (Added in 7.52.0)
See \fICURLINFO_SCHEME(3)\fP
.SH TIMES .SH TIMES
.nf .nf
An overview of the six time values available from curl_easy_getinfo() An overview of the six time values available from curl_easy_getinfo()

View File

@ -0,0 +1,55 @@
.\" **************************************************************************
.\" * _ _ ____ _
.\" * Project ___| | | | _ \| |
.\" * / __| | | | |_) | |
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2016, 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.haxx.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.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROTOCOL 3 "23 November 2016" "libcurl 7.52.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
.SH SYNOPSIS
#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROTOCOL, long *p);
.SH DESCRIPTION
Pass a pointer to a long to receive the version used in the last http connection.
The returned value will be one of the CURLPROTO_* values.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
long protocol;
curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
}
curl_easy_cleanup(curl);
}
.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLINFO_RESPONSE_CODE "(3), "
.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "

View File

@ -0,0 +1,59 @@
.\" **************************************************************************
.\" * _ _ ____ _
.\" * Project ___| | | | _ \| |
.\" * / __| | | | |_) | |
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2016, 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.haxx.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.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SCHEME 3 "23 November 2016" "libcurl 7.52.0" "curl_easy_getinfo options"
.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
.SH SYNOPSIS
#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, long *p);
.SH DESCRIPTION
Pass a pointer to a char pointer to receive the pointer to a zero-terminated
string holding the URL scheme used for the most recent connection done with this
\fBcurl\fP handle.
The \fBid\fP pointer will be NULL or pointing to private read-only memory you
MUST NOT free or modify.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
char * scheme;
curl_easy_getinfo(curl, CURLINFO_SCHEME, &scheme);
}
curl_easy_cleanup(curl);
}
.fi
.SH AVAILABILITY
Added in 7.52.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLINFO_RESPONSE_CODE "(3), "
.BR curl_easy_getinfo "(3), " curl_easy_setopt "(3), "

View File

@ -239,6 +239,7 @@ CURLINFO_PRETRANSFER_TIME 7.4.1
CURLINFO_PRIMARY_IP 7.19.0 CURLINFO_PRIMARY_IP 7.19.0
CURLINFO_PRIMARY_PORT 7.21.0 CURLINFO_PRIMARY_PORT 7.21.0
CURLINFO_PRIVATE 7.10.3 CURLINFO_PRIVATE 7.10.3
CURLINFO_PROTOCOL 7.52.0
CURLINFO_PROXYAUTH_AVAIL 7.10.8 CURLINFO_PROXYAUTH_AVAIL 7.10.8
CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0 CURLINFO_PROXY_SSL_VERIFYRESULT 7.52.0
CURLINFO_REDIRECT_COUNT 7.9.7 CURLINFO_REDIRECT_COUNT 7.9.7
@ -250,6 +251,7 @@ CURLINFO_RTSP_CLIENT_CSEQ 7.20.0
CURLINFO_RTSP_CSEQ_RECV 7.20.0 CURLINFO_RTSP_CSEQ_RECV 7.20.0
CURLINFO_RTSP_SERVER_CSEQ 7.20.0 CURLINFO_RTSP_SERVER_CSEQ 7.20.0
CURLINFO_RTSP_SESSION_ID 7.20.0 CURLINFO_RTSP_SESSION_ID 7.20.0
CURLINFO_SCHEME 7.52.0
CURLINFO_SIZE_DOWNLOAD 7.4.1 CURLINFO_SIZE_DOWNLOAD 7.4.1
CURLINFO_SIZE_UPLOAD 7.4.1 CURLINFO_SIZE_UPLOAD 7.4.1
CURLINFO_SLIST 7.12.3 CURLINFO_SLIST 7.12.3

View File

@ -2277,9 +2277,11 @@ typedef enum {
CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45, CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45,
CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46,
CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47,
CURLINFO_PROTOCOL = CURLINFO_LONG + 48,
CURLINFO_SCHEME = CURLINFO_STRING + 49,
/* Fill in new entries below here! */ /* Fill in new entries below here! */
CURLINFO_LASTONE = 47 CURLINFO_LASTONE = 49
} CURLINFO; } CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as

View File

@ -601,6 +601,8 @@ void Curl_persistconninfo(struct connectdata *conn)
{ {
memcpy(conn->data->info.conn_primary_ip, conn->primary_ip, MAX_IPADR_LEN); memcpy(conn->data->info.conn_primary_ip, conn->primary_ip, MAX_IPADR_LEN);
memcpy(conn->data->info.conn_local_ip, conn->local_ip, MAX_IPADR_LEN); memcpy(conn->data->info.conn_local_ip, conn->local_ip, MAX_IPADR_LEN);
conn->data->info.conn_scheme = conn->handler->scheme;
conn->data->info.conn_protocol = conn->handler->protocol;
conn->data->info.conn_primary_port = conn->primary_port; conn->data->info.conn_primary_port = conn->primary_port;
conn->data->info.conn_local_port = conn->local_port; conn->data->info.conn_local_port = conn->local_port;
} }

View File

@ -86,7 +86,7 @@ CURLcode Curl_initinfo(struct Curl_easy *data)
} }
static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info, static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info,
char **param_charp) const char **param_charp)
{ {
switch(info) { switch(info) {
case CURLINFO_EFFECTIVE_URL: case CURLINFO_EFFECTIVE_URL:
@ -123,6 +123,9 @@ static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info,
case CURLINFO_RTSP_SESSION_ID: case CURLINFO_RTSP_SESSION_ID:
*param_charp = data->set.str[STRING_RTSP_SESSION_ID]; *param_charp = data->set.str[STRING_RTSP_SESSION_ID];
break; break;
case CURLINFO_SCHEME:
*param_charp = data->info.conn_scheme;
break;
default: default:
return CURLE_UNKNOWN_OPTION; return CURLE_UNKNOWN_OPTION;
@ -229,6 +232,9 @@ static CURLcode getinfo_long(struct Curl_easy *data, CURLINFO info,
break; break;
} }
break; break;
case CURLINFO_PROTOCOL:
*param_longp = data->info.conn_protocol;
break;
default: default:
return CURLE_UNKNOWN_OPTION; return CURLE_UNKNOWN_OPTION;
@ -385,7 +391,7 @@ CURLcode Curl_getinfo(struct Curl_easy *data, CURLINFO info, ...)
va_list arg; va_list arg;
long *param_longp = NULL; long *param_longp = NULL;
double *param_doublep = NULL; double *param_doublep = NULL;
char **param_charp = NULL; const char **param_charp = NULL;
struct curl_slist **param_slistp = NULL; struct curl_slist **param_slistp = NULL;
curl_socket_t *param_socketp = NULL; curl_socket_t *param_socketp = NULL;
int type; int type;
@ -399,7 +405,7 @@ CURLcode Curl_getinfo(struct Curl_easy *data, CURLINFO info, ...)
type = CURLINFO_TYPEMASK & (int)info; type = CURLINFO_TYPEMASK & (int)info;
switch(type) { switch(type) {
case CURLINFO_STRING: case CURLINFO_STRING:
param_charp = va_arg(arg, char **); param_charp = va_arg(arg, const char **);
if(param_charp) if(param_charp)
result = getinfo_char(data, info, param_charp); result = getinfo_char(data, info, param_charp);
break; break;

View File

@ -1174,6 +1174,9 @@ struct PureInfo {
char conn_local_ip[MAX_IPADR_LEN]; char conn_local_ip[MAX_IPADR_LEN];
long conn_local_port; long conn_local_port;
const char *conn_scheme;
unsigned int conn_protocol;
struct curl_certinfo certs; /* info about the certs, only populated in struct curl_certinfo certs; /* info about the certs, only populated in
OpenSSL builds. Asked for with OpenSSL builds. Asked for with
CURLOPT_CERTINFO / CURLINFO_CERTINFO */ CURLOPT_CERTINFO / CURLINFO_CERTINFO */

View File

@ -59,6 +59,7 @@ typedef enum {
VAR_LOCAL_IP, VAR_LOCAL_IP,
VAR_LOCAL_PORT, VAR_LOCAL_PORT,
VAR_HTTP_VERSION, VAR_HTTP_VERSION,
VAR_SCHEME,
VAR_NUM_OF_VARS /* must be the last */ VAR_NUM_OF_VARS /* must be the last */
} replaceid; } replaceid;
@ -99,6 +100,7 @@ static const struct variable replacements[]={
{"local_ip", VAR_LOCAL_IP}, {"local_ip", VAR_LOCAL_IP},
{"local_port", VAR_LOCAL_PORT}, {"local_port", VAR_LOCAL_PORT},
{"http_version", VAR_HTTP_VERSION}, {"http_version", VAR_HTTP_VERSION},
{"scheme", VAR_SCHEME},
{NULL, VAR_NONE} {NULL, VAR_NONE}
}; };
@ -308,6 +310,12 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo)
fprintf(stream, version); fprintf(stream, version);
} }
break; break;
case VAR_SCHEME:
if(CURLE_OK ==
curl_easy_getinfo(curl, CURLINFO_SCHEME,
&stringp))
fprintf(stream, "%s", stringp);
break;
default: default:
break; break;
} }