diff http/src/luan/modules/http/HttpServicer.java @ 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
line wrap: on
line diff
--- 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);
-		}
-
-	};
-
 }