Mercurial Hosting > luan
changeset 1150:0842b9b570f8
change http headers interface
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 04 Feb 2018 18:03:37 -0700 |
parents | 1b7c20e20ca7 |
children | dbb3cb906482 |
files | src/luan/modules/http/Http.luan src/luan/modules/http/jetty/HttpServicer.java src/luan/modules/http/tools/Dump_mod.luan src/luan/modules/http/tools/java_threads.luan src/luan/modules/http/tools/luan_threads.luan src/luan/modules/http/tools/run.luan src/luan/modules/url/LuanUrl.java |
diffstat | 7 files changed, 38 insertions(+), 78 deletions(-) [+] |
line wrap: on
line diff
--- a/src/luan/modules/http/Http.luan Sun Feb 04 17:23:20 2018 -0700 +++ b/src/luan/modules/http/Http.luan Sun Feb 04 18:03:37 2018 -0700 @@ -52,8 +52,6 @@ local function new_common(this) this = this or {} this.headers = {} - this.header = {__plural=this.headers} - set_metatable(this.header,singular_metatable) return this end @@ -86,7 +84,7 @@ end function this.url() - local url = this.scheme.."://"..this.header.host..this.path + local url = this.scheme.."://"..this.headers["host"]..this.path if this.method ~= "POST" then local query = this.query_string() if query ~= nil then
--- 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"); }
--- a/src/luan/modules/http/tools/Dump_mod.luan Sun Feb 04 17:23:20 2018 -0700 +++ b/src/luan/modules/http/tools/Dump_mod.luan Sun Feb 04 18:03:37 2018 -0700 @@ -4,17 +4,12 @@ local ipairs = Luan.ipairs or error() local Io = require "luan:Io.luan" local Http = require "luan:http/Http.luan" -java() -local Implementation = require "luan:http/Implementation.luan" -local HttpServicer = require(Implementation.java.."HttpServicer") + local Dump_mod = {} -local to_http_header_name = HttpServicer.toHttpHeaderName -Dump_mod.to_http_header_name = to_http_header_name - function Dump_mod.respond() - Http.response.header.content_type = "text/plain" + Http.response.headers["content-type"] = "text/plain" Io.stdout = Http.response.text_writer() local method = Http.request.method @@ -40,10 +35,9 @@ function Dump_mod.dump_headers(headers) for name, values in pairs(headers) do - local header_name = to_http_header_name(name) for _, value in ipairs(values) do %> -<%=header_name%>: <%=value%> +<%=name%>: <%=value%> <% end end
--- a/src/luan/modules/http/tools/java_threads.luan Sun Feb 04 17:23:20 2018 -0700 +++ b/src/luan/modules/http/tools/java_threads.luan Sun Feb 04 18:03:37 2018 -0700 @@ -23,7 +23,7 @@ <html> <body> <h1>Java Threads</h1> - <p><%=Http.request.header.host%> - <%=Time.format(Time.now())%></p> + <p><%=Http.request.headers["host"]%> - <%=Time.format(Time.now())%></p> <% local count = 0 for _, thread in Luan.ipairs(threads) do
--- a/src/luan/modules/http/tools/luan_threads.luan Sun Feb 04 17:23:20 2018 -0700 +++ b/src/luan/modules/http/tools/luan_threads.luan Sun Feb 04 18:03:37 2018 -0700 @@ -25,7 +25,7 @@ <html> <body> <h1>Luan Threads</h1> - <p><%=Http.request.header.host%> - <%=Time.format(Time.now())%></p> + <p><%=Http.request.headers["host"]%> - <%=Time.format(Time.now())%></p> <% local count = 0 for _, thread in Luan.ipairs(threads) do
--- a/src/luan/modules/http/tools/run.luan Sun Feb 04 17:23:20 2018 -0700 +++ b/src/luan/modules/http/tools/run.luan Sun Feb 04 18:03:37 2018 -0700 @@ -76,7 +76,7 @@ return function() local content_type = Http.request.parameter.content_type if content_type ~= nil then - Http.response.header.content_type = content_type + Http.response.headers["content-type"] = content_type end Io.stdout = Http.response.text_writer() local code = Http.request.parameter.code @@ -91,7 +91,7 @@ end; catch = function(e) Http.response.reset() - Http.response.header.content_type = "text/plain" + Http.response.headers["content-type"] = "text/plain" Io.stdout = Http.response.text_writer() print(e) print""
--- a/src/luan/modules/url/LuanUrl.java Sun Feb 04 17:23:20 2018 -0700 +++ b/src/luan/modules/url/LuanUrl.java Sun Feb 04 18:03:37 2018 -0700 @@ -52,17 +52,16 @@ headers = new HashMap(); for( Object hack : headerMap.entrySet() ) { Map.Entry entry = (Map.Entry)hack; - String key = (String)entry.getKey(); + String name = (String)entry.getKey(); Object val = entry.getValue(); - String name = toHttpHeaderName(key); if( val instanceof String ) { headers.put(name,val); } else { if( !(val instanceof LuanTable) ) - throw new LuanException( "header '"+key+"' must be string or table" ); + throw new LuanException( "header '"+name+"' must be string or table" ); LuanTable t = (LuanTable)val; if( !t.isList() ) - throw new LuanException( "header '"+key+"' table must be list" ); + throw new LuanException( "header '"+name+"' table must be list" ); headers.put(name,t.asList()); } } @@ -148,24 +147,6 @@ } } - public static String toHttpHeaderName(String luanName) { - luanName = luanName.toLowerCase(); - 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 == '_' || c == '-' ) { - a[i] = '-'; - capitalize = true; - } else if( capitalize ) { - a[i] = Character.toUpperCase(c); - capitalize = false; - } - } - return String.valueOf(a); - } - private static void and(StringBuilder sb) { if( sb.length() > 0 ) sb.append('&');