lua lor mongol socket.http OpenResty

local lor = require("lor.index")
local cjson = require("cjson")
local template = require("resty.template")
local mongo = require ("resty.mongol")

local http = require("socket.http")
local ltn12 = require("ltn12")

conn = mongo:new()
conn:set_timeout(1000)
ok, err = conn:connect("127.0.0.1", 27017)
if not ok then
    print("connect failed: "..err)
end

local db = conn:new_db_handle("fancy")

local app = lor()

local example = "/home/an/lua_project/app/views/example/"

-- 模板配置
app:conf("view enable", true)
app:conf("view engine", "tmpl")
app:conf("view ext", "php")
app:conf("views", "/home/an/lua_project/app/views/example/")
 
function Split(szFullString, szSeparator)
local nFindStartIndex = 1
local nSplitIndex = 1
local nSplitArray = {}
while true do
    local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
    if not nFindLastIndex then
         nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
         break
    end
    nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
    nFindStartIndex = nFindLastIndex + string.len(szSeparator)
    nSplitIndex = nSplitIndex + 1
    end
return nSplitArray
end

function tableToString(studentNum)
     local str =  "{ "
     str = str.."\n"
     for k, v in pairs(studentNum) do
        if type(v) ~= "table" then
            str = str.."[\""..k.."\"]"
            str = str..":"
            str = str..v
            str = str..","
            str = str.."\n"
        else
            str = str.."[\""..k.."\"]"
            str = str..":"
            str = str..tableToString(v)
            str = str..","
            str = str.."\n"
        end
     end
     str = string.sub(str, 1, -3)
     str = str.."\n"
     str = str .." }"
     return str
end

function get_req(url, headers)
    local response_body = {}
    response, status_code, headers = http.request {
                            method = "GET",
                            url = url,
                            headers = headers,
                             sink = ltn12.sink.table(response_body),       
                           }
    if status_code == 200 then                      
        return response_body
    else
        return nil
    end
end

function post_req(url, headers, postdata_json)
    local response_body = {}
    headers["content-length"] = string.len(postdata_json)
    response, status_code, headers = http.request {
                            method = "POST",
                            url = url,
                            source = ltn12.source.string(postdata_json),
                            headers = headers,
                            sink = ltn12.sink.table(response_body),       
                           }
    if status_code == 200 then                      
        return response_body
    else
        return nil
    end
end

function get_demo(post_data)
    local url = "http://127.0.0.1:8000/v1/get"

    return nil
end

function post_demo(post_data, headers)
    local url = "http://127.0.0.1:8000/v1/post/ajax"
    local postdata_json = cjson.encode(post_data)
    local response_body = post_req(url, headers, postdata_json)
    if response_body then
        return response_body
    else    
        return nil
    end    
end    

function post_downloads_html(post_data, headers)
    local url = "http://127.0.0.1:8000/v1/downloads_html"
    local postdata_json = cjson.encode(post_data)
    local response_body = post_req(url, headers, postdata_json)
    if response_body then
        return response_body
    else    
        return nil
    end    
end    

app:get("/post/test", function(req, res, next)
    local he = req.headers
    local url = "http://127.0.0.1:8000/v1/post"
    local host = Split(url, "/")[3]
    local postdata = {}
    postdata["test"] = 1
    local postdata_json = cjson.encode(postdata)
    headers = {["Host"] = host,
               ["Accept"] = "*/*",
               ["Accept-Encoding"] = "gzip, deflate",
               ["Referer"] = he["Referer"],
               ["Content-Type"] = "application/json",
               ["content-length"] = string.len(postdata_json),
               ["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.103 Chrome/73.0.3683.103 Safari/537.36",
              }
    local response_body = post_req(url, headers, postdata_json)
    if response_body then                      
        res:send(response_body[1])
        --res:send("hello world! body: "..tableToString(response_body))
    else
        res:send("get url is nil")
    end    
end)

app:get("/", function(req, res, next)
    res:render("example/index", {
    })
end)

function file_exists(path)
      local file = io.open(path, "rb")
      if file then file:close() end
      return file ~= nil
end

local function read_files(fileName)
    local f = assert(io.open(fileName, 'r'))
    local content = f:read("*all")f:close()
    return content
end

app:get("/market/index.php", function(req, res, next)
    local query = req.query
    local month = query.month
    local uri = req.origin_uri
    local file_ = Split(uri, "?")[2]
    if not file_ then
        res:render("market/index", {})
    else
        local file_name = string.format("%stest/index.php_%s", example, file_)
        local status = file_exists(file_name)
        if status == false then
            local post_ = {}
            post_["url"] = uri
            local dowon = post_downloads_html(post_, req.headers)
        end

        local html_body = read_files(file_name)
        res:html(html_body)
    end
end)
app:post("/ajax/get_data_format.php", function(req, res, next)
    local post_data_ = ngx.req.get_body_data()
    local get_data_format = db:get_col("get_data_format")
    find_data_ = get_data_format:find_one({post_data=post_data_})
    if find_data_ then
        res:status(200):send(find_data_["data"])
    else 
        local post_ = {}
        local key = "get_data_format"
        post_["key"] = key
        post_["post_data"] = post_data_
        local data_ = post_demo(post_, req.headers)
        res:status(200):send(data_)
    end
end)

 

posted @ 2019-05-13 17:35  🐳.城南  阅读(273)  评论(0编辑  收藏  举报