updated lua_http_server
This commit is contained in:
parent
f73f29840e
commit
64cb157b68
111
hlib.lua
111
hlib.lua
@ -1,7 +1,99 @@
|
|||||||
local hlib = {}
|
local hlib = {}
|
||||||
|
local fmt = string.format
|
||||||
|
local g_version = "1.1"
|
||||||
|
local g_status_msg = {
|
||||||
|
[100] = "Continue",
|
||||||
|
[101] = "Switching Protocols",
|
||||||
|
[102] = "Processing",
|
||||||
|
[200] = "OK",
|
||||||
|
[201] = "Created",
|
||||||
|
[202] = "Accepted",
|
||||||
|
[203] = "Non-authoritative Information",
|
||||||
|
[204] = "No Content",
|
||||||
|
[205] = "Reset Content",
|
||||||
|
[206] = "Partial Content",
|
||||||
|
[207] = "Multi-Status",
|
||||||
|
[208] = "Already Reported",
|
||||||
|
[226] = "IM Used",
|
||||||
|
[300] = "Multiple Choices",
|
||||||
|
[301] = "Moved Permanently",
|
||||||
|
[302] = "Found",
|
||||||
|
[303] = "See Other",
|
||||||
|
[304] = "Not Modified",
|
||||||
|
[305] = "Use Proxy",
|
||||||
|
[307] = "Temporary Redirect",
|
||||||
|
[308] = "Permanent Redirect",
|
||||||
|
[400] = "Bad Request",
|
||||||
|
[401] = "Unauthorized",
|
||||||
|
[402] = "Payment Required",
|
||||||
|
[403] = "Forbidden",
|
||||||
|
[404] = "Not Found",
|
||||||
|
[405] = "Method Not Allowed",
|
||||||
|
[406] = "Not Acceptable",
|
||||||
|
[407] = "Proxy Authentication Required",
|
||||||
|
[408] = "Request Timeout",
|
||||||
|
[409] = "Conflict",
|
||||||
|
[410] = "Gone",
|
||||||
|
[411] = "Length Required",
|
||||||
|
[412] = "Precondition Failed",
|
||||||
|
[413] = "Payload Too Large",
|
||||||
|
[414] = "Request-URI Too Long",
|
||||||
|
[415] = "Unsupported Media Type",
|
||||||
|
[416] = "Requested Range Not Satisfiable",
|
||||||
|
[417] = "Expectation Failed",
|
||||||
|
[418] = "I’m a teapot",
|
||||||
|
[421] = "Misdirected Request",
|
||||||
|
[422] = "Unprocessable Entity",
|
||||||
|
[423] = "Locked",
|
||||||
|
[424] = "Failed Dependency",
|
||||||
|
[426] = "Upgrade Required",
|
||||||
|
[428] = "Precondition Required",
|
||||||
|
[429] = "Too Many Requests",
|
||||||
|
[431] = "Request Header Fields Too Large",
|
||||||
|
[444] = "Connection Closed Without Response",
|
||||||
|
[451] = "Unavailable For Legal Reasons",
|
||||||
|
[499] = "Client Closed Request",
|
||||||
|
[500] = "Internal Server Error",
|
||||||
|
[501] = "Not Implemented",
|
||||||
|
[502] = "Bad Gateway",
|
||||||
|
[503] = "Service Unavailable",
|
||||||
|
[504] = "Gateway Timeout",
|
||||||
|
[505] = "HTTP Version Not Supported",
|
||||||
|
[506] = "Variant Also Negotiates",
|
||||||
|
[507] = "Insufficient Storage",
|
||||||
|
[508] = "Loop Detected",
|
||||||
|
[510] = "Not Extended",
|
||||||
|
[511] = "Network Authentication Required",
|
||||||
|
[599] = "Network Connect Timeout Error",
|
||||||
|
}
|
||||||
|
|
||||||
|
function push_headers(headers, add)
|
||||||
|
for k,v in pairs(add) do
|
||||||
|
headers[k] = v
|
||||||
|
end
|
||||||
|
return headers
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_content_length(body)
|
||||||
|
return {["Content-Length"] = #body+1}
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_content_type(body)
|
||||||
|
return {["Content-Type"] = "text/html"}
|
||||||
|
end
|
||||||
|
|
||||||
|
local header_functions = {
|
||||||
|
get_content_length,
|
||||||
|
get_content_type
|
||||||
|
}
|
||||||
|
|
||||||
function hlib.parse_request(r)
|
function hlib.parse_request(r)
|
||||||
local request = {method=nil, path=nil, version=nil, headers={}}
|
local request = {
|
||||||
|
method = nil,
|
||||||
|
path = nil,
|
||||||
|
version = nil,
|
||||||
|
headers = {}
|
||||||
|
}
|
||||||
local lines = string.gmatch(r, "[^\n]+")
|
local lines = string.gmatch(r, "[^\n]+")
|
||||||
local head_msg = lines()
|
local head_msg = lines()
|
||||||
local _, _, method, path, version = string.find(head_msg, "(%u+) ([%w/]+) ([%w/%.]+)")
|
local _, _, method, path, version = string.find(head_msg, "(%u+) ([%w/]+) ([%w/%.]+)")
|
||||||
@ -20,17 +112,22 @@ end
|
|||||||
|
|
||||||
function hlib.response(path, status, body)
|
function hlib.response(path, status, body)
|
||||||
local resp = {
|
local resp = {
|
||||||
version=fmt("HTTP/%s",g_version),
|
version = fmt("HTTP/%s", g_version),
|
||||||
status=status,
|
status = status,
|
||||||
status_msg=g_status_msg[status],
|
status_msg = g_status_msg[status],
|
||||||
body=body,
|
body = body,
|
||||||
headers={}
|
headers = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for k,v in pairs(header_functions) do
|
||||||
|
resp.headers = push_headers(resp.headers, v(body))
|
||||||
|
end
|
||||||
local r = fmt(
|
local r = fmt(
|
||||||
[[%s %s %s
|
[[%s %s %s
|
||||||
|
Content-Length: %d
|
||||||
|
|
||||||
%s
|
%s
|
||||||
]], resp.version, resp.status, resp.status_msg, resp.body)
|
]], resp.version, resp.status, resp.status_msg, #resp.body+1, resp.body)
|
||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
|
|
||||||
|
13
http.lua
13
http.lua
@ -2,29 +2,26 @@
|
|||||||
|
|
||||||
local unix = require('unix')
|
local unix = require('unix')
|
||||||
local hlib = require('hlib')
|
local hlib = require('hlib')
|
||||||
local fmt = string.format
|
|
||||||
|
|
||||||
local g_version = "1.1"
|
|
||||||
local g_status_msg = {[200]="OK"}
|
|
||||||
|
|
||||||
local sock = unix.socket(unix.AF_INET, unix.SOCK_STREAM, 0)
|
local sock = unix.socket(unix.AF_INET, unix.SOCK_STREAM, 0)
|
||||||
unix.setsockopt(sock, unix.SOL_SOCKET, unix.SO_REUSEADDR, 1)
|
unix.setsockopt(sock, unix.SOL_SOCKET, unix.SO_LINGER|unix.SO_REUSEADDR|15, 1)
|
||||||
|
|
||||||
local listenaddr = unix.getaddrinfo("0.0.0.0","8080")()
|
local listenaddr = unix.getaddrinfo("0.0.0.0","8080")()
|
||||||
local b = unix.bind(sock, listenaddr)
|
local b = unix.bind(sock, listenaddr)
|
||||||
if not b then print("error binding socket") return end
|
if not b then print("error binding socket") return end
|
||||||
|
|
||||||
unix.listen(sock, 1024)
|
unix.listen(sock, 1024)
|
||||||
|
local csock = unix.accept(sock, 0)
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
unix.sleep(0.05)
|
unix.sleep(0.001)
|
||||||
local csock = unix.accept(sock, 0)
|
|
||||||
local msg = unix.recv(csock, 1024)
|
local msg = unix.recv(csock, 1024)
|
||||||
if msg then
|
if msg then
|
||||||
local req = hlib.parse_request(msg)
|
local req = hlib.parse_request(msg)
|
||||||
local data = hlib.response(req.path, 200, "test")
|
local data = hlib.response(req.path, 200, "test")
|
||||||
unix.send(csock, data)
|
unix.send(csock, data)
|
||||||
end
|
end
|
||||||
unix.shutdown(csock, 0)
|
unix.shutdown(csock, unix.SHUT_RDWR)
|
||||||
unix.close(csock)
|
unix.close(csock)
|
||||||
|
csock = unix.accept(sock, 0)
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user