Mercurial Hosting > luan
changeset 1158:267fdf5e9fbd
put Http.luan in jetty
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 05 Feb 2018 10:04:07 -0700 |
parents | 50879022f49d |
children | 3ef883468fd0 |
files | src/luan/modules/http/Http.luan src/luan/modules/http/Implementation.luan src/luan/modules/http/jetty/Http.luan |
diffstat | 3 files changed, 163 insertions(+), 163 deletions(-) [+] |
line wrap: on
line diff
--- a/src/luan/modules/http/Http.luan Mon Feb 05 01:25:42 2018 -0700 +++ b/src/luan/modules/http/Http.luan Mon Feb 05 10:04:07 2018 -0700 @@ -1,163 +1,2 @@ -java() -local Luan = require "luan:Luan.luan" -local error = Luan.error -local ipairs = Luan.ipairs or error() -local pairs = Luan.pairs or error() -local set_metatable = Luan.set_metatable or error() -local type = Luan.type or error() -local Io = require "luan:Io.luan" -local Html = require "luan:Html.luan" -local url_encode = Html.url_encode or error() -local Table = require "luan:Table.luan" -local clear = Table.clear or error() -local Package = require "luan:Package.luan" -local String = require "luan:String.luan" -local matches = String.matches or error() local Implementation = require "luan:http/Implementation.luan" -local HttpServicer = require(Implementation.java.."HttpServicer") -local IoLuan = require "java:luan.modules.IoLuan" - - -local Http = {} - -local function sent_error(_,_,_) - error "headers are not accessible after you start writing content" -end - -local sent_error_metatable = { __index=sent_error, __new_index=sent_error } - -function Http.sent_headers(headers) - clear(headers) - set_metatable(headers,sent_error_metatable) -end - - -local function new_common(this) - this = this or {} - this.headers = {} - return this -end - -local function to_list(input) - return type(input) == "table" and input or {input} -end - - -function Http.new_request(this) - this = new_common(this) - this.method = "GET" -- default - -- this.path - -- this.protocol - this.scheme = "http" -- default - this.port = 80 -- default - this.parameters = {} - this.cookies = {} - - function this.query_string() - local string_uri = Io.uri "string:" - local out = string_uri.text_writer() - local and_char = "" - for name, values in pairs(this.parameters) do - for _, value in ipairs(to_list(values)) do - out.write( and_char, url_encode(name), "=", url_encode(value) ) - and_char = "&" - end - end - out.close() - local s = string_uri.read_text() - return s ~= "" and s or nil - end - - function this.url() - local url = this.scheme.."://"..this.headers["host"]..this.path - if this.method ~= "POST" then - local query = this.query_string() - if query ~= nil then - url = url.."?"..query - end - end - return url - end - - return this -end - -local STATUS = { - OK = 200 - MOVED_PERMANENTLY = 301 - -- add more as needed -} -Http.STATUS = STATUS - -function Http.new_response(this) - this = new_common(this) - this.status = STATUS.OK - if this.java ~= nil then - this.send_redirect = this.java.sendRedirect - this.send_error = this.java.sendError - - function this.set_cookie(name,value,attributes) - HttpServicer.setCookie(Http.request.java,this.java,name,value,attributes) - end - - function this.set_persistent_cookie(name,value,attributes) - attributes = attributes or {} - attributes["Max-Age"] = "10000000" - this.set_cookie(name,value,attributes) - end - - function this.remove_cookie(name,attributes) - attributes = attributes or {} - attributes["Max-Age"] = "0" - this.set_cookie(name,"delete",attributes) - end - - function this.set() - HttpServicer.setResponse(this,this.java) - Http.sent_headers(this.headers) - end - - function this.text_writer() - this.java.setCharacterEncoding "UTF-8" - this.java.setContentType "text/html; charset=UTF-8" - this.set() - return IoLuan.textWriter(this.java.getWriter()) - end - - function this.binary_writer() - this.set() - return IoLuan.binaryWriter(this.java.getOutputStream()) - end - - function this.reset() - this.java.reset() - set_metatable(this.headers,nil) - end - end - return this -end - --- request = new_request{} -- filled in by HttpServicer --- response = new_response{} -- filled in by HttpServicer - - -Http.per_session_pages = {} - -function Http.per_session(page) - Http.per_session_pages[page] = true -end - -function Http.clear_session() - Http.request.java.getSession().removeAttribute("luan") -end - - -function Http.uncache_site() - for k in pairs(Table.copy(Package.loaded)) do - if matches(k,"^site:") then - Package.loaded[k] = nil - end - end -end - -return Http +return require(Implementation.luan.."Http.luan")
--- a/src/luan/modules/http/Implementation.luan Mon Feb 05 01:25:42 2018 -0700 +++ b/src/luan/modules/http/Implementation.luan Mon Feb 05 10:04:07 2018 -0700 @@ -1,4 +1,3 @@ return { luan = "luan:http/jetty/" - java = "java:luan.modules.http.jetty." }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/http/jetty/Http.luan Mon Feb 05 10:04:07 2018 -0700 @@ -0,0 +1,162 @@ +java() +local Luan = require "luan:Luan.luan" +local error = Luan.error +local ipairs = Luan.ipairs or error() +local pairs = Luan.pairs or error() +local set_metatable = Luan.set_metatable or error() +local type = Luan.type or error() +local Io = require "luan:Io.luan" +local Html = require "luan:Html.luan" +local url_encode = Html.url_encode or error() +local Table = require "luan:Table.luan" +local clear = Table.clear or error() +local Package = require "luan:Package.luan" +local String = require "luan:String.luan" +local matches = String.matches or error() +local HttpServicer = require "java:luan.modules.http.jetty.HttpServicer" +local IoLuan = require "java:luan.modules.IoLuan" + + +local Http = {} + +local function sent_error(_,_,_) + error "headers are not accessible after you start writing content" +end + +local sent_error_metatable = { __index=sent_error, __new_index=sent_error } + +function Http.sent_headers(headers) + clear(headers) + set_metatable(headers,sent_error_metatable) +end + + +local function new_common(this) + this = this or {} + this.headers = {} + return this +end + +local function to_list(input) + return type(input) == "table" and input or {input} +end + + +function Http.new_request(this) + this = new_common(this) + this.method = "GET" -- default + -- this.path + -- this.protocol + this.scheme = "http" -- default + this.port = 80 -- default + this.parameters = {} + this.cookies = {} + + function this.query_string() + local string_uri = Io.uri "string:" + local out = string_uri.text_writer() + local and_char = "" + for name, values in pairs(this.parameters) do + for _, value in ipairs(to_list(values)) do + out.write( and_char, url_encode(name), "=", url_encode(value) ) + and_char = "&" + end + end + out.close() + local s = string_uri.read_text() + return s ~= "" and s or nil + end + + function this.url() + local url = this.scheme.."://"..this.headers["host"]..this.path + if this.method ~= "POST" then + local query = this.query_string() + if query ~= nil then + url = url.."?"..query + end + end + return url + end + + return this +end + +local STATUS = { + OK = 200 + MOVED_PERMANENTLY = 301 + -- add more as needed +} +Http.STATUS = STATUS + +function Http.new_response(this) + this = new_common(this) + this.status = STATUS.OK + if this.java ~= nil then + this.send_redirect = this.java.sendRedirect + this.send_error = this.java.sendError + + function this.set_cookie(name,value,attributes) + HttpServicer.setCookie(Http.request.java,this.java,name,value,attributes) + end + + function this.set_persistent_cookie(name,value,attributes) + attributes = attributes or {} + attributes["Max-Age"] = "10000000" + this.set_cookie(name,value,attributes) + end + + function this.remove_cookie(name,attributes) + attributes = attributes or {} + attributes["Max-Age"] = "0" + this.set_cookie(name,"delete",attributes) + end + + function this.set() + HttpServicer.setResponse(this,this.java) + Http.sent_headers(this.headers) + end + + function this.text_writer() + this.java.setCharacterEncoding "UTF-8" + this.java.setContentType "text/html; charset=UTF-8" + this.set() + return IoLuan.textWriter(this.java.getWriter()) + end + + function this.binary_writer() + this.set() + return IoLuan.binaryWriter(this.java.getOutputStream()) + end + + function this.reset() + this.java.reset() + set_metatable(this.headers,nil) + end + end + return this +end + +-- request = new_request{} -- filled in by HttpServicer +-- response = new_response{} -- filled in by HttpServicer + + +Http.per_session_pages = {} + +function Http.per_session(page) + Http.per_session_pages[page] = true +end + +function Http.clear_session() + Http.request.java.getSession().removeAttribute("luan") +end + + +function Http.uncache_site() + for k in pairs(Table.copy(Package.loaded)) do + if matches(k,"^site:") then + Package.loaded[k] = nil + end + end +end + +return Http