annotate src/luan/modules/http/impl/HttpServicer.java @ 1160:4beabb087be6

add http/impl
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 05 Feb 2018 22:33:59 -0700
parents src/luan/modules/http/jetty/HttpServicer.java@3ef883468fd0
children fef8f0742da9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
1 package luan.modules.http.impl;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
2
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
3 import java.io.Closeable;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
4 import java.io.IOException;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
5 import java.util.Map;
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
6 import java.util.HashMap;
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
7 import org.slf4j.Logger;
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
8 import org.slf4j.LoggerFactory;
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
9 import luan.webserver.Request;
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
10 import luan.webserver.Response;
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
11 import luan.webserver.Status;
140
f4ce03ff6b2f add per_session for Http
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 139
diff changeset
12 import luan.Luan;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
13 import luan.LuanState;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
14 import luan.LuanFunction;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
15 import luan.LuanException;
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
16 import luan.LuanTable;
781
fbbdd369a13a rename DeepCloner to LuanCloner
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
17 import luan.LuanCloner;
169
9169581dc8fc add luan.modules.web
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 168
diff changeset
18 import luan.modules.PackageLuan;
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
19
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
20
251
705d14f4d8ee start web testing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 249
diff changeset
21 public final class HttpServicer {
436
52a6295e92c9 support old jetty
Franklin Schmidt <fschmidt@gmail.com>
parents: 433
diff changeset
22 private static final Logger logger = LoggerFactory.getLogger(HttpServicer.class);
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
23
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
24 public static Response service(LuanState luan,Request request)
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
25 throws LuanException
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
26 {
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
27 if( request.path.endsWith("/") )
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
28 return null;
138
06159094b802 replace WebRun.java with web_run.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 136
diff changeset
29 LuanFunction fn;
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
30 synchronized(luan) {
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
31 String modName = "site:" + request.path +".luan";
798
9eccfede1094 fix cloning bug
Franklin Schmidt <fschmidt@gmail.com>
parents: 796
diff changeset
32 PackageLuan.enableLoad(luan,"luan:http/Http.luan",modName);
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
33 LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan");
175
bdbd4740121f finish web server
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 173
diff changeset
34 Object mod = PackageLuan.load(luan,modName);
799
9c13a15a4002 Package.load() now returns false instead of null, and caches the result. This cleans up the luan.isLocked issues.
Franklin Schmidt <fschmidt@gmail.com>
parents: 798
diff changeset
35 if( mod.equals(Boolean.FALSE) )
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
36 return null;
505
7bc63886d4f2 web page modules now return a function
Franklin Schmidt <fschmidt@gmail.com>
parents: 504
diff changeset
37 if( !(mod instanceof LuanFunction) )
646
cdc70de628b5 simplify LuanException
Franklin Schmidt <fschmidt@gmail.com>
parents: 645
diff changeset
38 throw new LuanException( "module '"+modName+"' must return a function" );
1159
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1154
diff changeset
39 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL);
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1154
diff changeset
40 luan = (LuanState)cloner.clone(luan);
3ef883468fd0 remove Http.per_session_pages
Franklin Schmidt <fschmidt@gmail.com>
parents: 1154
diff changeset
41 fn = (LuanFunction)cloner.get(mod);
136
7e160d2f6d9c update HttpLib, untested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 135
diff changeset
42 }
139
3b384dc5ca91 replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 138
diff changeset
43
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 646
diff changeset
44 LuanTable module = (LuanTable)PackageLuan.require(luan,"luan:http/Http.luan");
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
45
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
46 // request
574
6cc2f047019b remove LuanState.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 572
diff changeset
47 LuanFunction newRequestFn = (LuanFunction)module.rawGet("new_request");
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
48 newRequestFn.call( luan, new Object[]{request} );
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
49
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
50 // response
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
51 Response response = new Response();
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
52 LuanFunction newResponseFn = (LuanFunction)module.rawGet("new_response");
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
53 LuanTable responseTbl = (LuanTable)newResponseFn.call( luan, new Object[]{response} );
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
54
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
55 fn.call(luan);
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
56
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
57 response.status = Status.getStatus( Luan.asInteger(responseTbl.rawGet("status")) );
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
58 LuanTable headersTbl = (LuanTable)responseTbl.rawGet("headers");
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
59 if( !headersTbl.rawIsEmpty() ) {
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
60 Map headers = (Map)Luan.toJava(headersTbl);
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
61 for( Object obj : headers.entrySet() ) {
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
62 Map.Entry entry = (Map.Entry)obj;
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
63 String name = (String)entry.getKey();
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
64 Object value = entry.getValue();
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
65 response.headers.put(name,value);
497
55f9f74f1e55 Http.request is now pure luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 496
diff changeset
66 }
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
67 }
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
68 Closeable writer = (Closeable)responseTbl.rawGet("writer");
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
69 if( writer != null ) {
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
70 try {
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
71 ((Closeable)writer).close();
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
72 } catch(IOException e) {
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
73 throw new RuntimeException(e);
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
74 }
361
0581238084ad fix HTTP parameters for multipart
Franklin Schmidt <fschmidt@gmail.com>
parents: 359
diff changeset
75 }
357
496d61b1fb5a implement Http.request.parts
Franklin Schmidt <fschmidt@gmail.com>
parents: 325
diff changeset
76
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
77 return response;
217
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
78 }
a608066395c5 clean up HttpLuan.java
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 202
diff changeset
79
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
80 public static void setCookie(LuanState luan,Response response,String name,String value,LuanTable attributesTbl)
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
81 throws LuanException
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
82 {
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
83 Map<String,String> attributes = new HashMap<String,String>();
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
84 if( attributesTbl != null ) {
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
85 for( Map.Entry entry : attributesTbl.iterable(luan) ) {
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
86 String key = (String)entry.getKey();
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
87 if( !(key instanceof String) )
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
88 throw new LuanException("cookie attribute name must be string");
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
89 String val = (String)entry.getValue();
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
90 if( !(val instanceof String) )
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
91 throw new LuanException("cookie attribute value must be string");
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
92 attributes.put(key,val);
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
93 }
1150
0842b9b570f8 change http headers interface
Franklin Schmidt <fschmidt@gmail.com>
parents: 1136
diff changeset
94 }
1160
4beabb087be6 add http/impl
Franklin Schmidt <fschmidt@gmail.com>
parents: 1159
diff changeset
95 response.setCookie(name,value,attributes);
89
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
96 }
8ef2d6701541 improve HttpLib
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 88
diff changeset
97
76
97b03fc807ad add HttpLib and WebServlet
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
98 }