
---@class copas_http_request*
---@field url? string URL。
---@field method? string HTTP 方法。
---@field headers? table<string, string> 请求头。
---@field source? ltn12_source 请求体 source。
---@field sink? ltn12_sink 响应体 sink。
---@field body? string 请求体。
---@field proxy? string|table 代理。
---@field redirect? boolean 是否允许重定向。
---@field create? function socket 创建函数。
---@field timeout? number|table 超时配置。
---@field target? table 响应体列表。

---@class copas_http_connection*
local copas_http_connection = {}

---@class copas_http*
---@field TIMEOUT number 默认超时。
---@field PORT integer HTTP 端口。
---@field USERAGENT string 默认 User-Agent。
---@field SSLPORT integer HTTPS 端口。
---@field SSLPROTOCOL string TLS 协议。
---@field SSLOPTIONS string TLS options。
---@field SSLVERIFY string TLS verify。
---@field SSLSNISTRICT boolean 是否严格 SNI。
---@field PROXY? string|table 代理配置。
---@type copas_http*
local M = {}

M.TIMEOUT = 60
M.PORT = 80
M.USERAGENT = nil
M.SSLPORT = 443
M.SSLPROTOCOL = nil
M.SSLOPTIONS = nil
M.SSLVERIFY = nil
M.SSLSNISTRICT = false
M.PROXY = nil

--- 打开 HTTP 连接。
---@param request copas_http_request* 请求表。
---@return copas_http_connection* connection 连接对象。
function M.open(request) end

--- 创建 socket 工厂函数。
---@param params copas_http_request* 请求参数。
---@return function create 创建函数。
function M.getcreatefunc(params) end

--- 解析 HTTP 请求。
---@param urlOrRequest string|copas_http_request* URL 或请求表。
---@param body? string 请求体。
---@return copas_http_request* request 请求表。
function M.parseRequest(urlOrRequest, body) end

--- 发起 HTTP/HTTPS 请求。
---@param request string|copas_http_request* URL 或请求表。
---@param body? string 请求体。
---@return string|integer|nil bodyOrOk 响应体或 LTN12 状态。
---@return integer|string? statusCodeOrErr 状态码或错误信息。
---@return table? headers 响应头。
---@return string? statusLine 状态行。
function M.request(request, body) end

--- 发送请求行。
---@param method string HTTP 方法。
---@param uri string URI。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function copas_http_connection:sendrequestline(method, uri) end

--- 发送请求头。
---@param headers table<string, string> 请求头。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function copas_http_connection:sendheaders(headers) end

--- 发送请求体。
---@param headers table<string, string> 请求头。
---@param source ltn12_source 请求体 source。
---@param step? ltn12_pump_step pump step。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function copas_http_connection:sendbody(headers, source, step) end

--- 接收状态行。
---@return integer|nil code 状态码。
---@return string? status 状态行或错误。
function copas_http_connection:receivestatusline() end

--- 接收响应头。
---@return table|nil headers 响应头。
---@return string? errMsg 错误信息。
function copas_http_connection:receiveheaders() end

--- 接收响应体。
---@param headers table 响应头。
---@param sink ltn12_sink 响应体 sink。
---@param step? ltn12_pump_step pump step。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function copas_http_connection:receivebody(headers, sink, step) end

--- 接收 HTTP/0.9 响应体。
---@param status string 状态文本。
---@param sink ltn12_sink 响应体 sink。
---@param step? ltn12_pump_step pump step。
---@return boolean|nil ok 是否成功。
---@return string? errMsg 错误信息。
function copas_http_connection:receive09body(status, sink, step) end

--- 关闭连接。
---@return any result 关闭结果。
function copas_http_connection:close() end

return M
