impliment neon.ar and add more to formdata.ar

This commit is contained in:
William Bell committed 2023-07-19 13:26:21 +01:00
1 parent c1cbb9b918
commit c0713ff6ee
9 files changed
+60 -28

No files matched your search

+1
View File
@@ -9,6 +9,7 @@
<video src="/movie.mp4" controls width="500px"></video>
<form action="/form" method="post">
<input type="text" name="name" />
<input type="email" name="email" />
<input type="submit" value="Submit" />
</form>
</body>
+1 -1
View File
@@ -1 +1 @@
[]
[{"Name":"neon.ar","Version":"beta1.0.0","URL":"http://isotope.wbell.dev/isotope-download?name=neon.ar\u0026version=beta1.0.0"}]
+1
View File
@@ -0,0 +1 @@
let inDebug = false
+19 -11
View File
@@ -1,3 +1,14 @@
import "url" as url
let __makeFile(name, type, data) = do
let File = {name: name, type: type, data: data}
let save(path) = do
let file = file.write(path)
file.buffer(data)
file.close()
File.save = save
return File
let __multipart(req, res) = do
let boundary = buffer().from(req.headers["content-type"].splitN("boundary=", 2)[1])
let newLineSplit = buffer().from("\r\n\r\n")
@@ -22,15 +33,8 @@ let __multipart(req, res) = do
if (disposition[0] == "form-data") do
let name = json.parse(disposition[1].splitN("=", 2)[1])
if (disposition.length >= 3) do
req.files[name] = {}
req.files[name].name = json.parse(disposition[2].splitN("=", 2)[1])
req.files[name].type = headers["content-type"]
req.files[name].data = body
let save(path) = do
let file = file.write(path)
file.buffer(body)
file.close()
req.files[name].save = save
let filename = json.parse(disposition[2].splitN("=", 2)[1])
req.files[name] = __makeFile(filename, headers["content-type"], body)
else do
req.formdata[name] = body.to("string")
res.next()
@@ -41,6 +45,10 @@ let formdata(req, res) = do
req.files = {}
if (req.method != "POST") return res.next()
if ("content-type" in req.headers && req.headers["content-type"].lower().startswith("multipart/form-data")) do
return __multipart(req, res)
if ("content-type" not in req.headers) return res.next()
let loweredContentType = req.headers["content-type"].lower()
if (loweredContentType.startswith("multipart/form-data")) return __multipart(req, res)
else if (loweredContentType.startswith("application/x-www-form-urlencoded")) req.formdata = url.decodeURLQuery(req.buffer.body.to("string"))
else if (loweredContentType.startswith("application/json")) req.formdata = json.parse(req.buffer.body.to("string"))
else req.files.file = __makeFile("file", req.headers["content-type"], req.buffer.body)
res.next()
+3 -1
View File
@@ -3,6 +3,7 @@ import "parseRequest" as parseRequest
import "pathCompare" as pathCompare
import "url" as url
import "version" as version
import "renderTemplate" as renderTemplate
let handle(routes, conn, onErr) = do
try do
@@ -85,7 +86,8 @@ let handle(routes, conn, onErr) = do
conn.close()
for (i from 0 to request.on.end.length) do
request.on.end[i]()
response.renderTemplate(path, values) = do
response.send(renderTemplate.renderTemplate(path, values))
response.onErr(err) = do
if (onErr) onErr(err)
else term.log(err)
+9
View File
@@ -3,6 +3,15 @@ import "logger" as *
import "static" as *
import "cookie" as *
import "formdata" as *
import "debug" as __debug
let setDebug(value) = do
if (__debug.inDebug == value) return
__debug.inDebug = value
if (value) do
term.log("Debug mode enabled")
else do
term.log("Debug mode disabled")
let server() = do
let class = {port: 3000, numThreads: 1, callback: ()=term.log("Server running on port "+class.port)}
+1 -1
View File
@@ -13,7 +13,7 @@ let parse(conn) = do
let headers = {}
for (i from 1 to split.length) do
let header = split[i].splitN(": ", 2)
if (header.length < 2) break
if (header.length != 2) break
let name = header[0].lower()
let value = header[1]
headers[name] = value
+12
View File
@@ -0,0 +1,12 @@
import "neon.ar" as neon
import "debug" as debug
let templates = {}
let templatesPath = path.join([program.cwd, "templates"])
let renderTemplate(path, values) = do
if (path in templates && (not debug.inDebug)) return templates[path].render(values)
let template = neon.template(path)
if (not debug.inDebug) templates[path] = template
return template.render(values)
+13 -14
View File
@@ -24,21 +24,20 @@ let encode(data) = do
i = i + 1
return encoded.join("")
let decodeURLQuery(querytext) = do
let query = {}
let querySplit = querytext.split("&")
for (i from 0 to querySplit.length) do
let queryItem = querySplit[i].splitN("=", 2)
let nameDecoded = decode(queryItem[0])
if (queryItem.length != 2) query[nameDecoded] = ""
else query[nameDecoded] = decode(queryItem[1])
return query
let split(url) = do
let split = url.split("?")
if (split.length == 1) do
return {path: split[0], query: {}}
else do
querytext = split[1:].join("?")
let query = {}
let querySplit = querytext.split("&")
for (i from 0 to querySplit.length) do
let queryItem = querySplit[i].split("=")
if (queryItem.length == 1) do
query[decode(queryItem[0])] = ""
else do
query[decode(queryItem[0])] = decode(queryItem[1])
return {path: split[0], query: query}
let split = url.splitN("?", 2)
if (split.length != 2) return {path: split[0], query: {}}
else return {path: split[0], query: decodeURLQuery(split[1])}
let queryStr(query) = do
let queryStr = []