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 @@ -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? Thanks, Quan
-- Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library Etiquette: https://curl.se/mail/etiquette.html