## CURLOPT_STREAM_DEPENDS
-This HTTP/2 stream depends on another. See CURLOPT_STREAM_DEPENDS(3)
+**Deprecated option** This HTTP/2 stream depends on another. See
+CURLOPT_STREAM_DEPENDS(3)
## CURLOPT_STREAM_DEPENDS_E
-This HTTP/2 stream depends on another exclusively. See
+**Deprecated option** This HTTP/2 stream depends on another exclusively. See
CURLOPT_STREAM_DEPENDS_E(3)
## CURLOPT_STREAM_WEIGHT
a transfer that is about to be sent over the same HTTP/2 connection for this
option to have an actual effect.
+Since version 8.21.0 setting this option no longer has an effect. HTTP/2
+stream dependencies were introduced in RFC 7540 and then later deprecated
+in RFC 9113.
+
# DEFAULT
NULL
}
~~~
+# DEPRECATED
+
+Deprecated since 8.21.0.
+
# %AVAILABILITY%
# RETURN VALUE
a transfer that is about to be sent over the same HTTP/2 connection for this
option to have an actual effect.
+Since version 8.21.0 setting this option no longer has an effect. HTTP/2
+stream dependencies were introduced in RFC 7540 and then later deprecated
+in RFC 9113.
+
# DEFAULT
NULL
}
~~~
+# DEPRECATED
+
+Deprecated since 8.21.0.
+
# %AVAILABILITY%
# RETURN VALUE
CURLOPT_SSLKEYTYPE 7.9.3
CURLOPT_SSLVERSION 7.1
CURLOPT_STDERR 7.1
-CURLOPT_STREAM_DEPENDS 7.46.0
-CURLOPT_STREAM_DEPENDS_E 7.46.0
+CURLOPT_STREAM_DEPENDS 7.46.0 8.21.0
+CURLOPT_STREAM_DEPENDS_E 7.46.0 8.21.0
CURLOPT_STREAM_WEIGHT 7.46.0
CURLOPT_SUPPRESS_CONNECT_HEADERS 7.54.0
CURLOPT_TCP_FASTOPEN 7.49.0
CURLOPT(CURLOPT_STREAM_WEIGHT, CURLOPTTYPE_LONG, 239),
/* Set stream dependency on another curl handle */
- CURLOPT(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240),
+ CURLOPTDEPRECATED(CURLOPT_STREAM_DEPENDS, CURLOPTTYPE_OBJECTPOINT, 240,
+ 8.21.0, "Has no function"),
/* Set E-xclusive stream dependency on another curl handle */
- CURLOPT(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241),
+ CURLOPTDEPRECATED(CURLOPT_STREAM_DEPENDS_E, CURLOPTTYPE_OBJECTPOINT, 241,
+ 8.21.0, "Has no function"),
/* Do not send any tftp option requests to the server */
CURLOPT(CURLOPT_TFTP_NO_OPTIONS, CURLOPTTYPE_LONG, 242),
* struct.
*/
-static void h2_pri_spec(struct cf_h2_ctx *ctx,
- struct Curl_easy *data,
+static void h2_pri_spec(struct Curl_easy *data,
nghttp2_priority_spec *pri_spec)
{
struct Curl_data_priority *prio = &data->set.priority;
- struct h2_stream_ctx *depstream = H2_STREAM_CTX(ctx, prio->parent);
- int32_t depstream_id = depstream ? depstream->id : 0;
- nghttp2_priority_spec_init(pri_spec, depstream_id,
- sweight_wanted(data),
- data->set.priority.exclusive);
+ nghttp2_priority_spec_init(pri_spec, 0,
+ sweight_wanted(data), FALSE);
data->state.priority = *prio;
}
int rv = 0;
if(stream && stream->id > 0 &&
- ((sweight_wanted(data) != sweight_in_effect(data)) ||
- (data->set.priority.exclusive != data->state.priority.exclusive) ||
- (data->set.priority.parent != data->state.priority.parent))) {
+ (sweight_wanted(data) != sweight_in_effect(data))) {
/* send new weight and/or dependency */
nghttp2_priority_spec pri_spec;
- h2_pri_spec(ctx, data, &pri_spec);
+ h2_pri_spec(data, &pri_spec);
CURL_TRC_CF(data, cf, "[%d] Queuing PRIORITY", stream->id);
DEBUGASSERT(stream->id != -1);
rv = nghttp2_submit_priority(ctx->h2, NGHTTP2_FLAG_NONE,
goto out;
}
- h2_pri_spec(ctx, data, &pri_spec);
+ h2_pri_spec(data, &pri_spec);
if(!nghttp2_session_check_request_allowed(ctx->h2))
CURL_TRC_CF(data, cf, "send request NOT allowed (via nghttp2)");
#ifdef USE_HTTP2
case CURLOPT_STREAM_DEPENDS:
- case CURLOPT_STREAM_DEPENDS_E: {
- struct Curl_easy *dep = va_arg(param, struct Curl_easy *);
- if(!dep || GOOD_EASY_HANDLE(dep))
- return Curl_data_priority_add_child(dep, data,
- option == CURLOPT_STREAM_DEPENDS_E);
+ case CURLOPT_STREAM_DEPENDS_E:
+ /* not doing stream dependencies any longer, but accept options
+ * for backward compatibility */
break;
- }
#endif
default:
#include "smtp.h"
#include "ws.h"
-#ifdef USE_NGHTTP2
-static void data_priority_cleanup(struct Curl_easy *data);
-#else
-#define data_priority_cleanup(x)
-#endif
-
/* Some parts of the code (e.g. chunked encoding) assume this buffer has more
* than a few bytes to play with. Do not let it become too small or bad things
* will happen.
curlx_safefree(data->info.contenttype);
curlx_safefree(data->info.wouldredirect);
- data_priority_cleanup(data);
-
/* No longer a dirty share, if it exists */
if(Curl_share_easy_unlink(data))
DEBUGASSERT(0);
#if defined(USE_HTTP2) || defined(USE_HTTP3)
-#ifdef USE_NGHTTP2
-
-static void priority_remove_child(struct Curl_easy *parent,
- struct Curl_easy *child)
-{
- struct Curl_data_prio_node **pnext = &parent->set.priority.children;
- struct Curl_data_prio_node *pnode = parent->set.priority.children;
-
- DEBUGASSERT(child->set.priority.parent == parent);
- while(pnode && pnode->data != child) {
- pnext = &pnode->next;
- pnode = pnode->next;
- }
-
- DEBUGASSERT(pnode);
- if(pnode) {
- *pnext = pnode->next;
- curlx_free(pnode);
- }
-
- child->set.priority.parent = 0;
- child->set.priority.exclusive = FALSE;
-}
-
-CURLcode Curl_data_priority_add_child(struct Curl_easy *parent,
- struct Curl_easy *child,
- bool exclusive)
-{
- if(child->set.priority.parent) {
- priority_remove_child(child->set.priority.parent, child);
- }
-
- if(parent) {
- struct Curl_data_prio_node **tail;
- struct Curl_data_prio_node *pnode;
-
- pnode = curlx_calloc(1, sizeof(*pnode));
- if(!pnode)
- return CURLE_OUT_OF_MEMORY;
- pnode->data = child;
-
- if(parent->set.priority.children && exclusive) {
- /* exclusive: move all existing children underneath the new child */
- struct Curl_data_prio_node *node = parent->set.priority.children;
- while(node) {
- node->data->set.priority.parent = child;
- node = node->next;
- }
-
- tail = &child->set.priority.children;
- while(*tail)
- tail = &(*tail)->next;
-
- DEBUGASSERT(!*tail);
- *tail = parent->set.priority.children;
- parent->set.priority.children = 0;
- }
-
- tail = &parent->set.priority.children;
- while(*tail) {
- (*tail)->data->set.priority.exclusive = FALSE;
- tail = &(*tail)->next;
- }
-
- DEBUGASSERT(!*tail);
- *tail = pnode;
- }
-
- child->set.priority.parent = parent;
- child->set.priority.exclusive = exclusive;
- return CURLE_OK;
-}
-
-#endif /* USE_NGHTTP2 */
-
-#ifdef USE_NGHTTP2
-static void data_priority_cleanup(struct Curl_easy *data)
-{
- while(data->set.priority.children) {
- struct Curl_easy *tmp = data->set.priority.children->data;
- priority_remove_child(data, tmp);
- if(data->set.priority.parent)
- Curl_data_priority_add_child(data->set.priority.parent, tmp, FALSE);
- }
-
- if(data->set.priority.parent)
- priority_remove_child(data->set.priority.parent, data);
-}
-#endif
-
void Curl_data_priority_clear_state(struct Curl_easy *data)
{
memset(&data->state.priority, 0, sizeof(data->state.priority));
* on the same connection.
*/
struct Curl_data_priority {
-#ifdef USE_NGHTTP2
- /* tree like dependencies only implemented in nghttp2 */
- struct Curl_easy *parent;
- struct Curl_data_prio_node *children;
-#endif
int weight;
-#ifdef USE_NGHTTP2
- BIT(exclusive);
-#endif
};
/* Timers */