@@ -20,16 +20,10 @@
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** For notes regarding the public JSON interface, please see:
21 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
22 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** https://docs.google.com/document/d/1fXViveNhDbiXgCuE7QDXQOKeFzf2qNUkBEgiUvoqFN4/edit
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Notable FIXMEs:
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** - The overlap between cson_cgi and fossil needs to be gotten rid
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of because cson_cgi cannot get all the environment info it needs
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when fossil is running in server mode. The goal is to remove all
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of the cson_cgi bits.
31 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
32 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
33 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "VERSION.h"
34 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "json.h"
35 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
@@ -156,24 +150,91 @@
156 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char buf[BufSize] = {'F','O','S','S','I','L','-',0};
157 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert((code >= 1000) && (code <= 9999) && "Invalid Fossil/JSON code.");
158 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sprintf(buf+7,"%04d", code);
159 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return buf;
160 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Adds v to the API-internal cleanup mechanism. key must be a unique
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** key for the given element. Adding another item with that key may
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** free the previous one. If freeOnError is true then v is passed to
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cson_value_free() if the key cannot be inserted, otherweise
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ownership of v is not changed on error.
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns 0 on success.
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *** On success, ownership of v is transfered to (or shared with)
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *** g.json.gc, and v will be valid until that object is cleaned up or
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *** its key is replaced via another call to this function.
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int json_gc_add( char const * key, cson_value * v, char freeOnError ){
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int const rc = cson_object_set( g.json.gc.o, key, v );
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( NULL != g.json.gc.o );
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (0 != rc) && freeOnError ){
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value_free( v );
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
161 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
162 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
163 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returns the value of json_rc_cstr(code) as a new JSON
164 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** string, which is owned by the caller and must eventually
165 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be cson_value_free()d or transfered to a JSON container.
166 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
167 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * json_rc_string( int code ){
168 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return cson_value_new_string( json_rc_cstr(code), 11 );
169 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Gets a POST/GET/COOKIE value. The returned memory is owned by the
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** g.json object (one of its sub-objects). Returns NULL if no match is
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** found.
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Precedence: GET, COOKIE, POST. COOKIE _should_ be last
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** but currently is not for internal order-of-init reasons.
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Since fossil only uses one cookie, this is not a high-prio
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** problem.
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value * json_getenv( char const * zKey ){
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value * rc;
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = cson_object_get( g.json.param.o, zKey );
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = cson_object_get( g.json.post.o, zKey );
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(rc){
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * cv = PD(zKey,NULL);
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(cv){/*transform it to JSON for later use.*/
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = cson_value_new_string(cv,strlen(cv));
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_object_set( g.json.param.o, zKey, rc );
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return NULL;
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Adds v to g.json.param.o using the given key. May cause
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any prior item with that key to be destroyed (depends on
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current reference count for that value).
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On succes, transfers ownership of v to g.json.param.o.
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On error ownership of v is not modified.
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int json_setenv( char const * zKey, cson_value * v ){
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return cson_object_set( g.json.param.o, zKey, v );
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
170 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
171 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
172 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returns the current request's JSON authentication token, or NULL if
173 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** none is found. The token's memory is owned by (or shared with)
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** g.json.cgiCx.
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** g.json.
175 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
176 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If an auth token is found in the GET/POST JSON request data then
177 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fossil is given that data for use in authentication for this
178 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** session.
179 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -186,52 +247,72 @@
186 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
187 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static cson_value * json_auth_token(){
188 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.json.authToken ){
189 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Try to get an authorization token from GET parameter, POSTed
190 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
JSON, or fossil cookie (in that order). */
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.json.authToken = cson_cgi_getenv(&g.json.cgiCx, "gp", FossilJsonKeys.authToken)
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* reminder to self: cson_cgi does not have access to the cookies
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- because fossil's core consumes them. Thus we cannot use "agpc"
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- here. We use "a" (App-specific) as a place to store fossil's
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cookie value. Reminder #2: in server mode cson_cgi also doesn't
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- have access to the GET parameters because of how the QUERY_STRING
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is set. That's on my to-fix list for cson_cgi (feeding it our own
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- query string).
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */;
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(g.json.authToken && cson_value_is_string(g.json.authToken)){
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.authToken = json_getenv(FossilJsonKeys.authToken);
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(g.json.authToken
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && cson_value_is_string(g.json.authToken)
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !PD(login_cookie_name(),NULL)){
201 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* tell fossil to use this login info.
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FIXME: because the JSON bits don't carry around
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- login_cookie_name(), there is a potential login hijacking
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- window here. We may need to change the JSON auth token to be
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in the form: login_cookie_name()=...
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Then again, the hardened cookie value helps ensure that
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- only a proper key/value match is valid.
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FIXME?: because the JSON bits don't carry around
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login_cookie_name(), there is a potential login hijacking
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window here. We may need to change the JSON auth token to be
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in the form: login_cookie_name()=...
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Then again, the hardened cookie value helps ensure that
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ only a proper key/value match is valid.
210 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
211 266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_replace_parameter( login_cookie_name(), cson_value_get_cstr(g.json.authToken) );
212 267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( g.isCGI ){
213 268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* try fossil's conventional cookie. */
214 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Reminder: chicken/egg scenario regarding db access in CLI
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mode because login_cookie_name() needs the db. */
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mode because login_cookie_name() needs the db. CLI
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mode does not use any authentication, so we don't need
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to support it here.
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
216 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * zCookie = P(login_cookie_name());
217 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zCookie && *zCookie ){
218 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Transfer fossil's cookie to JSON for downstream convenience... */
219 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * v = cson_value_new_string(zCookie, strlen(zCookie));
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( 0 == cson_cgi_gc_add( &g.json.cgiCx, FossilJsonKeys.authToken, v, 1 ) ){
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.json.authToken = v;
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ json_setenv( FossilJsonKeys.authToken, v );
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.authToken = v;
223 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
224 281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
225 282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
226 283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return g.json.authToken;
227 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
228 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
229 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Performs some common initialization of JSON-related state.
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Initializes some JSON bits which need to be initialized relatively
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** early on. It should only be called from cgi_init() or
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** json_cmd_top() (early on in those functions).
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Initializes g.json.gc and g.json.param.
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void json_main_bootstrap(){
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value * v;
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (NULL == g.json.gc.v) && "cgi_json_bootstrap() was called twice!" );
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ v = cson_value_new_object();
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.gc.v = v;
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.gc.o = cson_value_get_object(v);
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ v = cson_value_new_object();
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.param.v = v;
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.param.o = cson_value_get_object(v);
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ json_gc_add("$PARAMS", v, 1);
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Performs some common initialization of JSON-related state. Must be
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** called by the json_page_top() and json_cmd_top() dispatching
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** functions to set up the JSON stat used by the dispatched functions.
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
231 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Implicitly sets up the login information state in CGI mode, but
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** does not perform any authentication here. It _might_ (haven't
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** does not perform any permissions checking. It _might_ (haven't
233 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** tested this) die with an error if an auth cookie is malformed.
234 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
235 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This must be called by the top-level JSON command dispatching code
236 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** before they do any work.
237 318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -238,101 +319,93 @@
238 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This must only be called once, or an assertion may be triggered.
239 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
240 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void json_mode_bootstrap(){
241 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char once = 0 /* guard against multiple runs */;
242 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * zPath = P("PATH_INFO");
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_value * pathSplit =
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_cgi_getenv(&g.json.cgiCx,"e","PATH_INFO_SPLIT");
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value * pathSplit = NULL;
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array * ar = NULL;
245 326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (0==once) && "json_mode_bootstrap() called too many times!");
246 327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( once ){
247 328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
248 329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
249 330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
once = 1;
250 331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
251 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.isJsonMode = 1;
252 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.resultCode = 0;
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.json.cmdOffset = -1;
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.cmd.offset = -1;
254 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.isCGI && g.fullHttpReply ){
255 336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* workaround for server mode, so we see it as CGI mode. */
256 337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.isCGI = 1;
257 338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
258 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(NDEBUG)
259 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* avoids debug messages on stderr in JSON mode */
260 341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_config(SQLITE_CONFIG_LOG, NULL, 0);
261 342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
262 343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.cmd.v = cson_value_new_array();
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ar = g.json.cmd.a = cson_value_get_array(g.json.cmd.v);
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ json_gc_add( FossilJsonKeys.commandPath, g.json.cmd.v, 1 );
263 347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
264 348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
The following if/else block translates the PATH_INFO path (in
265 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CLI/server modes) or g.argv (CLI mode) into an internal list so
266 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that we can simplify command dispatching later on.
267 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
268 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Note that translating g.argv this way is overkill but allows us to
269 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
avoid CLI-only special-case handling in other code, e.g.
270 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_command_arg().
271 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pathSplit ){
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* cson_cgi already did this, so let's just re-use it. This does
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- not happen in "plain server" mode, but does in CGI mode.
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( g.isCGI && "g.isCGI should have been set by now." );
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_cgi_setenv( &g.json.cgiCx,
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FossilJsonKeys.commandPath,
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pathSplit );
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{ /* either CLI or server mode... */
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_value * arV /* value to store path in */;
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array * ar /* the "real" array object */;
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- arV = cson_value_new_array();
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ar = cson_value_get_array(arV);
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_cgi_setenv( &g.json.cgiCx,
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FossilJsonKeys.commandPath,
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- arV );
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zPath ){
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Translate fossil's PATH_INFO into cson_cgi for later
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- convenience, to help consolidate how we handle CGI/server
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- modes. This block is hit when running in plain server mode.
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char const * p = zPath /* current byte */;
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char const * head = p /* current start-of-token */;
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned int len = 0 /* current token's lengh */;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( g.isCGI && "g.isCGI should have been set by now." );
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for( ;*p!='?'; ++p){
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !*p || ('/' == *p) ){
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( len ){
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_value * part;
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( head != p );
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- part = cson_value_new_string(head, len);
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array_append( ar, part );
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- len = 0;
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !*p ){
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- head = p+1;
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ++len;
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* assume CLI mode */
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char const * arg;
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_value * part;
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( (!g.isCGI) && "g.isCGI set and we do not expect that to be the case here." );
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i = 1/*skip argv[0]*/; i < g.argc; ++i ){
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- arg = g.argv[i];
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !arg || !*arg ){
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- part = cson_value_new_string(arg,strlen(arg));
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array_append(ar, part);
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zPath ){/* either CLI or server mode... */
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Translate fossil's PATH_INFO into cson_cgi for later
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ convenience, to help consolidate how we handle CGI/server
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ modes. This block is hit when running in plain server mode.
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * p = zPath /* current byte */;
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * head = p /* current start-of-token */;
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsigned int len = 0 /* current token's lengh */;
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( g.isCGI && "g.isCGI should have been set by now." );
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( ;*p!='?'; ++p){
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !*p || ('/' == *p) ){
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( len ){
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value * part;
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char * zPart;
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( head != p );
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPart = (char*)malloc(len+1);
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( zPart != NULL );
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(zPart, head, len);
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPart[len] = 0;
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dehttpize(zPart);
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ part = cson_value_new_string(zPart, strlen(zPart));
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zPart);
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array_append( ar, part );
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ len = 0;
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !*p ){
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ head = p+1;
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue;
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ++len;
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{/* assume CLI mode */
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * arg;
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value * part;
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i = 1/*skip argv[0]*/; i < g.argc; ++i ){
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ arg = g.argv[i];
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !arg || !*arg ){
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue;
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ part = cson_value_new_string(arg,strlen(arg));
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array_append(ar, part);
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
330 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* g.json.reqPayload exists only to simplify some of our access to
331 404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the request payload. We currently only use this in the context of
332 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Object payloads, not Arrays, strings, etc. */
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.json.reqPayload.v = cson_cgi_getenv( &g.json.cgiCx, "p", "payload" );
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.reqPayload.v = cson_object_get( g.json.post.o, "payload" );
334 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.json.reqPayload.v ){
335 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.reqPayload.o = cson_value_get_object( g.json.reqPayload.v )
336 409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* g.json.reqPayload.o may legally be NULL, which means only that
337 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.reqPayload.v is-not-a Object.
338 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/;
@@ -359,46 +432,43 @@
359 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** abbreviated name because we rely on the full name "json" here. The
360 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** g object probably has the short form which we can use for our
361 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** purposes, but i haven't yet looked for it.
362 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
363 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char const * json_command_arg(unsigned char ndx){
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array * ar = cson_value_get_array(
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_cgi_getenv(&g.json.cgiCx,
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "a",
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FossilJsonKeys.commandPath));
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array * ar = g.json.cmd.a;
368 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert((NULL!=ar) && "Internal error. Was json_mode_bootstrap() called?");
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.json.cmdOffset < 0 ){
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.json.cmd.offset < 0 ){
370 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* first-time setup. */
371 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
short i = 0;
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define NEXT cson_string_cstr( \
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_value_get_string( \
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_array_get(ar,i) \
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define NEXT cson_string_cstr( \
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_value_get_string( \
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_array_get(ar,i) \
375 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
))
376 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * tok = NEXT;
377 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( tok ){
378 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( 0==strncmp("json",tok,4) ){
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.json.cmdOffset = i;
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.cmd.offset = i;
380 450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
381 451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
382 452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
++i;
383 453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tok = NEXT;
384 454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
385 455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
386 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#undef NEXT
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.json.cmdOffset < 0 ){
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(g.json.cmd.offset < 0){
388 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return NULL;
389 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ndx = g.json.cmdOffset + ndx;
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return cson_string_cstr(cson_value_get_string(cson_array_get( ar, g.json.cmdOffset + ndx )));
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ndx = g.json.cmd.offset + ndx;
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return cson_string_cstr(cson_value_get_string(cson_array_get( ar, g.json.cmd.offset + ndx )));
392 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
393 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
394 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
395 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
396 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If g.json.reqPayload.o is NULL then NULL is returned, else the
397 467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** given property is searched for in the request payload. If found it
398 468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is returned. The returned value is owned by (or shares ownership
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** with) g.json.cgiCx, and must NOT be cson_value_free()'d by the
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with) g.json, and must NOT be cson_value_free()'d by the
400 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** caller.
401 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
402 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static cson_value * json_payload_property( char const * key ){
403 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return g.json.reqPayload.o ?
404 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_object_get( g.json.reqPayload.o, key )
@@ -426,12 +496,14 @@
426 496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Alternately, we can create different JsonPageDef arrays for each
427 497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** subset.
428 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
429 499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * name;
430 500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Returns a payload object for the response.
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If it returns a non-NULL value, the caller owns it.
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns a payload object for the response. If it returns a
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** non-NULL value, the caller owns it. To trigger an error this
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function should set g.json.resultCode to a value from the
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FossilJsonCodes enum.
433 505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
434 506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * (*func)();
435 507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
436 508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Which mode(s) of execution does func() support:
437 509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -486,10 +558,11 @@
486 558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if 0
487 559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static unsigned int json_timestamp(){
488 560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
489 561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
490 562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
491 564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
492 565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
493 566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Creates a new Fossil/JSON response envelope skeleton. It is owned
494 567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by the caller, who must eventually free it using cson_value_free(),
495 568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or add it to a cson container to transfer ownership. Returns NULL
@@ -568,11 +641,11 @@
568 641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
569 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pMsg && *pMsg ){
570 643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tmp = cson_value_new_string(pMsg,strlen(pMsg));
571 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SET("resultText");
572 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- tmp = cson_cgi_getenv(&g.json.cgiCx, "gp", "requestId");
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tmp = json_getenv("requestId");
574 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( tmp ) cson_object_set( o, "requestId", tmp );
575 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( NULL != payload ){
576 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( resultCode ){
577 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value_free(payload);
578 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
payload = NULL;
@@ -582,16 +655,12 @@
582 655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
583 656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
584 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#undef SET
585 658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
586 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(0){/*Only for debuggering, add some info to the response.*/
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- tmp = cson_cgi_env_get_val(&g.json.cgiCx,'a', 0);
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(tmp){
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_object_set( o, "$APP", tmp );
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- tmp = cson_value_new_integer( g.json.cmdOffset );
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cson_object_set( o, "cmdOffset", tmp );
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tmp = cson_value_new_integer( g.json.cmd.offset );
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cson_object_set( o, "cmd.offset", tmp );
593 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_object_set( o, "isCGI", cson_value_new_bool( g.isCGI ) );
594 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
595 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
596 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto ok;
597 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cleanup:
@@ -665,25 +734,20 @@
665 734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_object_set( jobj, "resultCodeParanoiaLevel",
666 735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value_new_integer(g.json.errorDetailParanoia) );
667 736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return jval;
668 737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
669 738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if 0
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* we have a disconnect here between fossil's server-mode QUERY_STRING
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- handling and cson_cgi's.
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static cson_value * json_getenv( char const *zWhichEnv, char const * zKey ){
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return cson_cgi_getenv(&g.json.cgiCx, zWhichEnv, zKey);
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static char const * json_getenv_cstr( char const *zWhichEnv, char const * zKey ){
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char const * rc = cson_value_get_cstr( json_getenv(zWhichEnv, zKey) );
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !rc && zWhichEnv && (NULL!=strstr(zWhichEnv,"g")) ){
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = PD(zKey,NULL);
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns the string form of a json_getenv() value, but ONLY
741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If that value is-a String. Non-strings are not converted
742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to strings for this purpose. Returned memory is owned by
743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** g.json or fossil..
744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static char const * json_getenv_cstr( char const * zKey ){
746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return cson_value_get_cstr( json_getenv(zKey) );
747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
685 749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
686 750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
687 751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Implementation for /json/cap
688 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
689 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Returned object contains details about the "capabilities" of the
@@ -853,13 +917,11 @@
853 917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
854 918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!token){
855 919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.json.resultCode = FSL_JSON_E_MISSING_AUTH;
856 920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
857 921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_clear_login_data();
858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.json.authToken = NULL /* memory is owned by g.json.cgiCx, but
859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- now lives only in the cson_cgi garbage
860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- collector.*/;
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.json.authToken = NULL /* memory is owned elsewhere.*/;
861 923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
862 924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return NULL;
863 925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
864 926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
865 927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -1006,11 +1068,10 @@
1006 1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob buf = empty_blob;
1007 1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * cmd;
1008 1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * payload = NULL;
1009 1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * root = NULL;
1010 1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
JsonPageDef const * pageDef = NULL;
1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cgi_set_content_type( cson_cgi_guess_content_type(&g.json.cgiCx) );
1012 1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_mode_bootstrap();
1013 1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmd = json_command_arg(1);
1014 1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*cgi_printf("{\"cmd\":\"%s\"}\n",cmd); return;*/
1015 1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageDef = json_handler_for_name(cmd,&JsonPageDefs[0]);
1016 1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( ! pageDef ){
@@ -1055,20 +1116,20 @@
1055 1116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void json_cmd_top(void){
1056 1117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const * cmd = NULL;
1057 1118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 1002;
1058 1119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cson_value * payload = NULL;
1059 1120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
JsonPageDef const * pageDef;
1121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ json_main_bootstrap();
1060 1122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_mode_bootstrap();
1061 1123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc<3 ){
1062 1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto usage;
1063 1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1064 1126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(0, 0);
1065 1127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cmd = json_command_arg(1);
1066 1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !cmd || !*cmd ){
1067 1129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto usage;
1068 1130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cgi_set_content_type( cson_cgi_guess_content_type(&g.json.cgiCx) );
1070 1131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageDef = json_handler_for_name(cmd,&JsonPageDefs[0]);
1071 1132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( ! pageDef ){
1072 1133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
json_err( FSL_JSON_E_UNKNOWN_COMMAND, NULL, 1 );
1073 1134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
1074 1135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pageDef->runMode > 0 /*HTTP only*/){
1075 1136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!