Buy commercial curl support from WolfSSL. We help you work
out your issues, debug your libcurl applications, use the API, port to new
platforms, add new features and more. With a team lead by the curl founder
himself.
Support HTTP2 Goaway Frame callback for curl multi
- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]
From: Cao Duc Quan via curl-library <curl-library_at_lists.haxx.se>
Date: Thu, 4 Jan 2024 19:45:50 -0800
Happy New Year CURL !!!
I am working on a small project where I need a callback from CURM when it
receives the GOAWAY frame. I prepared a patch as follows and could get the
callback for GOAWAY
diff --git a/include/curl/multi.h b/include/curl/multi.h
index e79b48ff3..c1b5adede 100644
--- a/include/curl/multi.h
+++ b/include/curl/multi.h
_at__at_ -348,6 +348,12 _at__at_ curl_multi_socket_all(CURLM *multi_handle, int
*running_handles);
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
long *milliseconds);
+/*
+ * This macro help client know if they could install GOAWAY callback to
this curl version.
+ * This is a temporary solution before the patch is merged to cURL
mainline.
+ */
+#define CURL_HAS_GOAWAY_CALLBACK 1
+
typedef enum {
/* This is the socket callback function pointer */
CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1),
_at__at_ -399,6 +405,12 _at__at_ typedef enum {
/* maximum number of concurrent streams to support on a connection */
CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16),
+ /* This is the goaway callback function pointer */
+ CURLOPT(CURLMOPT_GOAWAY_CALLBACK, CURLOPTTYPE_FUNCTIONPOINT, 17),
+
+ /* This is the argument passed to the goaway callback */
+ CURLOPT(CURLMOPT_GOAWAY_DATA, CURLOPTTYPE_OBJECTPOINT, 18),
+
CURLMOPT_LASTENTRY /* the last unused */
} CURLMoption;
_at__at_ -464,6 +476,19 _at__at_ typedef int (*curl_push_callback)(CURL *parent,
struct curl_pushheaders *headers,
void *userp);
+/*
+ * Name: curl_goaway_callback
+ *
+ * Desc: This callback gets called when HTTP2 connection received
+ * GOAWAY frame from peer. The Application may interest on this
+ * event to trigger clean up functions or prepare new fresh
+ * connection.
+ *
+ * Returns: None
+ */
+typedef void (*curl_goaway_callback)(unsigned int error_code,
+ int last_stream_id,
+ void *userp);
#ifdef __cplusplus
} /* end of extern "C" */
#endif
diff --git a/lib/http2.c b/lib/http2.c
index c8b059498..6e28561f0 100644
--- a/lib/http2.c
+++ b/lib/http2.c
_at__at_ -1251,6 +1251,13 _at__at_ static int on_frame_recv(nghttp2_session *session,
const nghttp2_frame *frame,
infof(data, "received GOAWAY, error=%d, last_stream=%u",
ctx->goaway_error, ctx->last_stream_id);
Curl_multi_connchanged(data->multi);
+ if(data->multi->goaway_cb) {
+ Curl_set_in_callback(data, true);
+ data->multi->goaway_cb(ctx->goaway_error,
+ ctx->last_stream_id,
+ data->multi->goaway_userp);
+ Curl_set_in_callback(data, false);
+ }
}
break;
default:
I would like to ask if there is an obvious issue with the patch. If not,
could anyone guide me through any procedure I need to follow to get it in
the cURL in github?
Thanks,
Quan
Date: Thu, 4 Jan 2024 19:45:50 -0800
Happy New Year CURL !!!
I am working on a small project where I need a callback from CURM when it
receives the GOAWAY frame. I prepared a patch as follows and could get the
callback for GOAWAY
diff --git a/include/curl/multi.h b/include/curl/multi.h
index e79b48ff3..c1b5adede 100644
--- a/include/curl/multi.h
+++ b/include/curl/multi.h
_at__at_ -348,6 +348,12 _at__at_ curl_multi_socket_all(CURLM *multi_handle, int
*running_handles);
CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,
long *milliseconds);
+/*
+ * This macro help client know if they could install GOAWAY callback to
this curl version.
+ * This is a temporary solution before the patch is merged to cURL
mainline.
+ */
+#define CURL_HAS_GOAWAY_CALLBACK 1
+
typedef enum {
/* This is the socket callback function pointer */
CURLOPT(CURLMOPT_SOCKETFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 1),
_at__at_ -399,6 +405,12 _at__at_ typedef enum {
/* maximum number of concurrent streams to support on a connection */
CURLOPT(CURLMOPT_MAX_CONCURRENT_STREAMS, CURLOPTTYPE_LONG, 16),
+ /* This is the goaway callback function pointer */
+ CURLOPT(CURLMOPT_GOAWAY_CALLBACK, CURLOPTTYPE_FUNCTIONPOINT, 17),
+
+ /* This is the argument passed to the goaway callback */
+ CURLOPT(CURLMOPT_GOAWAY_DATA, CURLOPTTYPE_OBJECTPOINT, 18),
+
CURLMOPT_LASTENTRY /* the last unused */
} CURLMoption;
_at__at_ -464,6 +476,19 _at__at_ typedef int (*curl_push_callback)(CURL *parent,
struct curl_pushheaders *headers,
void *userp);
+/*
+ * Name: curl_goaway_callback
+ *
+ * Desc: This callback gets called when HTTP2 connection received
+ * GOAWAY frame from peer. The Application may interest on this
+ * event to trigger clean up functions or prepare new fresh
+ * connection.
+ *
+ * Returns: None
+ */
+typedef void (*curl_goaway_callback)(unsigned int error_code,
+ int last_stream_id,
+ void *userp);
#ifdef __cplusplus
} /* end of extern "C" */
#endif
diff --git a/lib/http2.c b/lib/http2.c
index c8b059498..6e28561f0 100644
--- a/lib/http2.c
+++ b/lib/http2.c
_at__at_ -1251,6 +1251,13 _at__at_ static int on_frame_recv(nghttp2_session *session,
const nghttp2_frame *frame,
infof(data, "received GOAWAY, error=%d, last_stream=%u",
ctx->goaway_error, ctx->last_stream_id);
Curl_multi_connchanged(data->multi);
+ if(data->multi->goaway_cb) {
+ Curl_set_in_callback(data, true);
+ data->multi->goaway_cb(ctx->goaway_error,
+ ctx->last_stream_id,
+ data->multi->goaway_userp);
+ Curl_set_in_callback(data, false);
+ }
}
break;
default:
I would like to ask if there is an obvious issue with the patch. If not,
could anyone guide me through any procedure I need to follow to get it in
the cURL in github?
Thanks,
Quan
-- Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library Etiquette: https://curl.se/mail/etiquette.htmlReceived on 2024-01-05