socket.http源码分析

调用代码示例:

local request_body = [[login=user&password=123]]
local response_body = {}
local res, code, response_headers = http.request{
        url = "http://httpbin.org/post",
        method = "POST",
        headers =
            {
                    ["Content-Type"] = "application/x-www-form-urlencoded";
                    ["Content-Length"] = #request_body;
            },
            source = ltn12.source.string(request_body),
            sink = ltn12.sink.table(response_body),
}

print(res)
print(code)
if type(response_headers) == "table" then
    for k, v in pairs(response_headers) do
        print(k, v)
    end
end
print("Response body:")
if type(response_body) == "table" then
    print(table.concat(response_body))
else
    print("Not a table:", type(response_body))
end
  • 首先我们进入http.request(...)函数进行分析:
_M.request = socket.protect(function(reqt, body)
    --很明显reqt是一个table,进入trequest(reqt)函数中。
    if base.type(reqt) == "string" then return srequest(reqt, body)
    else return trequest(reqt) end----------------------进入这个分支
end)
  • 我们进入trequest()函数进行分析:
function trequest(reqt)
    -- we loop until we get what we want, or
    -- until we are sure there is no way to get it
    log.debugInLua(reqt)
    local nreqt = adjustrequest(reqt)
    local h = _M.open(nreqt.host, nreqt.port, nreqt.create)
    -- send request line and headers
    h:sendrequestline(nreqt.method, nreqt.uri)
    h:sendheaders(nreqt.headers)
    -- if there is a body, send it
    if nreqt.source then
        h:sendbody(nreqt.headers, nreqt.source, nreqt.step)
    end
    local code, status = h:receivestatusline()
    -- if it is an HTTP/0.9 server, simply get the body and we are done
    if not code then
        h:receive09body(status, nreqt.sink, nreqt.step)
        return 1, 200
    end
    local headers
    -- ignore any 100-continue messages
    while code == 100 do
        headers = h:receiveheaders()
        code, status = h:receivestatusline()
    end
    headers = h:receiveheaders()
    -- at this point we should have a honest reply from the server
    -- we can't redirect if we already used the source, so we report the error
    if shouldredirect(nreqt, code, headers) and not nreqt.source then
        h:close()
        return tredirect(reqt, headers.location)
    end
    -- here we are finally done
    if shouldreceivebody(nreqt, code) then
        h:receivebody(headers, nreqt.sink, nreqt.step)
    end
    h:close()
    return 1, code, headers, status
end

你可能感兴趣的:(socket.http源码分析)