net.http: Add request:cancel() method

This is a new API that should be used in preference to http.destroy_request()
when possible, as it ensures the callback is always called (with an error of
course).

APIs that have edge-cases where they don't call callbacks have, from experience,
shown to be difficult to work with and often lead to unintentional leaks when
the callback was expected to free up certain resources.
This commit is contained in:
Matthew Wild 2020-08-08 13:13:50 +01:00
parent 11e49af5e8
commit dc206f0ff4

View file

@ -56,6 +56,16 @@ local function destroy_request(request)
end
end
local function cancel_request(request, reason)
if request.callback then
request.callback(reason or "cancelled", 0, request);
request.callback = nil;
end
if request.conn then
destroy_request(request);
end
end
local function request_reader(request, data, err)
if not request.parser then
local function error_cb(reason)
@ -105,6 +115,7 @@ function listener.onconnect(conn)
end
req.reader = request_reader;
req.state = "status";
req.cancel = cancel_request;
requests[req.conn] = req;