From 071c56139463137a4e32a8d841a70c16f3682bb7 Mon Sep 17 00:00:00 2001 From: Frank Gevaerts Date: Wed, 11 May 2016 14:23:37 +0200 Subject: [PATCH] http: add CURLINFO_HTTP_VERSION and %{http_version} Adds access to the effectively used http version to both libcurl and curl. Closes #799 --- docs/curl.1 | 3 ++ docs/libcurl/curl_easy_getinfo.3 | 3 ++ docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 | 56 +++++++++++++++++++++++ docs/libcurl/symbols-in-versions | 1 + include/curl/curl.h | 3 +- lib/getinfo.c | 16 +++++++ src/tool_writeout.c | 24 +++++++++- 7 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 diff --git a/docs/curl.1 b/docs/curl.1 index f2d48f171..ed047724e 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -1944,6 +1944,9 @@ 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 http_version +The http version that was effectively used. (Added in 7.50.0) +.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) diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3 index 2b4c7fe53..9ffcd14af 100644 --- a/docs/libcurl/curl_easy_getinfo.3 +++ b/docs/libcurl/curl_easy_getinfo.3 @@ -50,6 +50,9 @@ See \fICURLINFO_RESPONSE_CODE(3)\fP .IP CURLINFO_HTTP_CONNECTCODE Last proxy CONNECT response code. See \fICURLINFO_HTTP_CONNECTCODE(3)\fP +.IP CURLINFO_HTTP_VERSION +The http version used in the connection. +See \fICURLINFO_HTTP_VERSION(3)\fP .IP CURLINFO_FILETIME Remote time of the retrieved document. See \fICURLINFO_FILETIME(3)\fP diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 new file mode 100644 index 000000000..b0f43e549 --- /dev/null +++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 @@ -0,0 +1,56 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2016, 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.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_HTTP_VERSION 3 "11 May 2016" "libcurl 7.50.0" "curl_easy_getinfo options" +.SH NAME +CURLINFO_HTTP_VERSION \- get the http version used in the connection +.SH SYNOPSIS +#include + +CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, 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 CURL_HTTP_VERSION_1_0, CURL_HTTP_VERSION_1_1, or +CURL_HTTP_VERSION_2_0, or 0 if the version can't be determined. +.SH PROTOCOLS +HTTP +.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 http_version; + curl_easy_getinfo(curl, CURLINFO_HTTP_VERSION, &http_version); + } + curl_easy_cleanup(curl); +} +.fi +.SH AVAILABILITY +Added in 7.50.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), " diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index fa26efbe7..d05a46904 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -223,6 +223,7 @@ CURLINFO_HEADER_SIZE 7.4.1 CURLINFO_HTTPAUTH_AVAIL 7.10.8 CURLINFO_HTTP_CODE 7.4.1 7.10.8 CURLINFO_HTTP_CONNECTCODE 7.10.7 +CURLINFO_HTTP_VERSION 7.50.0 CURLINFO_LASTONE 7.4.1 CURLINFO_LASTSOCKET 7.15.2 CURLINFO_LOCAL_IP 7.21.0 diff --git a/include/curl/curl.h b/include/curl/curl.h index 57e716b3e..b9bd8b706 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -2193,9 +2193,10 @@ typedef enum { CURLINFO_TLS_SESSION = CURLINFO_SLIST + 43, CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, CURLINFO_TLS_SSL_PTR = CURLINFO_SLIST + 45, + CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, /* Fill in new entries below here! */ - CURLINFO_LASTONE = 45 + CURLINFO_LASTONE = 46 } CURLINFO; /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as diff --git a/lib/getinfo.c b/lib/getinfo.c index d4b01bf29..956a72454 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -198,6 +198,22 @@ static CURLcode getinfo_long(struct SessionHandle *data, CURLINFO info, case CURLINFO_RTSP_CSEQ_RECV: *param_longp = data->state.rtsp_CSeq_recv; break; + case CURLINFO_HTTP_VERSION: + switch (data->info.httpversion) { + case 10: + *param_longp = CURL_HTTP_VERSION_1_0; + break; + case 11: + *param_longp = CURL_HTTP_VERSION_1_1; + break; + case 20: + *param_longp = CURL_HTTP_VERSION_2_0; + break; + default: + *param_longp = CURL_HTTP_VERSION_NONE; + break; + } + break; default: return CURLE_UNKNOWN_OPTION; diff --git a/src/tool_writeout.c b/src/tool_writeout.c index 414fcbea9..6e94afe42 100644 --- a/src/tool_writeout.c +++ b/src/tool_writeout.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2015, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2016, 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 @@ -57,6 +57,7 @@ typedef enum { VAR_PRIMARY_PORT, VAR_LOCAL_IP, VAR_LOCAL_PORT, + VAR_HTTP_VERSION, VAR_NUM_OF_VARS /* must be the last */ } replaceid; @@ -95,6 +96,7 @@ static const struct variable replacements[]={ {"remote_port", VAR_PRIMARY_PORT}, {"local_ip", VAR_LOCAL_IP}, {"local_port", VAR_LOCAL_PORT}, + {"http_version", VAR_HTTP_VERSION}, {NULL, VAR_NONE} }; @@ -278,6 +280,26 @@ void ourWriteOut(CURL *curl, struct OutStruct *outs, const char *writeinfo) &longinfo)) fprintf(stream, "%ld", longinfo); break; + case VAR_HTTP_VERSION: + if(CURLE_OK == + curl_easy_getinfo(curl, CURLINFO_HTTP_VERSION, + &longinfo)) { + const char *version = "0"; + switch (longinfo) { + case CURL_HTTP_VERSION_1_0: + version = "1.0"; + break; + case CURL_HTTP_VERSION_1_1: + version = "1.1"; + break; + case CURL_HTTP_VERSION_2_0: + version = "2"; + break; + } + + fprintf(stream, version); + } + break; default: break; }