Mercurial > hg > orthanc
annotate Core/Lua/LuaContext.cpp @ 2770:6cf5479009f6 Orthanc-0.9.0
close old branch
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 17 Jul 2018 09:44:54 +0200 |
parents | 6e7e5ed91c2d |
children | 02f5a3f5c0a0 |
rev | line source |
---|---|
386 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1055
diff
changeset
|
3 * Copyright (C) 2012-2015 Sebastien Jodogne, Medical Physics |
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1055
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
386 | 5 * |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
22 * | |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
824
a811bdf8b8eb
precompiled headers
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
689
diff
changeset
|
33 #include "../PrecompiledHeaders.h" |
386 | 34 #include "LuaContext.h" |
35 | |
36 #include <glog/logging.h> | |
996
cf52f3bcb2b3
clarification of Lua classes wrt multithreading
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
37 #include <cassert> |
386 | 38 |
39 extern "C" | |
40 { | |
41 #include <lualib.h> | |
42 #include <lauxlib.h> | |
43 } | |
44 | |
45 namespace Orthanc | |
46 { | |
1051 | 47 LuaContext& LuaContext::GetLuaContext(lua_State *state) |
386 | 48 { |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
49 // Get the pointer to the "LuaContext" underlying object |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
50 lua_getglobal(state, "_LuaContext"); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
51 assert(lua_type(state, -1) == LUA_TLIGHTUSERDATA); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
52 LuaContext* that = const_cast<LuaContext*>(reinterpret_cast<const LuaContext*>(lua_topointer(state, -1))); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
53 assert(that != NULL); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
54 lua_pop(state, 1); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
55 |
1051 | 56 return *that; |
57 } | |
58 | |
59 int LuaContext::PrintToLog(lua_State *state) | |
60 { | |
61 LuaContext& that = GetLuaContext(state); | |
62 | |
386 | 63 // http://medek.wordpress.com/2009/02/03/wrapping-lua-errors-and-print-function/ |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
64 int nArgs = lua_gettop(state); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
65 lua_getglobal(state, "tostring"); |
386 | 66 |
67 // Make sure you start at 1 *NOT* 0 for arrays in Lua. | |
68 std::string result; | |
69 | |
70 for (int i = 1; i <= nArgs; i++) | |
71 { | |
72 const char *s; | |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
73 lua_pushvalue(state, -1); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
74 lua_pushvalue(state, i); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
75 lua_call(state, 1, 1); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
76 s = lua_tostring(state, -1); |
386 | 77 |
78 if (result.size() > 0) | |
79 result.append(", "); | |
80 | |
81 if (s == NULL) | |
82 result.append("<No conversion to string>"); | |
83 else | |
84 result.append(s); | |
85 | |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
86 lua_pop(state, 1); |
386 | 87 } |
88 | |
1002
b067017a8a5b
anonymization refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
996
diff
changeset
|
89 LOG(WARNING) << "Lua says: " << result; |
1051 | 90 that.log_.append(result); |
91 that.log_.append("\n"); | |
386 | 92 |
93 return 0; | |
94 } | |
95 | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
96 |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
97 int LuaContext::SetHttpCredentials(lua_State *state) |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
98 { |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
99 LuaContext& that = GetLuaContext(state); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
100 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
101 // Check the types of the arguments |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
102 int nArgs = lua_gettop(state); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
103 if (nArgs != 2 || |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
104 !lua_isstring(state, 1) || // Username |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
105 !lua_isstring(state, 2)) // Password |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
106 { |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
107 LOG(ERROR) << "Lua: Bad parameters to SetHttpCredentials()"; |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
108 } |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
109 else |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
110 { |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
111 // Configure the HTTP client |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
112 const char* username = lua_tostring(state, 1); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
113 const char* password = lua_tostring(state, 2); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
114 that.httpClient_.SetCredentials(username, password); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
115 } |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
116 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
117 return 0; |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
118 } |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
119 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
120 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
121 bool LuaContext::AnswerHttpQuery(lua_State* state) |
1051 | 122 { |
123 std::string str; | |
124 | |
125 try | |
126 { | |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
127 httpClient_.Apply(str); |
1051 | 128 } |
129 catch (OrthancException& e) | |
130 { | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
131 return false; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
132 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
133 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
134 // Return the result of the HTTP request |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
135 lua_pushstring(state, str.c_str()); |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
136 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
137 return true; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
138 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
139 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
140 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
141 int LuaContext::CallHttpGet(lua_State *state) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
142 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
143 LuaContext& that = GetLuaContext(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
144 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
145 // Check the types of the arguments |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
146 int nArgs = lua_gettop(state); |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
147 if (nArgs != 1 || !lua_isstring(state, 1)) // URL |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
148 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
149 LOG(ERROR) << "Lua: Bad parameters to HttpGet()"; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
150 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
151 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
152 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
153 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
154 // Configure the HTTP client class |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
155 const char* url = lua_tostring(state, 1); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
156 that.httpClient_.SetMethod(HttpMethod_Get); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
157 that.httpClient_.SetUrl(url); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
158 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
159 // Do the HTTP GET request |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
160 if (!that.AnswerHttpQuery(state)) |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
161 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
162 LOG(ERROR) << "Lua: Error in HttpGet() for URL " << url; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
163 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
164 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
165 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
166 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
167 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
168 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
169 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
170 int LuaContext::CallHttpPostOrPut(lua_State *state, |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
171 HttpMethod method) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
172 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
173 LuaContext& that = GetLuaContext(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
174 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
175 // Check the types of the arguments |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
176 int nArgs = lua_gettop(state); |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
177 if ((nArgs != 1 && nArgs != 2) || |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
178 !lua_isstring(state, 1) || // URL |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
179 (nArgs >= 2 && !lua_isstring(state, 2))) // Body data |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
180 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
181 LOG(ERROR) << "Lua: Bad parameters to HttpPost() or HttpPut()"; |
1051 | 182 lua_pushstring(state, "ERROR"); |
183 return 1; | |
184 } | |
185 | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
186 // Configure the HTTP client class |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
187 const char* url = lua_tostring(state, 1); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
188 that.httpClient_.SetMethod(method); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
189 that.httpClient_.SetUrl(url); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
190 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
191 if (nArgs >= 2) |
1051 | 192 { |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
193 that.httpClient_.SetPostData(lua_tostring(state, 2)); |
1051 | 194 } |
195 else | |
196 { | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
197 that.httpClient_.AccessPostData().clear(); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
198 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
199 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
200 // Do the HTTP POST/PUT request |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
201 if (!that.AnswerHttpQuery(state)) |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
202 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
203 LOG(ERROR) << "Lua: Error in HttpPost() or HttpPut() for URL " << url; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
204 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
205 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
206 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
207 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
208 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
209 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
210 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
211 int LuaContext::CallHttpPost(lua_State *state) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
212 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
213 return CallHttpPostOrPut(state, HttpMethod_Post); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
214 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
215 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
216 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
217 int LuaContext::CallHttpPut(lua_State *state) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
218 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
219 return CallHttpPostOrPut(state, HttpMethod_Put); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
220 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
221 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
222 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
223 int LuaContext::CallHttpDelete(lua_State *state) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
224 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
225 LuaContext& that = GetLuaContext(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
226 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
227 // Check the types of the arguments |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
228 int nArgs = lua_gettop(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
229 if (nArgs != 1 || !lua_isstring(state, 1)) // URL |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
230 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
231 LOG(ERROR) << "Lua: Bad parameters to HttpDelete()"; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
232 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
233 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
234 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
235 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
236 // Configure the HTTP client class |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
237 const char* url = lua_tostring(state, 1); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
238 that.httpClient_.SetMethod(HttpMethod_Delete); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
239 that.httpClient_.SetUrl(url); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
240 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
241 // Do the HTTP DELETE request |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
242 std::string s; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
243 if (!that.httpClient_.Apply(s)) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
244 { |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
245 LOG(ERROR) << "Lua: Error in HttpDelete() for URL " << url; |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
246 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
247 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
248 else |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
249 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
250 lua_pushstring(state, "SUCCESS"); |
1051 | 251 } |
252 | |
253 return 1; | |
254 } | |
255 | |
256 | |
257 void LuaContext::PushJson(const Json::Value& value) | |
258 { | |
259 if (value.isString()) | |
260 { | |
261 lua_pushstring(lua_, value.asCString()); | |
262 } | |
263 else if (value.isDouble()) | |
264 { | |
265 lua_pushnumber(lua_, value.asDouble()); | |
266 } | |
267 else if (value.isInt()) | |
268 { | |
269 lua_pushinteger(lua_, value.asInt()); | |
270 } | |
271 else if (value.isUInt()) | |
272 { | |
273 lua_pushinteger(lua_, value.asUInt()); | |
274 } | |
275 else if (value.isBool()) | |
276 { | |
277 lua_pushboolean(lua_, value.asBool()); | |
278 } | |
279 else if (value.isNull()) | |
280 { | |
281 lua_pushnil(lua_); | |
282 } | |
283 else if (value.isArray()) | |
284 { | |
285 lua_newtable(lua_); | |
286 | |
287 // http://lua-users.org/wiki/SimpleLuaApiExample | |
288 for (Json::Value::ArrayIndex i = 0; i < value.size(); i++) | |
289 { | |
290 // Push the table index (note the "+1" because of Lua conventions) | |
291 lua_pushnumber(lua_, i + 1); | |
292 | |
293 // Push the value of the cell | |
294 PushJson(value[i]); | |
295 | |
296 // Stores the pair in the table | |
297 lua_rawset(lua_, -3); | |
298 } | |
299 } | |
300 else if (value.isObject()) | |
301 { | |
302 lua_newtable(lua_); | |
303 | |
304 Json::Value::Members members = value.getMemberNames(); | |
305 | |
306 for (Json::Value::Members::const_iterator | |
307 it = members.begin(); it != members.end(); ++it) | |
308 { | |
309 // Push the index of the cell | |
310 lua_pushstring(lua_, it->c_str()); | |
311 | |
312 // Push the value of the cell | |
313 PushJson(value[*it]); | |
314 | |
315 // Stores the pair in the table | |
316 lua_rawset(lua_, -3); | |
317 } | |
318 } | |
319 else | |
320 { | |
321 throw LuaException("Unsupported JSON conversion"); | |
322 } | |
323 } | |
324 | |
386 | 325 |
326 LuaContext::LuaContext() | |
327 { | |
328 lua_ = luaL_newstate(); | |
329 if (!lua_) | |
330 { | |
331 throw LuaException("Unable to create the Lua context"); | |
332 } | |
333 | |
334 luaL_openlibs(lua_); | |
335 lua_register(lua_, "print", PrintToLog); | |
1051 | 336 lua_register(lua_, "HttpGet", CallHttpGet); |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
337 lua_register(lua_, "HttpPost", CallHttpPost); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
338 lua_register(lua_, "HttpPut", CallHttpPut); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
339 lua_register(lua_, "HttpDelete", CallHttpDelete); |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
340 lua_register(lua_, "SetHttpCredentials", SetHttpCredentials); |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
341 |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
342 lua_pushlightuserdata(lua_, this); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
343 lua_setglobal(lua_, "_LuaContext"); |
386 | 344 } |
345 | |
346 | |
347 LuaContext::~LuaContext() | |
348 { | |
349 lua_close(lua_); | |
350 } | |
351 | |
352 | |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
353 void LuaContext::ExecuteInternal(std::string* output, |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
354 const std::string& command) |
386 | 355 { |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
356 log_.clear(); |
386 | 357 int error = (luaL_loadbuffer(lua_, command.c_str(), command.size(), "line") || |
358 lua_pcall(lua_, 0, 0, 0)); | |
359 | |
360 if (error) | |
361 { | |
362 assert(lua_gettop(lua_) >= 1); | |
363 | |
364 std::string description(lua_tostring(lua_, -1)); | |
365 lua_pop(lua_, 1); /* pop error message from the stack */ | |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
366 LOG(ERROR) << "Error while executing Lua script: " << description; |
386 | 367 throw LuaException(description); |
368 } | |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
369 |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
370 if (output != NULL) |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
371 { |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
372 *output = log_; |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
373 } |
386 | 374 } |
375 | |
376 | |
377 void LuaContext::Execute(EmbeddedResources::FileResourceId resource) | |
378 { | |
379 std::string command; | |
380 EmbeddedResources::GetFileResource(command, resource); | |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
381 ExecuteInternal(NULL, command); |
386 | 382 } |
397
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
383 |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
384 |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
385 bool LuaContext::IsExistingFunction(const char* name) |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
386 { |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
387 lua_settop(lua_, 0); |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
388 lua_getglobal(lua_, name); |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
389 return lua_type(lua_, -1) == LUA_TFUNCTION; |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
390 } |
1055
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
391 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
392 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
393 void LuaContext::Execute(Json::Value& output, |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
394 const std::string& command) |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
395 { |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
396 std::string s; |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
397 ExecuteInternal(&s, command); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
398 |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
399 Json::Reader reader; |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
400 if (!reader.parse(s, output)) |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
401 { |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
402 throw OrthancException(ErrorCode_BadFileFormat); |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
403 } |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
404 } |
6f923d52a46c
call Web services from Lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1052
diff
changeset
|
405 |
386 | 406 } |