comparison src/luan/modules/http/LuanHandler.java @ 1358:1d31c1f3ea30

better not_found_handler
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 19 Apr 2019 00:47:58 -0600
parents 21b153b4bcc4
children 9721d4709bfb
comparison
equal deleted inserted replaced
1357:70a7eb76ee2c 1358:1d31c1f3ea30
91 @Override public Response handle(Request request) { 91 @Override public Response handle(Request request) {
92 if( isDisabled ) 92 if( isDisabled )
93 return null; 93 return null;
94 if( request.path.endsWith("/") ) 94 if( request.path.endsWith("/") )
95 return null; 95 return null;
96 String modName = "site:" + request.path +".luan"; 96 return handle(request,false);
97 return handle(request,modName); 97 }
98 } 98
99 99 Response handle(Request request,boolean notFound) {
100 Response handle(Request request,String modName) {
101 Thread thread = Thread.currentThread(); 100 Thread thread = Thread.currentThread();
102 String oldName = thread.getName(); 101 String oldName = thread.getName();
103 thread.setName(request.headers.get("host")+request.path); 102 thread.setName(request.headers.get("host")+request.path);
104 lock.readLock().lock(); 103 lock.readLock().lock();
105 try { 104 try {
106 return service(request,modName); 105 return service(request,notFound);
107 } catch(LuanException e) { 106 } catch(LuanException e) {
108 String err = e.getLuanStackTraceString(); 107 String err = e.getLuanStackTraceString();
109 logger.error(err+"\n"+request.rawHead.trim()+"\n"); 108 logger.error(err+"\n"+request.rawHead.trim()+"\n");
110 String msg = "Internel Server Error\n\n" + err; 109 String msg = "Internel Server Error\n\n" + err;
111 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg ); 110 return Response.errorResponse( Status.INTERNAL_SERVER_ERROR, msg );
207 206
208 207
209 208
210 // from HttpServicer 209 // from HttpServicer
211 210
212 private Response service(Request request,String modName) 211 private Response service(Request request,boolean notFound)
213 throws LuanException 212 throws LuanException
214 { 213 {
215 try { 214 try {
216 return serviceLuan(request,modName); 215 if( !notFound )
216 return serviceLuan(request);
217 else
218 return serviceNotFound(request);
217 } catch(LuanException e) { 219 } catch(LuanException e) {
218 return handleError(request,e); 220 return handleError(request,e);
219 } 221 }
220 } 222 }
221 223
230 } 232 }
231 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); 233 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan");
232 return (Response)module.fn("handle_error").call( request, e.table(luan) ); 234 return (Response)module.fn("handle_error").call( request, e.table(luan) );
233 } 235 }
234 236
235 private Response serviceLuan(Request request,String modName) 237 private Response serviceLuan(Request request)
236 throws LuanException 238 throws LuanException
237 { 239 {
240 String modName = "site:" + request.path +".luan";
238 LuanFunction fn; 241 LuanFunction fn;
239 Luan luan; 242 Luan luan;
240 synchronized(luanInit) { 243 synchronized(luanInit) {
241 enableLoad("luan:http/Http.luan",modName); 244 enableLoad("luan:http/Http.luan",modName);
242 PackageLuan.require(currentLuan,"luan:http/Http.luan"); 245 PackageLuan.require(currentLuan,"luan:http/Http.luan");
247 throw new LuanException( "module '"+modName+"' must return a function" ); 250 throw new LuanException( "module '"+modName+"' must return a function" );
248 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); 251 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
249 luan = (Luan)cloner.clone(currentLuan); 252 luan = (Luan)cloner.clone(currentLuan);
250 fn = (LuanFunction)cloner.get(mod); 253 fn = (LuanFunction)cloner.get(mod);
251 } 254 }
252
253 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan"); 255 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan");
254 module.fn("new_request").call(request); 256 module.fn("new_request").call(request);
255 module.fn("new_response").call(); 257 module.fn("new_response").call();
256
257 fn.call(); 258 fn.call();
258
259 return (Response)module.fn("finish").call(); 259 return (Response)module.fn("finish").call();
260 }
261
262 private Response serviceNotFound(Request request)
263 throws LuanException
264 {
265 Luan luan;
266 synchronized(luanInit) {
267 enableLoad("luan:http/Http.luan");
268 PackageLuan.require(currentLuan,"luan:http/Http.luan");
269 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
270 luan = (Luan)cloner.clone(currentLuan);
271 }
272 LuanTable module = (LuanTable)luan.require("luan:http/Http.luan");
273 LuanFunction fn = module.fn("not_found_handler");
274 if( fn == null )
275 return null;
276 module.fn("new_request").call(request);
277 module.fn("new_response").call();
278 Object obj = Luan.first(fn.call());
279 if( !(obj instanceof Boolean) )
280 throw new LuanException("not_found_handler must return boolean");
281 boolean handled = (Boolean)obj;
282 return handled ? (Response)module.fn("finish").call() : null;
260 } 283 }
261 284
262 private void enableLoad(String... mods) throws LuanException { 285 private void enableLoad(String... mods) throws LuanException {
263 LuanTable loaded = PackageLuan.loaded(currentLuan); 286 LuanTable loaded = PackageLuan.loaded(currentLuan);
264 for( String mod : mods ) { 287 for( String mod : mods ) {