aboutsummaryrefslogtreecommitdiff
path: root/src/gns/plugin_rest_gns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gns/plugin_rest_gns.c')
-rw-r--r--src/gns/plugin_rest_gns.c44
1 files changed, 36 insertions, 8 deletions
diff --git a/src/gns/plugin_rest_gns.c b/src/gns/plugin_rest_gns.c
index a3006ce23..6ec921f70 100644
--- a/src/gns/plugin_rest_gns.c
+++ b/src/gns/plugin_rest_gns.c
@@ -81,6 +81,16 @@ struct Plugin
81struct RequestHandle 81struct RequestHandle
82{ 82{
83 /** 83 /**
84 * DLL
85 */
86 struct RequestHandle *next;
87
88 /**
89 * DLL
90 */
91 struct RequestHandle *prev;
92
93 /**
84 * Active GNS lookup 94 * Active GNS lookup
85 */ 95 */
86 struct GNUNET_GNS_LookupWithTldRequest *gns_lookup; 96 struct GNUNET_GNS_LookupWithTldRequest *gns_lookup;
@@ -136,6 +146,15 @@ struct RequestHandle
136 int response_code; 146 int response_code;
137}; 147};
138 148
149/**
150 * DLL
151 */
152static struct RequestHandle *requests_head;
153
154/**
155 * DLL
156 */
157static struct RequestHandle *requests_tail;
139 158
140/** 159/**
141 * Cleanup lookup handle 160 * Cleanup lookup handle
@@ -165,6 +184,9 @@ cleanup_handle (void *cls)
165 if (NULL != handle->emsg) 184 if (NULL != handle->emsg)
166 GNUNET_free (handle->emsg); 185 GNUNET_free (handle->emsg);
167 186
187 GNUNET_CONTAINER_DLL_remove (requests_head,
188 requests_tail,
189 handle);
168 GNUNET_free (handle); 190 GNUNET_free (handle);
169} 191}
170 192
@@ -198,7 +220,7 @@ do_error (void *cls)
198 handle->proc (handle->proc_cls, resp, handle->response_code); 220 handle->proc (handle->proc_cls, resp, handle->response_code);
199 json_decref (json_error); 221 json_decref (json_error);
200 GNUNET_free (response); 222 GNUNET_free (response);
201 GNUNET_SCHEDULER_add_now (&cleanup_handle, handle); 223 cleanup_handle(handle);
202} 224}
203 225
204 226
@@ -374,8 +396,12 @@ rest_process_request (struct GNUNET_REST_RequestHandle *rest_handle,
374 handle->proc_cls = proc_cls; 396 handle->proc_cls = proc_cls;
375 handle->proc = proc; 397 handle->proc = proc;
376 handle->rest_handle = rest_handle; 398 handle->rest_handle = rest_handle;
377
378 handle->url = GNUNET_strdup (rest_handle->url); 399 handle->url = GNUNET_strdup (rest_handle->url);
400 handle->timeout_task =
401 GNUNET_SCHEDULER_add_delayed (handle->timeout, &do_timeout, handle);
402 GNUNET_CONTAINER_DLL_insert (requests_head,
403 requests_tail,
404 handle);
379 if (handle->url[strlen (handle->url) - 1] == '/') 405 if (handle->url[strlen (handle->url) - 1] == '/')
380 handle->url[strlen (handle->url) - 1] = '\0'; 406 handle->url[strlen (handle->url) - 1] = '\0';
381 if (GNUNET_NO == 407 if (GNUNET_NO ==
@@ -386,8 +412,6 @@ rest_process_request (struct GNUNET_REST_RequestHandle *rest_handle,
386 } 412 }
387 413
388 414
389 handle->timeout_task =
390 GNUNET_SCHEDULER_add_delayed (handle->timeout, &do_timeout, handle);
391 return GNUNET_YES; 415 return GNUNET_YES;
392} 416}
393 417
@@ -405,8 +429,6 @@ libgnunet_plugin_rest_gns_init (void *cls)
405 struct GNUNET_REST_Plugin *api; 429 struct GNUNET_REST_Plugin *api;
406 430
407 cfg = cls; 431 cfg = cls;
408 if (NULL != plugin.cfg)
409 return NULL; /* can only initialize once! */
410 memset (&plugin, 0, sizeof(struct Plugin)); 432 memset (&plugin, 0, sizeof(struct Plugin));
411 plugin.cfg = cfg; 433 plugin.cfg = cfg;
412 api = GNUNET_new (struct GNUNET_REST_Plugin); 434 api = GNUNET_new (struct GNUNET_REST_Plugin);
@@ -437,12 +459,18 @@ void *
437libgnunet_plugin_rest_gns_done (void *cls) 459libgnunet_plugin_rest_gns_done (void *cls)
438{ 460{
439 struct GNUNET_REST_Plugin *api = cls; 461 struct GNUNET_REST_Plugin *api = cls;
440 struct Plugin *plugin = api->cls; 462 struct RequestHandle *request;
463 struct Plugin *plugin;
464
465 while (NULL != (request = requests_head))
466 do_error (request);
441 467
442 plugin->cfg = NULL;
443 if (NULL != gns) 468 if (NULL != gns)
444 GNUNET_GNS_disconnect (gns); 469 GNUNET_GNS_disconnect (gns);
445 470
471 plugin = api->cls;
472
473 plugin->cfg = NULL;
446 474
447 GNUNET_free (allow_methods); 475 GNUNET_free (allow_methods);
448 GNUNET_free (api); 476 GNUNET_free (api);