libimcv: Moved REST API from imv_swid and imv_swima to libimcv
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* 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 General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifdef USE_JSON
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
|
||||
#include "rest.h"
|
||||
|
||||
typedef struct private_rest_t private_rest_t;
|
||||
|
||||
/**
|
||||
* Private data of an rest_t object.
|
||||
*/
|
||||
struct private_rest_t {
|
||||
|
||||
/**
|
||||
* Public members of rest_t
|
||||
*/
|
||||
rest_t public;
|
||||
|
||||
/**
|
||||
* URI of REST API
|
||||
*/
|
||||
char *uri;
|
||||
|
||||
/**
|
||||
* Timeout of REST API connection
|
||||
*/
|
||||
u_int timeout;
|
||||
|
||||
};
|
||||
|
||||
METHOD(rest_t, get, status_t,
|
||||
private_rest_t *this, char *command, json_object **jresponse)
|
||||
{
|
||||
struct json_tokener *tokener;
|
||||
chunk_t response = chunk_empty;
|
||||
status_t status;
|
||||
char *uri;
|
||||
|
||||
if (asprintf(&uri, "%s%s",this->uri, command) < 0)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
status = lib->fetcher->fetch(lib->fetcher, uri, &response,
|
||||
FETCH_TIMEOUT, this->timeout,
|
||||
FETCH_END);
|
||||
free(uri);
|
||||
|
||||
if (status == SUCCESS && jresponse)
|
||||
{
|
||||
/* Parse HTTP response into a JSON object */
|
||||
tokener = json_tokener_new();
|
||||
*jresponse = json_tokener_parse_ex(tokener, response.ptr, response.len);
|
||||
json_tokener_free(tokener);
|
||||
}
|
||||
free(response.ptr);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
#define HTTP_STATUS_CODE_NOT_FOUND 404
|
||||
#define HTTP_STATUS_CODE_PRECONDITION_FAILED 412
|
||||
|
||||
METHOD(rest_t, post, status_t,
|
||||
private_rest_t *this, char *command, json_object *jrequest,
|
||||
json_object **jresponse)
|
||||
{
|
||||
struct json_tokener *tokener;
|
||||
chunk_t data, response = chunk_empty;
|
||||
status_t status;
|
||||
char *uri;
|
||||
int code;
|
||||
|
||||
if (asprintf(&uri, "%s%s",this->uri, command) < 0)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
data = chunk_from_str((char*)json_object_to_json_string(jrequest));
|
||||
|
||||
status = lib->fetcher->fetch(lib->fetcher, uri, &response,
|
||||
FETCH_TIMEOUT, this->timeout,
|
||||
FETCH_REQUEST_DATA, data,
|
||||
FETCH_REQUEST_TYPE, "application/json; charset=utf-8",
|
||||
FETCH_REQUEST_HEADER, "Accept: application/json",
|
||||
FETCH_REQUEST_HEADER, "Expect:",
|
||||
FETCH_RESPONSE_CODE, &code,
|
||||
FETCH_END);
|
||||
free(uri);
|
||||
|
||||
if (status != SUCCESS)
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case HTTP_STATUS_CODE_NOT_FOUND:
|
||||
status = NOT_FOUND;
|
||||
break;
|
||||
case HTTP_STATUS_CODE_PRECONDITION_FAILED:
|
||||
if (!response.ptr)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
if (jresponse)
|
||||
{
|
||||
/* Parse HTTP response into a JSON object */
|
||||
tokener = json_tokener_new();
|
||||
*jresponse = json_tokener_parse_ex(tokener, response.ptr,
|
||||
response.len);
|
||||
json_tokener_free(tokener);
|
||||
}
|
||||
status = NEED_MORE;
|
||||
break;
|
||||
default:
|
||||
DBG2(DBG_IMV, "REST http request failed with status code: %d",
|
||||
code);
|
||||
status = FAILED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(response.ptr);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
METHOD(rest_t, destroy, void,
|
||||
private_rest_t *this)
|
||||
{
|
||||
free(this->uri);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Described in header.
|
||||
*/
|
||||
rest_t *rest_create(char *uri, u_int timeout)
|
||||
{
|
||||
private_rest_t *this;
|
||||
|
||||
INIT(this,
|
||||
.public = {
|
||||
.get = _get,
|
||||
.post = _post,
|
||||
.destroy = _destroy,
|
||||
},
|
||||
.uri = strdup(uri),
|
||||
.timeout = timeout,
|
||||
);
|
||||
|
||||
return &this->public;
|
||||
}
|
||||
|
||||
#endif /* USE_JSON */
|
||||
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Andreas Steffen
|
||||
* HSR Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* 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 General Public License
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup imv_swima imv_swima
|
||||
* @ingroup libimcv_plugins
|
||||
*
|
||||
* @defgroup rest_t rest
|
||||
* @{ @ingroup imv_swima
|
||||
*/
|
||||
|
||||
#ifndef REST_H_
|
||||
#define REST_H_
|
||||
|
||||
#ifdef USE_JSON
|
||||
|
||||
#include <library.h>
|
||||
#include <json.h>
|
||||
|
||||
typedef struct rest_t rest_t;
|
||||
|
||||
/**
|
||||
* Public REST interface
|
||||
*/
|
||||
struct rest_t {
|
||||
|
||||
/**
|
||||
* Send an HTTP GET request returning a JSON object
|
||||
*
|
||||
* @param jresp JSON object in HTTP
|
||||
* @return Status (SUCCESS or FAILED)
|
||||
*/
|
||||
status_t (*get)(rest_t *this, char *command, json_object **jresp);
|
||||
|
||||
/**
|
||||
* Send an HTTP POST request including a JSON object
|
||||
*
|
||||
* @param jreq JSON object in HTTP request
|
||||
* @param jresp JSON object in HTTP response if NEED_MORE
|
||||
* @return Status (SUCCESS, NEED_MORE or FAILED)
|
||||
*/
|
||||
status_t (*post)(rest_t *this, char *command, json_object *jreq,
|
||||
json_object **jresp);
|
||||
|
||||
/**
|
||||
* Destroy rest_t object
|
||||
*/
|
||||
void (*destroy)(rest_t *this);
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Create an rest_t instance
|
||||
*
|
||||
* @param uri REST URI (http://username:password@hostname[:port]/api/)
|
||||
* @param timeout Timeout of the REST connection
|
||||
*/
|
||||
rest_t* rest_create(char *uri, u_int timeout);
|
||||
|
||||
#endif /* USE_JSON */
|
||||
|
||||
#endif /** REST_H_ @}*/
|
||||
Reference in New Issue
Block a user