On 1/4/2024 10:45 PM, Cao Duc Quan via curl-library wrote:
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
@@ -348,6 +348,12 @@ 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),
@@ -399,6 +405,12 @@ 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;
@@ -464,6 +476,19 @@ 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
@@ -1251,6 +1251,13 @@ 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?
I won't land this. It sounds a lot like curl/curl#4839 [1]. Do you
really need it in curl or is there some way your application is working
that could be improved?
[1]: https://github.com/curl/curl/issues/4839
--
Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library
Etiquette: https://curl.se/mail/etiquette.html