Files
neovim/runtime/lua/vim/net.lua
zeertzjq ff777f9a85 docs: small fixes (#35791)
Close #34938
Close #35030
Close #35233
Close #35259
Close #35290
Close #35433
Close #35541
Close #35766
Close #35792

Co-authored-by: huylg <45591413+huylg@users.noreply.github.com>
Co-authored-by: Jason Del Ponte <961963+jasdel@users.noreply.github.com>
Co-authored-by: sooriya <74165167+thuvasooriya@users.noreply.github.com>
Co-authored-by: Andrew Braxton <andrewcbraxton@gmail.com>
Co-authored-by: Enric Calabuig <enric.calabuig@gmail.com>
Co-authored-by: Augusto César Dias <augusto.c.dias@gmail.com>
Co-authored-by: David Sierra DiazGranados <davidsierradz@gmail.com>
Co-authored-by: Stepan Nikitin <90522882+vectravox@users.noreply.github.com>
Co-authored-by: Emilien Breton <bricktech2000@gmail.com>
2025-09-16 11:41:36 +08:00

58 lines
1.9 KiB
Lua

local M = {}
--- Makes an HTTP GET request to the given URL (asynchronous).
---
--- This function operates in one mode:
--- - Asynchronous (non-blocking): Returns immediately and passes the response object to the
--- provided `on_response` handler on completion.
---
--- @param url string The URL for the request.
--- @param opts? table Optional parameters:
--- - `verbose` (boolean|nil): Enables verbose output.
--- - `retry` (integer|nil): Number of retries on transient failures (default: 3).
--- - `outpath` (string|nil): File path to save the response body to. If set, the `body` value in the Response Object will be `true` instead of the response body.
--- @param on_response fun(err?: string, response?: { body: string|boolean }) Callback invoked on request
--- completion. The `body` field in the response object contains the raw response data (text or binary).
--- Called with (err, nil) on failure, or (nil, { body = string|boolean }) on success.
function M.request(url, opts, on_response)
vim.validate({
url = { url, 'string' },
opts = { opts, 'table', true },
on_response = { on_response, 'function' },
})
opts = opts or {}
local retry = opts.retry or 3
-- Build curl command
local args = { 'curl' }
if opts.verbose then
table.insert(args, '--verbose')
else
vim.list_extend(args, { '--silent', '--show-error', '--fail' })
end
vim.list_extend(args, { '--location', '--retry', tostring(retry) })
if opts.outpath then
vim.list_extend(args, { '--output', opts.outpath })
end
table.insert(args, url)
local function on_exit(res)
local s = 'Request failed with exit code %d'
local err_msg = res.code ~= 0
and ((res.stderr ~= '' and res.stderr) or string.format(s, res.code))
or nil
local response = res.code == 0 and { body = opts.outpath and true or res.stdout } or nil
if on_response then
on_response(err_msg, response)
end
end
vim.system(args, {}, on_exit)
end
return M