GNUnet  0.10.x
plugin_rest_copying.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2012-2018 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
27 #include "platform.h"
28 #include "gnunet_rest_plugin.h"
29 #include <gnunet_rest_lib.h>
30 
31 #define GNUNET_REST_API_NS_COPYING "/copying"
32 
33 #define GNUNET_REST_COPYING_TEXT "GNU Affero General Public License version 3 or later. See also: <http://www.gnu.org/licenses/>"
34 
38 struct Plugin {
39  const struct GNUNET_CONFIGURATION_Handle *cfg;
40 };
41 
43 
44 struct RequestHandle {
48  struct GNUNET_REST_RequestHandle *rest_handle;
49 
54 
58  void *proc_cls;
59 
63  int response_code;
64 };
65 
66 
72 static void
74 {
76  "Cleaning up\n");
77  GNUNET_free(handle);
78 }
79 
80 
87 static void
88 do_error(void *cls)
89 {
90  struct RequestHandle *handle = cls;
91  struct MHD_Response *resp;
92 
93  resp = GNUNET_REST_create_response(NULL);
94  handle->proc(handle->proc_cls, resp, handle->response_code);
95  cleanup_handle(handle);
96 }
97 
98 
104 static void
106  const char* url,
107  void *cls)
108 {
109  struct MHD_Response *resp;
110  struct RequestHandle *handle = cls;
111 
113  handle->proc(handle->proc_cls,
114  resp,
115  MHD_HTTP_OK);
116  cleanup_handle(handle);
117 }
118 
119 
120 
126 static void
128  const char* url,
129  void *cls)
130 {
131  struct MHD_Response *resp;
132  struct RequestHandle *handle = cls;
133 
134  resp = GNUNET_REST_create_response(NULL);
135  MHD_add_response_header(resp,
136  "Access-Control-Allow-Methods",
137  MHD_HTTP_METHOD_GET);
138  handle->proc(handle->proc_cls,
139  resp,
140  MHD_HTTP_OK);
141  cleanup_handle(handle);
142 }
143 
144 
156 static void
159  void *proc_cls)
160 {
161  static const struct GNUNET_REST_RequestHandler handlers[] = {
162  { MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_COPYING, &get_cont },
163  { MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_COPYING, &options_cont },
165  };
166  struct RequestHandle *handle = GNUNET_new(struct RequestHandle);
168 
169  handle->proc_cls = proc_cls;
170  handle->proc = proc;
171  handle->rest_handle = conndata_handle;
172 
173  if (GNUNET_NO == GNUNET_REST_handle_request(conndata_handle,
174  handlers,
175  &err,
176  handle))
177  {
178  handle->response_code = err.error_code;
180  }
181 }
182 
183 
190 void *
192 {
193  static struct Plugin plugin;
194 
195  cfg = cls;
196  struct GNUNET_REST_Plugin *api;
197 
198  if (NULL != plugin.cfg)
199  return NULL; /* can only initialize once! */
200  memset(&plugin, 0, sizeof(struct Plugin));
201  plugin.cfg = cfg;
202  api = GNUNET_new(struct GNUNET_REST_Plugin);
203  api->cls = &plugin;
207  _("COPYING REST API initialized\n"));
208  return api;
209 }
210 
211 
218 void *
220 {
221  struct GNUNET_REST_Plugin *api = cls;
222  struct Plugin *plugin = api->cls;
223 
224  plugin->cfg = NULL;
225  GNUNET_free(api);
227  "COPYING REST plugin is finished\n");
228  return NULL;
229 }
230 
231 /* end of plugin_rest_copying.c */
void(* GNUNET_REST_ResultProcessor)(void *cls, struct MHD_Response *resp, int status)
Iterator called on obtained result for a REST result.
static void cleanup_handle(struct RequestHandle *handle)
Cleanup request handle.
#define GNUNET_REST_API_NS_COPYING
void * cls
The closure of the plugin.
GNUNET_REST_ResultProcessor proc
The plugin result processor.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
struct returned by the initialization function of the plugin
#define GNUNET_NO
Definition: gnunet_common.h:78
static void do_error(void *cls)
Task run on shutdown.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void(* process_request)(struct GNUNET_REST_RequestHandle *handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function to process a REST call.
void * proc_cls
The closure of the result processor.
#define GNUNET_REST_HANDLER_END
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:46
The request handle.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static void rest_copying_process_request(struct GNUNET_REST_RequestHandle *conndata_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function processing the REST call.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
#define GNUNET_REST_COPYING_TEXT
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1264
char * name
Plugin name.
static void get_cont(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle rest request.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
void * libgnunet_plugin_rest_copying_done(void *cls)
Exit point from the plugin.
int GNUNET_REST_handle_request(struct GNUNET_REST_RequestHandle *conn, const struct GNUNET_REST_RequestHandler *handlers, struct GNUNET_REST_RequestHandlerError *err, void *cls)
Definition: rest.c:75
struct GNUNET_REST_RequestHandle * rest_handle
Handle to rest request.
int response_code
HTTP response code.
configuration data
Definition: configuration.c:83
Handle for a plugin.
Definition: block.c:37
void * libgnunet_plugin_rest_copying_init(void *cls)
Entry point for the plugin.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:56
#define GNUNET_log(kind,...)
static void options_cont(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle rest request.
#define GNUNET_free(ptr)
Wrapper around free.
char * url
The url.