mirror of
https://github.com/emqx/neuron.git
synced 2026-10-17 04:40:42 +08:00
121 lines
5.6 KiB
C
121 lines
5.6 KiB
C
/**
|
|
* NEURON IIoT System for Industry 4.0
|
|
* Copyright (C) 2020-2022 EMQ Technologies Co., Ltd All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
#ifndef _NEU_PLUGIN_REST_HANDLE_H_
|
|
#define _NEU_PLUGIN_REST_HANDLE_H_
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <nng/nng.h>
|
|
#include <nng/supplemental/http/http.h>
|
|
|
|
#include "plugin.h"
|
|
#include "utils/neu_jwt.h"
|
|
#include "json/neu_json_error.h"
|
|
|
|
#define REST_PROCESS_HTTP_REQUEST(aio, req_type, decode_fun, func) \
|
|
{ \
|
|
char * req_data = NULL; \
|
|
size_t req_data_size = 0; \
|
|
req_type *req = NULL; \
|
|
\
|
|
if (http_get_body((aio), (void **) &req_data, &req_data_size) == 0 && \
|
|
decode_fun(req_data, &req) == 0) { \
|
|
{ func }; \
|
|
decode_fun##_free(req); \
|
|
} else { \
|
|
http_bad_request(aio, "{\"error\": 1002}"); \
|
|
} \
|
|
free(req_data); \
|
|
}
|
|
|
|
#define REST_PROCESS_HTTP_REQUEST_VALIDATE_JWT(aio, req_type, decode_fun, \
|
|
func) \
|
|
{ \
|
|
if (!disable_jwt) { \
|
|
char *jwt = \
|
|
(char *) http_get_header(aio, (char *) "Authorization"); \
|
|
\
|
|
NEU_JSON_RESPONSE_ERROR(neu_jwt_validate(jwt), { \
|
|
if (error_code.error != NEU_ERR_SUCCESS) { \
|
|
http_response(aio, error_code.error, result_error); \
|
|
free(result_error); \
|
|
return; \
|
|
} \
|
|
}) \
|
|
} \
|
|
REST_PROCESS_HTTP_REQUEST(aio, req_type, decode_fun, func); \
|
|
}
|
|
|
|
#define VALIDATE_JWT(aio) \
|
|
{ \
|
|
if (!disable_jwt) { \
|
|
char *jwt = \
|
|
(char *) http_get_header(aio, (char *) "Authorization"); \
|
|
\
|
|
NEU_JSON_RESPONSE_ERROR(neu_jwt_validate(jwt), { \
|
|
if (error_code.error != NEU_ERR_SUCCESS) { \
|
|
http_response(aio, error_code.error, result_error); \
|
|
free(result_error); \
|
|
return; \
|
|
} \
|
|
}); \
|
|
} \
|
|
}
|
|
|
|
enum neu_rest_method {
|
|
NEU_REST_METHOD_UNDEFINE = 0x0,
|
|
NEU_REST_METHOD_GET,
|
|
NEU_REST_METHOD_POST,
|
|
NEU_REST_METHOD_PUT,
|
|
NEU_REST_METHOD_DELETE,
|
|
NEU_REST_METHOD_OPTIONS
|
|
};
|
|
enum neu_rest_handler_type {
|
|
NEU_REST_HANDLER_FUNCTION = 0x0,
|
|
NEU_REST_HANDLER_DIRECTORY,
|
|
NEU_REST_HANDLER_PROXY,
|
|
NEU_REST_HANDLER_REDIRECT,
|
|
};
|
|
|
|
struct neu_rest_handler {
|
|
enum neu_rest_method method;
|
|
char * url;
|
|
enum neu_rest_handler_type type;
|
|
union neu_rest_handler_value {
|
|
void *handler;
|
|
char *path;
|
|
char *dst_url;
|
|
} value;
|
|
};
|
|
|
|
typedef struct neu_rest_handle_ctx neu_rest_handle_ctx_t;
|
|
|
|
neu_rest_handle_ctx_t *neu_rest_init_ctx(void *plugin);
|
|
void neu_rest_free_ctx(neu_rest_handle_ctx_t *ctx);
|
|
void * neu_rest_get_plugin();
|
|
|
|
int neu_rest_add_handler(nng_http_server * server,
|
|
const struct neu_rest_handler *rest_handler);
|
|
void neu_rest_handler(const struct neu_rest_handler **handlers, uint32_t *size);
|
|
void neu_rest_api_cors_handler(const struct neu_rest_handler **handlers,
|
|
uint32_t * size);
|
|
void neu_rest_handle_cors(nng_aio *aio);
|
|
#endif
|