Mercurial Hosting > luan
changeset 1163:fef8f0742da9
minor
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 06 Feb 2018 22:04:47 -0700 |
parents | e2d2354807f3 |
children | 1f9d34a6f308 |
files | src/luan/modules/http/Implementation.luan src/luan/modules/http/impl/Http.luan src/luan/modules/http/impl/HttpServicer.java |
diffstat | 3 files changed, 42 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/src/luan/modules/http/Implementation.luan Tue Feb 06 21:25:55 2018 -0700 +++ b/src/luan/modules/http/Implementation.luan Tue Feb 06 22:04:47 2018 -0700 @@ -1,4 +1,4 @@ return { --- luan = "luan:http/jetty/" - luan = "luan:http/impl/" + luan = "luan:http/jetty/" +-- luan = "luan:http/impl/" }
--- a/src/luan/modules/http/impl/Http.luan Tue Feb 06 21:25:55 2018 -0700 +++ b/src/luan/modules/http/impl/Http.luan Tue Feb 06 22:04:47 2018 -0700 @@ -1,6 +1,7 @@ java() local Luan = require "luan:Luan.luan" local error = Luan.error +local assert_string = Luan.assert_string or error() local ipairs = Luan.ipairs or error() local pairs = Luan.pairs or error() local type = Luan.type or error() @@ -15,8 +16,11 @@ local HttpServicer = require "java:luan.modules.http.impl.HttpServicer" local IoLuan = require "java:luan.modules.IoLuan" local LuanJava = require "java:luan.Luan" +local Response = require "java:luan.webserver.Response" local ResponseOutputStream = require "java:luan.webserver.ResponseOutputStream" +local Status = require "java:luan.webserver.Status" local OutputStreamWriter = require "java:java.io.OutputStreamWriter" +local HashMap = require "java:java.util.HashMap" local Http = {} @@ -60,22 +64,27 @@ } Http.STATUS = STATUS -function Http.new_response(java) - java or error() +function Http.new_response() local this = {} Http.response = this - this.java = java - this.headers = {} + function this.reset() + this.java = Response.new() + this.headers = {} + this.status = STATUS.OK + this.writer = nil + end - this.status = STATUS.OK + this.reset() function this.send_redirect(location) + this.reset() this.status = STATUS.FOUND this.headers["location"] = location end function this.send_error(status,msg) + this.reset() this.status = status if msg ~= nil then this.headers["content-type"] = "text/plain" @@ -85,7 +94,14 @@ end function this.set_cookie(name,value,attributes) - HttpServicer.setCookie(this.java,name,value,attributes) + attributes = attributes or {} + local attrMap = HashMap.new() + for attr_name, attr_value in pairs(attributes) do + assert_string(attr_name) + assert_string(attr_value) + attrMap.put(attr_name,attr_value) + end + this.java.setCookie(name,value,attrMap) end function this.set_persistent_cookie(name,value,attributes) @@ -101,12 +117,14 @@ end function this.text_writer() + this.writer and "writer already set" this.writer = ResponseOutputStream.new(this.java) this.writer = OutputStreamWriter.new(this.writer) return IoLuan.textWriter(this.writer) end function this.binary_writer() + this.writer and "writer already set" this.writer = ResponseOutputStream.new(this.java) return IoLuan.binaryWriter(this.writer) end @@ -114,6 +132,19 @@ return this end +function Http.finish() -- called only from java + local response = Http.response or error() + local java = response.java or error() + java.status = Status.getStatus(response.status) + for name, value in pairs(response.headers) do + assert_string(name) + value = LuanJava.toJava(value) + java.headers.put(name,value) + end + response.writer and response.writer.close() + return java +end + function Http.uncache_site() for k in pairs(Table.copy(Package.loaded)) do
--- a/src/luan/modules/http/impl/HttpServicer.java Tue Feb 06 21:25:55 2018 -0700 +++ b/src/luan/modules/http/impl/HttpServicer.java Tue Feb 06 22:04:47 2018 -0700 @@ -1,15 +1,9 @@ package luan.modules.http.impl; -import java.io.Closeable; -import java.io.IOException; -import java.util.Map; -import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import luan.webserver.Request; import luan.webserver.Response; -import luan.webserver.Status; -import luan.Luan; import luan.LuanState; import luan.LuanFunction; import luan.LuanException; @@ -48,51 +42,14 @@ newRequestFn.call( luan, new Object[]{request} ); // response - Response response = new Response(); LuanFunction newResponseFn = (LuanFunction)module.rawGet("new_response"); - LuanTable responseTbl = (LuanTable)newResponseFn.call( luan, new Object[]{response} ); + newResponseFn.call(luan); fn.call(luan); - response.status = Status.getStatus( Luan.asInteger(responseTbl.rawGet("status")) ); - LuanTable headersTbl = (LuanTable)responseTbl.rawGet("headers"); - if( !headersTbl.rawIsEmpty() ) { - Map headers = (Map)Luan.toJava(headersTbl); - for( Object obj : headers.entrySet() ) { - Map.Entry entry = (Map.Entry)obj; - String name = (String)entry.getKey(); - Object value = entry.getValue(); - response.headers.put(name,value); - } - } - Closeable writer = (Closeable)responseTbl.rawGet("writer"); - if( writer != null ) { - try { - ((Closeable)writer).close(); - } catch(IOException e) { - throw new RuntimeException(e); - } - } - + LuanFunction finishFn = (LuanFunction)module.rawGet("finish"); + Response response = (Response)finishFn.call(luan); return response; } - public static void setCookie(LuanState luan,Response response,String name,String value,LuanTable attributesTbl) - throws LuanException - { - Map<String,String> attributes = new HashMap<String,String>(); - if( attributesTbl != null ) { - for( Map.Entry entry : attributesTbl.iterable(luan) ) { - String key = (String)entry.getKey(); - if( !(key instanceof String) ) - throw new LuanException("cookie attribute name must be string"); - String val = (String)entry.getValue(); - if( !(val instanceof String) ) - throw new LuanException("cookie attribute value must be string"); - attributes.put(key,val); - } - } - response.setCookie(name,value,attributes); - } - }