From c124e6b3c04bfd254e24312bc66c2bc9db919442 Mon Sep 17 00:00:00 2001 From: Kunal Ekawde Date: Tue, 24 Sep 2019 08:56:11 -0400 Subject: CURLMOPT_MAX_CONCURRENT_STREAMS: new setopt Closes #4410 --- docs/libcurl/curl_multi_setopt.3 | 4 +- .../libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 | 56 ++++++++++++++++++++++ docs/libcurl/opts/Makefile.inc | 9 ++-- docs/libcurl/symbols-in-versions | 1 + include/curl/multi.h | 6 +++ lib/http2.c | 2 +- lib/multi.c | 16 +++++++ lib/multihandle.h | 1 + lib/multiif.h | 6 +++ packages/OS400/curl.inc.in | 2 + 10 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 diff --git a/docs/libcurl/curl_multi_setopt.3 b/docs/libcurl/curl_multi_setopt.3 index d27c52441..88809d62b 100644 --- a/docs/libcurl/curl_multi_setopt.3 +++ b/docs/libcurl/curl_multi_setopt.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2019, 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 @@ -67,6 +67,8 @@ See \fICURLMOPT_SOCKETDATA(3)\fP See \fICURLMOPT_TIMERFUNCTION(3)\fP .IP CURLMOPT_TIMERDATA See \fICURLMOPT_TIMERDATA(3)\fP +.IP CURLMOPT_MAX_CONCURRENT_STREAMS +See \fICURLMOPT_MAX_CONCURRENT_STREAMS(3)\fP .SH RETURNS The standard CURLMcode for multi interface error codes. Note that it returns a CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl diff --git a/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 b/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 new file mode 100644 index 000000000..ab044f754 --- /dev/null +++ b/docs/libcurl/opts/CURLMOPT_MAX_CONCURRENT_STREAMS.3 @@ -0,0 +1,56 @@ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2019, 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 CURLMOPT_MAX_CONCURRENT_STREAMS 3 "06 Nov 2019" "libcurl 7.67.0" "curl_multi_setopt options" +.SH NAME +CURLMOPT_MAX_CONCURRENT_STREAMS \- set max concurrent streams for http2 +.SH SYNOPSIS +.nf +#include + +CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_CONCURRENT_STREAMS, + long max); +.fi +.SH DESCRIPTION +Pass a long indicating the \fBmax\fP. The set number will be used as the +maximum number of concurrent streams for a connections that libcurl should +support on connections done using HTTP/2. + +Valid values range from 1 to 2147483647 (2^31 - 1) and defaults to 100. The +value passed here would be honoured based on other system resources +properties. +.SH DEFAULT +100 +.SH PROTOCOLS +All +.SH EXAMPLE +.nf + CURLM *m = curl_multi_init(); + /* max concurrent streams 200 */ + curl_multi_setopt(m, CURLMOPT_MAX_CONCURRENT_STREAMS, 200L); +.fi +.SH AVAILABILITY +Added in 7.67.0 +.SH RETURN VALUE +Returns CURLM_OK if the option is supported, and CURLM_UNKNOWN_OPTION if not. +.SH "SEE ALSO" +.BR CURLOPT_MAXCONNECTS "(3), " CURLMOPT_MAXCONNECTS.3 "(3), " diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc index b5f62a159..93c4357d2 100644 --- a/docs/libcurl/opts/Makefile.inc +++ b/docs/libcurl/opts/Makefile.inc @@ -68,6 +68,7 @@ man_MANS = \ CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3 \ CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3 \ CURLMOPT_MAXCONNECTS.3 \ + CURLMOPT_MAX_CONCURRENT_STREAMS.3 \ CURLMOPT_MAX_HOST_CONNECTIONS.3 \ CURLMOPT_MAX_PIPELINE_LENGTH.3 \ CURLMOPT_MAX_TOTAL_CONNECTIONS.3 \ @@ -97,7 +98,6 @@ man_MANS = \ CURLOPT_CHUNK_END_FUNCTION.3 \ CURLOPT_CLOSESOCKETDATA.3 \ CURLOPT_CLOSESOCKETFUNCTION.3 \ - CURLOPT_UPKEEP_INTERVAL_MS.3 \ CURLOPT_CONNECTTIMEOUT.3 \ CURLOPT_CONNECTTIMEOUT_MS.3 \ CURLOPT_CONNECT_ONLY.3 \ @@ -113,8 +113,8 @@ man_MANS = \ CURLOPT_COPYPOSTFIELDS.3 \ CURLOPT_CRLF.3 \ CURLOPT_CRLFILE.3 \ - CURLOPT_CUSTOMREQUEST.3 \ CURLOPT_CURLU.3 \ + CURLOPT_CUSTOMREQUEST.3 \ CURLOPT_DEBUGDATA.3 \ CURLOPT_DEBUGFUNCTION.3 \ CURLOPT_DEFAULT_PROTOCOL.3 \ @@ -168,8 +168,6 @@ man_MANS = \ CURLOPT_HTTP_TRANSFER_DECODING.3 \ CURLOPT_HTTP_VERSION.3 \ CURLOPT_IGNORE_CONTENT_LENGTH.3 \ - CURLOPT_TRAILERDATA.3 \ - CURLOPT_TRAILERFUNCTION.3 \ CURLOPT_INFILESIZE.3 \ CURLOPT_INFILESIZE_LARGE.3 \ CURLOPT_INTERFACE.3 \ @@ -332,10 +330,13 @@ man_MANS = \ CURLOPT_TLSAUTH_PASSWORD.3 \ CURLOPT_TLSAUTH_TYPE.3 \ CURLOPT_TLSAUTH_USERNAME.3 \ + CURLOPT_TRAILERDATA.3 \ + CURLOPT_TRAILERFUNCTION.3 \ CURLOPT_TRANSFERTEXT.3 \ CURLOPT_TRANSFER_ENCODING.3 \ CURLOPT_UNIX_SOCKET_PATH.3 \ CURLOPT_UNRESTRICTED_AUTH.3 \ + CURLOPT_UPKEEP_INTERVAL_MS.3 \ CURLOPT_UPLOAD.3 \ CURLOPT_UPLOAD_BUFFERSIZE.3 \ CURLOPT_URL.3 \ diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index ff0dfb238..3e144a719 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -319,6 +319,7 @@ CURLMOPT_MAXCONNECTS 7.16.3 CURLMOPT_MAX_HOST_CONNECTIONS 7.30.0 CURLMOPT_MAX_PIPELINE_LENGTH 7.30.0 CURLMOPT_MAX_TOTAL_CONNECTIONS 7.30.0 +CURLMOPT_MAX_CONCURRENT_STREAMS 7.67.0 CURLMOPT_PIPELINING 7.16.0 CURLMOPT_PIPELINING_SERVER_BL 7.30.0 CURLMOPT_PIPELINING_SITE_BL 7.30.0 diff --git a/include/curl/multi.h b/include/curl/multi.h index 02df0f389..b39218395 100644 --- a/include/curl/multi.h +++ b/include/curl/multi.h @@ -396,6 +396,9 @@ typedef enum { /* This is the argument passed to the server push callback */ CINIT(PUSHDATA, OBJECTPOINT, 15), + /* maximum number of concurrent streams to support on a connection */ + CINIT(MAX_CONCURRENT_STREAMS, LONG, 16), + CURLMOPT_LASTENTRY /* the last unused */ } CURLMoption; @@ -448,6 +451,9 @@ typedef int (*curl_push_callback)(CURL *parent, struct curl_pushheaders *headers, void *userp); +/* value for MAXIMUM CONCURRENT STREAMS upper limit */ +#define INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1) + #ifdef __cplusplus } /* end of extern "C" */ #endif diff --git a/lib/http2.c b/lib/http2.c index 98ea90358..d2f5da17a 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -1159,7 +1159,7 @@ static void populate_settings(struct connectdata *conn, nghttp2_settings_entry *iv = httpc->local_settings; iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS; - iv[0].value = 100; + iv[0].value = (uint32_t)Curl_multi_max_concurrent_streams(conn->data->multi); iv[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE; iv[1].value = HTTP2_HUGE_WINDOW_SIZE; diff --git a/lib/multi.c b/lib/multi.c index 22e0dcfd1..6dfe8842e 100755 --- a/lib/multi.c +++ b/lib/multi.c @@ -2772,6 +2772,16 @@ CURLMcode curl_multi_setopt(struct Curl_multi *multi, break; case CURLMOPT_PIPELINING_SERVER_BL: break; + case CURLMOPT_MAX_CONCURRENT_STREAMS: + { + long streams = va_arg(param, long); + if(streams < 1) + streams = 100; + multi->max_concurrent_streams = + (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)? + (long)INITIAL_MAX_CONCURRENT_STREAMS : streams; + } + break; default: res = CURLM_UNKNOWN_OPTION; break; @@ -3210,3 +3220,9 @@ void Curl_multi_dump(struct Curl_multi *multi) } } #endif + +size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi) +{ + return multi ? ((size_t)multi->max_concurrent_streams ? + (size_t)multi->max_concurrent_streams : 100) : 0; +} diff --git a/lib/multihandle.h b/lib/multihandle.h index 279379ae0..b65bd9638 100644 --- a/lib/multihandle.h +++ b/lib/multihandle.h @@ -133,6 +133,7 @@ struct Curl_multi { struct curltime timer_lastcall; /* the fixed time for the timeout for the previous callback */ bool in_callback; /* true while executing a callback */ + long max_concurrent_streams; /* max concurrent streams client to support */ }; #endif /* HEADER_CURL_MULTIHANDLE_H */ diff --git a/lib/multiif.h b/lib/multiif.h index 0755a7cd2..75025232c 100644 --- a/lib/multiif.h +++ b/lib/multiif.h @@ -89,4 +89,10 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi, struct Curl_easy *data, struct connectdata *conn); + +/* Return the value of the CURLMOPT_MAX_CONCURRENT_STREAMS option + * If not specified or 0, default would be 100 + */ +size_t Curl_multi_max_concurrent_streams(struct Curl_multi *multi); + #endif /* HEADER_CURL_MULTIIF_H */ diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in index 5a53b1b21..8be6c8986 100644 --- a/packages/OS400/curl.inc.in +++ b/packages/OS400/curl.inc.in @@ -1841,6 +1841,8 @@ d c 20014 d CURLMOPT_PUSHDATA... d c 10015 + d CURLMOPT_MAX_CONCURRENT_STREAMS... + d c 10016 * * Bitmask bits for CURLMOPT_PIPELING. * -- cgit v1.2.1