Mercurial > hg > orthanc
annotate Core/Lua/LuaContext.cpp @ 1052:cc4ff680e2a0
http requests in lua
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 23 Jul 2014 15:08:09 +0200 |
parents | 92f4bf2c5d73 |
children | 6f923d52a46c |
rev | line source |
---|---|
386 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
689 | 3 * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege, |
386 | 4 * Belgium |
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 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
97 bool LuaContext::DoHttpQuery(lua_State* state, |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
98 bool isJson) |
1051 | 99 { |
100 std::string str; | |
101 Json::Value json; | |
102 | |
103 try | |
104 { | |
105 if (isJson) | |
106 { | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
107 httpClient_.Apply(json); |
1051 | 108 } |
109 else | |
110 { | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
111 httpClient_.Apply(str); |
1051 | 112 } |
113 } | |
114 catch (OrthancException& e) | |
115 { | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
116 return false; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
117 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
118 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
119 // Return the result of the HTTP request |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
120 if (isJson) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
121 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
122 PushJson(json); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
123 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
124 else |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
125 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
126 lua_pushstring(state, str.c_str()); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
127 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
128 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
129 return true; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
130 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
131 |
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 int LuaContext::CallHttpGet(lua_State *state) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
134 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
135 LuaContext& that = GetLuaContext(state); |
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 // Check the types of the arguments |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
138 int nArgs = lua_gettop(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
139 if ((nArgs != 1 && nArgs != 2) || |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
140 !lua_isstring(state, 1) || // URL |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
141 (nArgs >= 2 && !lua_isboolean(state, 2))) // Interpret result as JSON |
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 LOG(ERROR) << "Lua: Bad parameters to HttpGet()"; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
144 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
145 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
146 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
147 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
148 // Configure the HTTP client class |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
149 const char* url = lua_tostring(state, 1); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
150 bool isJson = (nArgs >= 2 && lua_toboolean(state, 2)); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
151 that.httpClient_.SetMethod(HttpMethod_Get); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
152 that.httpClient_.SetUrl(url); |
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 // Do the HTTP GET request |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
155 if (!that.DoHttpQuery(state, isJson)) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
156 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
157 LOG(ERROR) << "Lua: Error in HttpGet() for URL " << url; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
158 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
159 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
160 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
161 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
162 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
163 |
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 int LuaContext::CallHttpPostOrPut(lua_State *state, |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
166 HttpMethod method) |
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 LuaContext& that = GetLuaContext(state); |
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 // Check the types of the arguments |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
171 int nArgs = lua_gettop(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
172 if ((nArgs != 1 && nArgs != 2 && nArgs != 3) || |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
173 !lua_isstring(state, 1) || // URL |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
174 (nArgs >= 2 && !lua_isstring(state, 2)) || // Body data |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
175 (nArgs >= 3 && !lua_isboolean(state, 3))) // Interpret result as JSON |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
176 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
177 LOG(ERROR) << "Lua: Bad parameters to HttpPost() or HttpPut()"; |
1051 | 178 lua_pushstring(state, "ERROR"); |
179 return 1; | |
180 } | |
181 | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
182 // Configure the HTTP client class |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
183 const char* url = lua_tostring(state, 1); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
184 bool isJson = (nArgs >= 3 && lua_toboolean(state, 3)); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
185 that.httpClient_.SetMethod(method); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
186 that.httpClient_.SetUrl(url); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
187 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
188 if (nArgs >= 2) |
1051 | 189 { |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
190 that.httpClient_.SetPostData(lua_tostring(state, 2)); |
1051 | 191 } |
192 else | |
193 { | |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
194 that.httpClient_.AccessPostData().clear(); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
195 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
196 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
197 // Do the HTTP POST/PUT request |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
198 if (!that.DoHttpQuery(state, isJson)) |
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 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
|
201 lua_pushstring(state, "ERROR"); |
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 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
204 return 1; |
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 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
208 int LuaContext::CallHttpPost(lua_State *state) |
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 return CallHttpPostOrPut(state, HttpMethod_Post); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
211 } |
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 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
214 int LuaContext::CallHttpPut(lua_State *state) |
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 return CallHttpPostOrPut(state, HttpMethod_Put); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
217 } |
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 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
220 int LuaContext::CallHttpDelete(lua_State *state) |
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 LuaContext& that = GetLuaContext(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
223 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
224 // Check the types of the arguments |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
225 int nArgs = lua_gettop(state); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
226 if (nArgs != 1 || !lua_isstring(state, 1)) // URL |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
227 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
228 LOG(ERROR) << "Lua: Bad parameters to HttpDelete()"; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
229 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
230 return 1; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
231 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
232 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
233 // Configure the HTTP client class |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
234 const char* url = lua_tostring(state, 1); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
235 that.httpClient_.SetMethod(HttpMethod_Delete); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
236 that.httpClient_.SetUrl(url); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
237 |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
238 // Do the HTTP DELETE request |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
239 std::string s; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
240 if (!that.httpClient_.Apply(s)) |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
241 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
242 LOG(ERROR) << "Lua: Error in HttpPost() for URL " << url; |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
243 lua_pushstring(state, "ERROR"); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
244 } |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
245 else |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
246 { |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
247 lua_pushstring(state, "SUCCESS"); |
1051 | 248 } |
249 | |
250 return 1; | |
251 } | |
252 | |
253 | |
254 void LuaContext::PushJson(const Json::Value& value) | |
255 { | |
256 if (value.isString()) | |
257 { | |
258 lua_pushstring(lua_, value.asCString()); | |
259 } | |
260 else if (value.isDouble()) | |
261 { | |
262 lua_pushnumber(lua_, value.asDouble()); | |
263 } | |
264 else if (value.isInt()) | |
265 { | |
266 lua_pushinteger(lua_, value.asInt()); | |
267 } | |
268 else if (value.isUInt()) | |
269 { | |
270 lua_pushinteger(lua_, value.asUInt()); | |
271 } | |
272 else if (value.isBool()) | |
273 { | |
274 lua_pushboolean(lua_, value.asBool()); | |
275 } | |
276 else if (value.isNull()) | |
277 { | |
278 lua_pushnil(lua_); | |
279 } | |
280 else if (value.isArray()) | |
281 { | |
282 lua_newtable(lua_); | |
283 | |
284 // http://lua-users.org/wiki/SimpleLuaApiExample | |
285 for (Json::Value::ArrayIndex i = 0; i < value.size(); i++) | |
286 { | |
287 // Push the table index (note the "+1" because of Lua conventions) | |
288 lua_pushnumber(lua_, i + 1); | |
289 | |
290 // Push the value of the cell | |
291 PushJson(value[i]); | |
292 | |
293 // Stores the pair in the table | |
294 lua_rawset(lua_, -3); | |
295 } | |
296 } | |
297 else if (value.isObject()) | |
298 { | |
299 lua_newtable(lua_); | |
300 | |
301 Json::Value::Members members = value.getMemberNames(); | |
302 | |
303 for (Json::Value::Members::const_iterator | |
304 it = members.begin(); it != members.end(); ++it) | |
305 { | |
306 // Push the index of the cell | |
307 lua_pushstring(lua_, it->c_str()); | |
308 | |
309 // Push the value of the cell | |
310 PushJson(value[*it]); | |
311 | |
312 // Stores the pair in the table | |
313 lua_rawset(lua_, -3); | |
314 } | |
315 } | |
316 else | |
317 { | |
318 throw LuaException("Unsupported JSON conversion"); | |
319 } | |
320 } | |
321 | |
386 | 322 |
323 LuaContext::LuaContext() | |
324 { | |
325 lua_ = luaL_newstate(); | |
326 if (!lua_) | |
327 { | |
328 throw LuaException("Unable to create the Lua context"); | |
329 } | |
330 | |
331 luaL_openlibs(lua_); | |
332 lua_register(lua_, "print", PrintToLog); | |
1051 | 333 lua_register(lua_, "HttpGet", CallHttpGet); |
1052
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
334 lua_register(lua_, "HttpPost", CallHttpPost); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
335 lua_register(lua_, "HttpPut", CallHttpPut); |
cc4ff680e2a0
http requests in lua
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1051
diff
changeset
|
336 lua_register(lua_, "HttpDelete", CallHttpDelete); |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
337 |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
338 lua_pushlightuserdata(lua_, this); |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
339 lua_setglobal(lua_, "_LuaContext"); |
386 | 340 } |
341 | |
342 | |
343 LuaContext::~LuaContext() | |
344 { | |
345 lua_close(lua_); | |
346 } | |
347 | |
348 | |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
349 void LuaContext::Execute(std::string* output, |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
350 const std::string& command) |
386 | 351 { |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
352 log_.clear(); |
386 | 353 int error = (luaL_loadbuffer(lua_, command.c_str(), command.size(), "line") || |
354 lua_pcall(lua_, 0, 0, 0)); | |
355 | |
356 if (error) | |
357 { | |
358 assert(lua_gettop(lua_) >= 1); | |
359 | |
360 std::string description(lua_tostring(lua_, -1)); | |
361 lua_pop(lua_, 1); /* pop error message from the stack */ | |
362 throw LuaException(description); | |
363 } | |
418
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
364 |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
365 if (output != NULL) |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
366 { |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
367 *output = log_; |
b79bf2f4ab2e
execution of lua through REST
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
397
diff
changeset
|
368 } |
386 | 369 } |
370 | |
371 | |
372 void LuaContext::Execute(EmbeddedResources::FileResourceId resource) | |
373 { | |
374 std::string command; | |
375 EmbeddedResources::GetFileResource(command, resource); | |
376 Execute(command); | |
377 } | |
397
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
378 |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
379 |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
380 bool LuaContext::IsExistingFunction(const char* name) |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
381 { |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
382 lua_settop(lua_, 0); |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
383 lua_getglobal(lua_, name); |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
384 return lua_type(lua_, -1) == LUA_TFUNCTION; |
941ea46e9e26
lua filter of new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
386
diff
changeset
|
385 } |
386 | 386 } |