Mercurial Hosting > luan
comparison src/luan/modules/Rpc.luan @ 1520:d9a5405a3102
try statement
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 21 Jun 2020 18:14:13 -0600 |
parents | 0ba144491a42 |
children | c922446f53aa |
comparison
equal
deleted
inserted
replaced
1519:3ebf9781707c | 1520:d9a5405a3102 |
---|---|
13 local IoLuan = require "java:luan.modules.IoLuan" | 13 local IoLuan = require "java:luan.modules.IoLuan" |
14 local ByteArrayInputStream = require "java:java.io.ByteArrayInputStream" | 14 local ByteArrayInputStream = require "java:java.io.ByteArrayInputStream" |
15 local Luan = require "luan:Luan.luan" | 15 local Luan = require "luan:Luan.luan" |
16 local error = Luan.error | 16 local error = Luan.error |
17 local set_metatable = Luan.set_metatable or error() | 17 local set_metatable = Luan.set_metatable or error() |
18 local try = Luan.try or error() | |
19 local ipairs = Luan.ipairs or error() | 18 local ipairs = Luan.ipairs or error() |
20 local type = Luan.type or error() | 19 local type = Luan.type or error() |
21 local Boot = require "luan:Boot.luan" | 20 local Boot = require "luan:Boot.luan" |
22 local Io = require "luan:Io.luan" | 21 local Io = require "luan:Io.luan" |
23 local Thread = require "luan:Thread.luan" | 22 local Thread = require "luan:Thread.luan" |
110 client.write(call) | 109 client.write(call) |
111 if fn_name == "close" then | 110 if fn_name == "close" then |
112 client.close() | 111 client.close() |
113 return | 112 return |
114 end | 113 end |
115 return try { | 114 try |
116 function() | 115 local result = client.read() |
117 local result = client.read() | 116 return luan_args(result.returnValues,result["in"]) |
118 return luan_args(result.returnValues,result["in"]) | 117 catch e |
118 local cause = e.java.getCause() | |
119 if cause ~= nil and cause.instanceof(RpcException) and cause.getMessage() == "luan" then | |
120 error(cause.values.get(0)) | |
121 else | |
122 e.throw() | |
119 end | 123 end |
120 catch = function(e) | 124 end |
121 local cause = e.java.getCause() | |
122 if cause ~= nil and cause.instanceof(RpcException) and cause.getMessage() == "luan" then | |
123 error(cause.values.get(0)) | |
124 else | |
125 e.throw() | |
126 end | |
127 end | |
128 } | |
129 end_function | 125 end_function |
130 end_function | 126 end_function |
131 | 127 |
132 Rpc.functions = {} | 128 Rpc.functions = {} |
133 | 129 |
150 local fn = fns[cmd] | 146 local fn = fns[cmd] |
151 if fn == nil then | 147 if fn == nil then |
152 server.write(JavaRpc.COMMAND_NOT_FOUND) | 148 server.write(JavaRpc.COMMAND_NOT_FOUND) |
153 return | 149 return |
154 end_if | 150 end_if |
155 local rtn = try { | 151 local rtn |
156 function() | 152 try |
157 return {fn(luan_args(call.args,call["in"]))} | 153 rtn = {fn(luan_args(call.args,call["in"]))} |
158 end | 154 catch e |
159 catch = function(e) | 155 logger.warn(e) |
160 logger.warn(e) | 156 local ex = RpcException.new("luan",e.get_message()) |
161 local ex = RpcException.new("luan",e.get_message()) | 157 server.write(ex) |
162 server.write(ex) | 158 return |
163 return nil | 159 end |
164 end | |
165 } | |
166 if rtn==nil then return end | |
167 local binary_in, len_in = encode_binary(rtn) | 160 local binary_in, len_in = encode_binary(rtn) |
168 local result | 161 local result |
169 if binary_in == nil then | 162 if binary_in == nil then |
170 result = RpcResult.new(java_array(rtn)) | 163 result = RpcResult.new(java_array(rtn)) |
171 else | 164 else |
209 else | 202 else |
210 socket_server = IoUtils.getSSLServerSocketFactory().createServerSocket(port) | 203 socket_server = IoUtils.getSSLServerSocketFactory().createServerSocket(port) |
211 socket_server.setEnabledCipherSuites(Rpc.cipher_suites) | 204 socket_server.setEnabledCipherSuites(Rpc.cipher_suites) |
212 end | 205 end |
213 while true do | 206 while true do |
214 try { | 207 try |
215 function() | 208 local socket = socket_server.accept() |
216 local socket = socket_server.accept() | 209 local function server() |
217 local function server() | 210 local responder = nil |
218 local responder = nil | 211 try |
219 try { | 212 responder = rpc_responder(socket,fns) |
220 function() | 213 while not responder.is_closed() do |
221 responder = rpc_responder(socket,fns) | 214 responder.respond() |
222 while not responder.is_closed() do | 215 end |
223 responder.respond() | 216 catch e |
224 end | 217 logger.warn(e) |
225 end | 218 finally |
226 catch = function(e) | 219 responder and responder.after_close and responder.after_close() |
227 logger.warn(e) | |
228 end | |
229 finally = function() | |
230 responder and responder.after_close and responder.after_close() | |
231 end | |
232 } | |
233 end | 220 end |
234 Thread.fork(server) | |
235 end | 221 end |
236 catch = function(e) | 222 Thread.fork(server) |
237 logger.error(e) | 223 catch e |
238 end | 224 logger.error(e) |
239 } | 225 end |
240 end_while | 226 end_while |
241 end_function | 227 end_function |
242 | 228 |
243 return Rpc | 229 return Rpc |