Mercurial Hosting > luan
changeset 498:ee55be414a34
Http.response is now mostly luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 18 May 2015 00:25:35 -0600 |
parents | 55f9f74f1e55 |
children | fa4af530697f |
files | core/src/luan/LuanTable.java http/src/luan/modules/http/Http.luan http/src/luan/modules/http/HttpServicer.java http/src/luan/modules/http/run.luan |
diffstat | 4 files changed, 66 insertions(+), 114 deletions(-) [+] |
line wrap: on
line diff
--- a/core/src/luan/LuanTable.java Sun May 17 19:25:47 2015 -0600 +++ b/core/src/luan/LuanTable.java Mon May 18 00:25:35 2015 -0600 @@ -269,6 +269,15 @@ }; } + public Iterable<Map.Entry<Object,Object>> rawIterable() throws LuanException { + final Iterator<Map.Entry<Object,Object>> iter = rawIterator(); + return new Iterable<Map.Entry<Object,Object>>() { + public Iterator<Map.Entry<Object,Object>> iterator() { + return iter; + } + }; + } + public Iterator<Map.Entry<Object,Object>> iterator(final LuanState luan) throws LuanException { if( getHandler("__pairs") == null ) return rawIterator();
--- a/http/src/luan/modules/http/Http.luan Sun May 17 19:25:47 2015 -0600 +++ b/http/src/luan/modules/http/Http.luan Mon May 18 00:25:35 2015 -0600 @@ -1,3 +1,4 @@ +java() local Luan = require "luan:Luan" local ipairs = Luan.ipairs local pairs = Luan.pairs @@ -5,6 +6,8 @@ local Io = require "luan:Io" local Html = require "luan:Html" local url_encode = Html.url_encode +local HttpServicer = require "java:luan.modules.http.HttpServicer" +local IoLuan = require "java:luan.modules.IoLuan" local singular_metatable = {} @@ -69,6 +72,33 @@ return this end +STATUS = { + OK = 200; + -- add more as needed +} + +function 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,is_persistent,domain) + HttpServicer.setCookie(this.java,response.java,name,value,is_persistent,domain) + end + + function this.remove_cookie(name,domain) + HttpServicer.removeCookie(this.java,response.java,name,domain) + end + + function this.text_writer() + return IoLuan.textWriter(this.java.getWriter()) + end + end + return this +end + -- request = new_request{} -- filled in by HttpServicer
--- a/http/src/luan/modules/http/HttpServicer.java Sun May 17 19:25:47 2015 -0600 +++ b/http/src/luan/modules/http/HttpServicer.java Mon May 18 00:25:35 2015 -0600 @@ -150,14 +150,15 @@ cookieTbl.rawPut( cookie.getName(), unescape(cookie.getValue()) ); } - HttpServicer lib = new HttpServicer(request,response); - try { - module.put( luan, "response", lib.responseTable() ); - } catch(NoSuchMethodException e) { - throw new RuntimeException(e); - } + + // response + LuanTable responseTbl = new LuanTable(); + responseTbl.rawPut("java",response); + luan.call( (LuanFunction)module.rawGet("new_response"), new Object[]{responseTbl} ); + module.rawPut("response",responseTbl); luan.call(fn,"<http>"); + setResponse(module,response); return true; } @@ -172,105 +173,33 @@ return (LuanFunction)respond; } - - private final HttpServletRequest request; - private final HttpServletResponse response; - - private HttpServicer(HttpServletRequest request,HttpServletResponse response) { - this.request = request; - this.response = response; - } - - private LuanTable responseTable() throws NoSuchMethodException { - LuanTable tbl = LuanPropertyMeta.INSTANCE.newTable(); - LuanTable getters = LuanPropertyMeta.INSTANCE.getters(tbl); - LuanTable setters = LuanPropertyMeta.INSTANCE.setters(tbl); - tbl.rawPut("java",response); - tbl.rawPut( "send_redirect", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "sendRedirect", String.class ), response - ) ); - tbl.rawPut( "send_error", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "sendError", Integer.TYPE, String.class ), response - ) ); - LuanTable headers = new NameMeta() { - - @Override Object get(String name) { - return response.getHeader(name); - } - - @Override protected Iterator keys(LuanTable tbl) { - return response.getHeaderNames().iterator(); - } - - @Override public boolean canNewindex() { - return true; - } - - @Override public void __new_index(LuanState luan,LuanTable tbl,Object key,Object val) { - if( !(key instanceof String) ) - throw new IllegalArgumentException("key must be string for headers table"); - String name = (String)key; - if( val instanceof String ) { - response.setHeader(name,(String)val); - return; + private static void setResponse(LuanTable module,HttpServletResponse response) throws LuanException { + LuanTable responseTbl = (LuanTable)module.rawGet("response"); + int status = Luan.asInteger(responseTbl.rawGet("status")); + response.setStatus(status); + LuanTable responseHeaders = (LuanTable)responseTbl.rawGet("headers"); + for( Map.Entry<Object,Object> entry : responseHeaders.rawIterable() ) { + String name = (String)entry.getKey(); + name = name.replace('_','-'); + LuanTable values = (LuanTable)entry.getValue(); + for( Object value : values.asList() ) { + if( value instanceof String ) { + response.setHeader(name,(String)value); + continue; } - Integer i = Luan.asInteger(val); + Integer i = Luan.asInteger(value); if( i != null ) { response.setIntHeader(name,i); - return; + continue; } throw new IllegalArgumentException("value must be string or integer for headers table"); } - - @Override protected String type(LuanTable tbl) { - return "response.headers"; - } - - }.newTable(); - tbl.rawPut( "headers", headers ); - getters.rawPut( "content_type", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "getContentType" ), response - ) ); - setters.rawPut( "content_type", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "setContentType", String.class ), response - ) ); - getters.rawPut( "character_encoding", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "getCharacterEncoding" ), response - ) ); - setters.rawPut( "character_encoding", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "setCharacterEncoding", String.class ), response - ) ); - add( tbl, "text_writer" ); - add( tbl, "set_cookie", String.class, String.class, Boolean.TYPE, String.class ); - add( tbl, "remove_cookie", String.class, String.class ); - try { - getters.rawPut( "status", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "getStatus" ), response - ) ); - } catch(NoSuchMethodException e) { - logger.info("please upgrade jetty"); } - setters.rawPut( "status", new LuanJavaFunction( - HttpServletResponse.class.getMethod( "setStatus", Integer.TYPE ), response - ) ); - return tbl; + // no more headers + responseTbl.rawPut("headers",null); + responseTbl.rawPut("header",null); } - private void add(LuanTable t,String method,Class<?>... parameterTypes) throws NoSuchMethodException { - t.rawPut( method, new LuanJavaFunction(HttpServicer.class.getMethod(method,parameterTypes),this) ); - } - - public LuanTable text_writer() throws IOException { - return IoLuan.textWriter(response.getWriter()); - } - - public void set_cookie(String name,String value,boolean isPersistent, String domain) { - setCookie(request,response,name,value,isPersistent,domain); - } - - public void remove_cookie(String name, String domain) { - removeCookie(request,response,name,domain); - } // static utils @@ -323,20 +252,4 @@ } } - - - // util classes - - private static abstract class NameMeta extends LuanMeta { - abstract Object get(String name); - - @Override public Object __index(LuanState luan,LuanTable tbl,Object key) { - if( !(key instanceof String) ) - return null; - String name = (String)key; - return get(name); - } - - }; - }
--- a/http/src/luan/modules/http/run.luan Sun May 17 19:25:47 2015 -0600 +++ b/http/src/luan/modules/http/run.luan Mon May 18 00:25:35 2015 -0600 @@ -56,7 +56,7 @@ end local content_type = Http.request.parameter.content_type if content_type ~= nil then - Http.response.content_type = content_type + Http.response.header.content_type = content_type end local env = { request = Http.request; @@ -68,7 +68,7 @@ run() end; catch = function(e) - Http.response.content_type = "text/plain" + Http.response.header.content_type = "text/plain" print(e) print() print()