@@ -151,7 +151,7 @@ pub fn abort(self: *Client) void {
151151 log .err (.http , "get private info" , .{ .err = err , .source = "abort" });
152152 continue ;
153153 };
154- transfer . req . error_callback ( transfer .ctx , error .Abort );
154+ self . requestFailed ( & transfer .req , error .Abort );
155155 self .endTransfer (transfer );
156156 }
157157 std .debug .assert (self .active == 0 );
@@ -221,6 +221,20 @@ pub fn blockingRequest(self: *Client, req: Request) !void {
221221 return self .makeRequest (& self .blocking , req );
222222}
223223
224+ fn requestFailed (self : * Client , req : * Request , err : anyerror ) void {
225+ if (req ._notified_fail ) return ;
226+ req ._notified_fail = true ;
227+
228+ if (self .notification ) | notification | {
229+ notification .dispatch (.http_request_fail , &.{
230+ .request = req ,
231+ .err = err ,
232+ });
233+ }
234+
235+ req .error_callback (req .ctx , err );
236+ }
237+
224238// Restrictive since it'll only work if there are no inflight requests. In some
225239// cases, the libcurl documentation is clear that changing settings while a
226240// connection is inflight is undefined. It doesn't say anything about CURLOPT_PROXY,
@@ -326,7 +340,6 @@ fn perform(self: *Client, timeout_ms: c_int) !void {
326340 const transfer = try Transfer .fromEasy (easy );
327341 const ctx = transfer .ctx ;
328342 const done_callback = transfer .req .done_callback ;
329- const error_callback = transfer .req .error_callback ;
330343
331344 // release it ASAP so that it's available; some done_callbacks
332345 // will load more resources.
@@ -336,10 +349,10 @@ fn perform(self: *Client, timeout_ms: c_int) !void {
336349 done_callback (ctx ) catch | err | {
337350 // transfer isn't valid at this point, don't use it.
338351 log .err (.http , "done_callback" , .{ .err = err });
339- error_callback ( ctx , err );
352+ self . requestFailed ( & transfer . req , err );
340353 };
341354 } else | err | {
342- error_callback ( ctx , err );
355+ self . requestFailed ( & transfer . req , err );
343356 }
344357 }
345358}
@@ -491,6 +504,8 @@ pub const Request = struct {
491504 body : ? []const u8 = null ,
492505 cookie_jar : * storage.CookieJar ,
493506
507+ _notified_fail : bool = false ,
508+
494509 // arbitrary data that can be associated with this request
495510 ctx : * anyopaque = undefined ,
496511
0 commit comments