diff --git a/examples/example/static/index.html b/examples/example/static/index.html index 62bfb7d..c9c1df0 100644 --- a/examples/example/static/index.html +++ b/examples/example/static/index.html @@ -9,6 +9,7 @@
+
diff --git a/iso-lock.json b/iso-lock.json index fe51488..3d46fce 100644 --- a/iso-lock.json +++ b/iso-lock.json @@ -1 +1 @@ -[] +[{"Name":"neon.ar","Version":"beta1.0.0","URL":"http://isotope.wbell.dev/isotope-download?name=neon.ar\u0026version=beta1.0.0"}] diff --git a/src/debug.ar b/src/debug.ar new file mode 100644 index 0000000..428bcee --- /dev/null +++ b/src/debug.ar @@ -0,0 +1 @@ +let inDebug = false \ No newline at end of file diff --git a/src/formdata.ar b/src/formdata.ar index f36d869..59e0948 100644 --- a/src/formdata.ar +++ b/src/formdata.ar @@ -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() \ No newline at end of file diff --git a/src/handleRequest.ar b/src/handleRequest.ar index bf42e45..152b25c 100644 --- a/src/handleRequest.ar +++ b/src/handleRequest.ar @@ -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) diff --git a/src/init.ar b/src/init.ar index 0add780..d0b0bcb 100644 --- a/src/init.ar +++ b/src/init.ar @@ -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)} diff --git a/src/parseRequest.ar b/src/parseRequest.ar index f0128be..b24e67b 100644 --- a/src/parseRequest.ar +++ b/src/parseRequest.ar @@ -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 diff --git a/src/renderTemplate.ar b/src/renderTemplate.ar new file mode 100644 index 0000000..0b5d3e1 --- /dev/null +++ b/src/renderTemplate.ar @@ -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) \ No newline at end of file diff --git a/src/url.ar b/src/url.ar index 86878cd..b907dfd 100644 --- a/src/url.ar +++ b/src/url.ar @@ -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 = []