updated lua_http_server

This commit is contained in:
Paul 2024-06-12 22:29:03 +02:00
parent f73f29840e
commit 64cb157b68
2 changed files with 109 additions and 15 deletions

111
hlib.lua
View File

@ -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] = "Im 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

View File

@ -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