diff src/luan/modules/http/jetty/HttpServicer.java @ 1150:0842b9b570f8

change http headers interface
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 04 Feb 2018 18:03:37 -0700
parents d30d400fd43d
children 21d157b153fe
line wrap: on
line diff
--- a/src/luan/modules/http/jetty/HttpServicer.java	Sun Feb 04 17:23:20 2018 -0700
+++ b/src/luan/modules/http/jetty/HttpServicer.java	Sun Feb 04 18:03:37 2018 -0700
@@ -87,12 +87,15 @@
 		LuanTable headersTbl = (LuanTable)requestTbl.rawGet("headers");
 		for( Enumeration<String> enKeys = request.getHeaderNames(); enKeys.hasMoreElements(); ) {
 			String key = enKeys.nextElement();
-			LuanTable values = new LuanTable();
+			List<String> values = new ArrayList<String>();
 			for( Enumeration<String> en = request.getHeaders(key); en.hasMoreElements(); ) {
-				values.rawPut(values.rawLength()+1,en.nextElement());
+				values.add(en.nextElement());
 			}
-			key = toLuanHeaderName(key);
-			headersTbl.rawPut(key,values);
+			int size = values.size();
+			if(size==0) throw new RuntimeException();
+			key = key.toLowerCase();
+			Object value = size==1 ? values.get(0) : new LuanTable(values);
+			headersTbl.rawPut(key,value);
 		}
 
 		LuanTable parametersTbl = (LuanTable)requestTbl.rawGet("parameters");
@@ -199,51 +202,35 @@
 		LuanTable responseHeaders = (LuanTable)responseTbl.rawGet("headers");
 		for( Map.Entry<Object,Object> entry : responseHeaders.rawIterable() ) {
 			String name = (String)entry.getKey();
-			name = toHttpHeaderName(name);
-			LuanTable values = (LuanTable)entry.getValue();
-			for( Object value : values.asList() ) {
-				if( value instanceof String ) {
-					response.setHeader(name,(String)value);
-					continue;
+			Object val = entry.getValue();
+			if( val instanceof LuanTable ) {
+				LuanTable values = (LuanTable)val;
+				for( Object value : values.asList() ) {
+					setResponse(response,name,value);
 				}
-				Integer i = Luan.asInteger(value);
-				if( i != null ) {
-					response.setIntHeader(name,i);
-					continue;
-				}
-				throw new IllegalArgumentException("value must be string or integer for headers table");
+			} else {
+				setResponse(response,name,val);
 			}
 		}
 	}
 
+	private static void setResponse(HttpServletResponse response,String name,Object value) throws LuanException {
+		if( value instanceof String ) {
+			response.setHeader(name,(String)value);
+			return;
+		}
+		Integer i = Luan.asInteger(value);
+		if( i != null ) {
+			response.setIntHeader(name,i);
+			return;
+		}
+		throw new IllegalArgumentException("value must be string or integer for headers table");
+	}
+
 
 
 	// static utils
 
-	public static String toLuanHeaderName(String httpName) {
-		return httpName.toLowerCase().replace('-','_');
-	}
-
-	public static String toHttpHeaderName(String luanName) {
-/*
-		StringBuilder buf = new StringBuilder();
-		boolean capitalize = true;
-		char[] a = luanName.toCharArray();
-		for( int i=0; i<a.length; i++ ) {
-			char c = a[i];
-			if( c == '_' ) {
-				a[i] = '-';
-				capitalize = true;
-			} else if( capitalize ) {
-				a[i] = Character.toUpperCase(c);
-				capitalize = false;
-			}
-		}
-		return String.valueOf(a);
-*/
-		return LuanUrl.toHttpHeaderName(luanName);
-	}
-
 	private static String escape(String value) {
 		return value.replaceAll(";", "%3B");
 	}