local skynet = require "skynet" local socket = require "skynet.socket" local httpd = require "http.httpd" local sockethelper = require "http.sockethelper" local urllib = require "http.url" require "shared.init" require "utils.init" local table = table local string = string local port = ... port = tonumber(port) local key = "zhaolu1234dangge" local function response(id, ...) local ok, err = httpd.write_response(sockethelper.writefunc(id), ...) if not ok then -- if err == sockethelper.socket_error , that means socket closed. skynet.error(string.format("fd = %d, %s", id, err)) end end local CMD = require "actions.HttpAction" local function start() local listen_socket = socket.listen("0.0.0.0", port) print("Listen web port " .. port) socket.start(listen_socket , function(id, addr) socket.start(id) local code, url, method, header, body = httpd.read_request(sockethelper.readfunc(id), 8192) if code then if code ~= 200 then response(id, code) else local path, query = urllib.parse(url) local cmd = path:match("([^/]+)") if not CMD[cmd] or not query then response(id, 404) socket.close(id) return end local query = urllib.parse_query(query) if query.key ~= key then response(id, 404) socket.close(id) return end local content = CMD[cmd](query, body) if not content then code = 404 end response(id, code, content) end else if url == sockethelper.socket_error then skynet.error("socket closed") else skynet.error(url) end end socket.close(id) end) end local function __init__() skynet.dispatch("lua", function(_,_, command, ...) if command == "start" then skynet.ret(skynet.pack(start(...))) end end) end skynet.start(__init__)