Mercurial Hosting > luan
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 ) { |