From 64cb157b683c3183ea475c66228967179766d2bf Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 12 Jun 2024 22:29:03 +0200 Subject: [PATCH] updated lua_http_server --- hlib.lua | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++---- http.lua | 13 +++---- 2 files changed, 109 insertions(+), 15 deletions(-) diff --git a/hlib.lua b/hlib.lua index 24765bd..46f83a8 100644 --- a/hlib.lua +++ b/hlib.lua @@ -1,7 +1,99 @@ 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) - 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 head_msg = lines() local _, _, method, path, version = string.find(head_msg, "(%u+) ([%w/]+) ([%w/%.]+)") @@ -20,17 +112,22 @@ end function hlib.response(path, status, body) local resp = { - version=fmt("HTTP/%s",g_version), - status=status, - status_msg=g_status_msg[status], - body=body, - headers={} + version = fmt("HTTP/%s", g_version), + status = status, + status_msg = g_status_msg[status], + body = body, + headers = {} } + + for k,v in pairs(header_functions) do + resp.headers = push_headers(resp.headers, v(body)) + end local r = fmt( [[%s %s %s +Content-Length: %d %s -]], resp.version, resp.status, resp.status_msg, resp.body) +]], resp.version, resp.status, resp.status_msg, #resp.body+1, resp.body) return r end diff --git a/http.lua b/http.lua index be71a26..05fc4b0 100755 --- a/http.lua +++ b/http.lua @@ -2,29 +2,26 @@ local unix = require('unix') 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) -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 b = unix.bind(sock, listenaddr) if not b then print("error binding socket") return end unix.listen(sock, 1024) +local csock = unix.accept(sock, 0) while true do - unix.sleep(0.05) - local csock = unix.accept(sock, 0) + unix.sleep(0.001) local msg = unix.recv(csock, 1024) if msg then local req = hlib.parse_request(msg) local data = hlib.response(req.path, 200, "test") unix.send(csock, data) end - unix.shutdown(csock, 0) + unix.shutdown(csock, unix.SHUT_RDWR) unix.close(csock) + csock = unix.accept(sock, 0) end