2 This file is part of GNUnet.
3 Copyright (C) 2012-2018 GNUnet e.V.
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.
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.
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/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
21 * @author Martin Schanzenbach
22 * @file gns/plugin_rest_copying.c
23 * @brief REST plugin that serves licensing information.
28 #include "gnunet_rest_plugin.h"
29 #include <gnunet_rest_lib.h>
31 #define GNUNET_REST_API_NS_COPYING "/copying"
33 #define GNUNET_REST_COPYING_TEXT "GNU Affero General Public License version 3 or later. See also: <http://www.gnu.org/licenses/>"
36 * @brief struct returned by the initialization function of the plugin
39 const struct GNUNET_CONFIGURATION_Handle *cfg;
42 const struct GNUNET_CONFIGURATION_Handle *cfg;
44 struct RequestHandle {
46 * Handle to rest request
48 struct GNUNET_REST_RequestHandle *rest_handle;
51 * The plugin result processor
53 GNUNET_REST_ResultProcessor proc;
56 * The closure of the result processor
68 * Cleanup request handle.
70 * @param handle Handle to clean up
73 cleanup_handle(struct RequestHandle *handle)
75 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
82 * Task run on shutdown. Cleans up everything.
85 * @param tc scheduler context
90 struct RequestHandle *handle = cls;
91 struct MHD_Response *resp;
93 resp = GNUNET_REST_create_response(NULL);
94 handle->proc(handle->proc_cls, resp, handle->response_code);
95 cleanup_handle(handle);
100 * Handle rest request
102 * @param handle the lookup handle
105 get_cont(struct GNUNET_REST_RequestHandle *con_handle,
109 struct MHD_Response *resp;
110 struct RequestHandle *handle = cls;
112 resp = GNUNET_REST_create_response(GNUNET_REST_COPYING_TEXT);
113 handle->proc(handle->proc_cls,
116 cleanup_handle(handle);
122 * Handle rest request
124 * @param handle the lookup handle
127 options_cont(struct GNUNET_REST_RequestHandle *con_handle,
131 struct MHD_Response *resp;
132 struct RequestHandle *handle = cls;
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,
141 cleanup_handle(handle);
146 * Function processing the REST call
148 * @param method HTTP method
149 * @param url URL of the HTTP request
150 * @param data body of the HTTP request (optional)
151 * @param data_size length of the body
152 * @param proc callback function for the result
153 * @param proc_cls closure for @a proc
154 * @return #GNUNET_OK if request accepted
157 rest_copying_process_request(struct GNUNET_REST_RequestHandle *conndata_handle,
158 GNUNET_REST_ResultProcessor proc,
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 },
164 GNUNET_REST_HANDLER_END
166 struct RequestHandle *handle = GNUNET_new(struct RequestHandle);
167 struct GNUNET_REST_RequestHandlerError err;
169 handle->proc_cls = proc_cls;
171 handle->rest_handle = conndata_handle;
173 if (GNUNET_NO == GNUNET_REST_handle_request(conndata_handle,
178 handle->response_code = err.error_code;
179 GNUNET_SCHEDULER_add_now(&do_error, handle);
185 * Entry point for the plugin.
187 * @param cls the "struct GNUNET_NAMESTORE_PluginEnvironment*"
188 * @return NULL on error, otherwise the plugin context
191 libgnunet_plugin_rest_copying_init(void *cls)
193 static struct Plugin plugin;
196 struct GNUNET_REST_Plugin *api;
198 if (NULL != plugin.cfg)
199 return NULL; /* can only initialize once! */
200 memset(&plugin, 0, sizeof(struct Plugin));
202 api = GNUNET_new(struct GNUNET_REST_Plugin);
204 api->name = GNUNET_REST_API_NS_COPYING;
205 api->process_request = &rest_copying_process_request;
206 GNUNET_log(GNUNET_ERROR_TYPE_INFO,
207 _("COPYING REST API initialized\n"));
213 * Exit point from the plugin.
215 * @param cls the plugin context (as returned by "init")
216 * @return always NULL
219 libgnunet_plugin_rest_copying_done(void *cls)
221 struct GNUNET_REST_Plugin *api = cls;
222 struct Plugin *plugin = api->cls;
226 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
227 "COPYING REST plugin is finished\n");
231 /* end of plugin_rest_copying.c */