CMSDK 2.0.1
Cross-platform C++ base library and SDK for the Psyclone AIOS platform
Loading...
Searching...
No Matches
RESTAPI.h
Go to the documentation of this file.
1
11#if !defined(_RESTAPI_H_)
12#define _RESTAPI_H_
13
14#include "NetworkProtocols.h"
15#include "xml_parser.h"
16#include "jsmn.h"
17
18namespace cmlabs {
19
21struct RESTParam {
22 enum Type { INTEGER, FLOAT, TEXT, ARRAY, IMAGE, VIDEO, BINARY } type;
23 bool optional;
25 std::string name;
26 std::string objects;
27};
28
29
30class RESTParser;
31class RESTHTTPCall;
32
43 friend class RESTParser;
44public:
47
48protected:
49 std::string origin;
50 std::string signature;
51 uint64 createTime;
54 std::map<std::string, std::string> filterMap;
55 std::string errorString;
57
58 bool setStatus(Status status) {this->status = status; return true;}
59 bool setOrigin(const char* origin) {this->origin = origin; return true;}
60 bool setCreateTime(uint64 created) {this->createTime = created; return true;}
61 bool setRequestSignature(const char* signature) {this->signature = signature; return true; }
62 bool setRequireAuthentication(bool auth) {this->requireAuthentication = auth; return true; }
63
64 bool setTime(const char* key, uint64 val) {return storage->setTime(key, val);}
65 bool setInt(const char* key, int64 val) {return storage->setInt(key, val);}
66 bool setDouble(const char* key, double val) {return storage->setDouble(key, val);}
67 bool setString(const char* key, const char* val) {return storage->setString(key, val);}
68 bool setBinary(const char* key, const char* data, uint32 size, const char* contentType) {
69 if (!storage->setData(key, data, size))
70 return false;
71 return storage->setString(utils::StringFormat("%s_content_type_", key).c_str(), contentType);
72 }
73
74 bool addToErrorString(const char* errorLine) {errorString.length() ? errorString = utils::StringFormat("%s - %s", errorString.c_str(), errorLine) : errorString = errorLine; return true;}
75 bool clearErrorState() { errorString.clear(); status=FAILED_EMPTY; return true; }
76
77public:
85 virtual ~RESTRequest();
86
88 bool isHTTPCall() { return (httpCall != NULL); };
94 std::string getHTTPCallURL();
95
102 const char* getSignature(bool& success) {success = (bool)signature.length(); return signature.c_str(); }
103
106 const char* getOrigin(bool& success) {success = (bool)origin.length(); return origin.c_str(); }
108 uint64 getCreateTime(bool& success) {success = (bool)createTime; return createTime; }
109
116 uint64 getTime(const char* key, bool& success) {return storage->getTime(key, success);}
117 const char* getString(const char* key, bool& success) {return storage->getString(key, success);}
118 int64 getInt(const char* key, bool& success) {return storage->getInt(key, success);}
119 double getDouble(const char* key, bool& success) {return storage->getDouble(key, success);}
120 const char* getData(const char* key, uint32& size, bool& success) {return storage->getData(key, size, success);}
121 char* getDataCopy(const char* key, uint32& size, bool& success) {return storage->getDataCopy(key, size, success);}
124 bool getRequireAuthentication() {return this->requireAuthentication;}
125
127 const char* getErrorString() {return errorString.c_str();}
128
133 const char* getFilterString(const char* key, bool& success) { if (filterMap.find(key) == filterMap.end()) {success = false; return NULL; } else {success = true; return filterMap[key].c_str();} }
134 int64 getFilterInt(const char* key, bool& success) { if (filterMap.find(key) == filterMap.end()) {success = false; return 0; } else {success = true; return utils::Ascii2Int64(filterMap[key].c_str());} }
135 float64 getFilterFloat(const char* key, bool& success) { if (filterMap.find(key) == filterMap.end()) {success = false; return 0; } else {success = true; return utils::Ascii2Float64(filterMap[key].c_str());} }
136 bool setFilter(const char* key, const char* val) {filterMap[key] = val; return true;}
137 bool setFilter(const char* key, int64 val) {filterMap[key] = utils::StringFormat("%d", val); return true;}
138 bool setFilter(const char* key, float64 val) {filterMap[key] = utils::StringFormat("%f", val); return true;}
140
143};
144
154public:
156 static bool UnitTest();
157
159 RESTParser();
161 virtual ~RESTParser();
162
167 bool init(const char* restDefinition);
168
179
181 const char* getLastErrorString() {return lastErrorString.c_str(); }
182
183protected:
185 std::string lastErrorString;
186 std::map<std::string, std::map<std::string, RESTParam> > paramSets;
187 std::map<std::string, RESTHTTPCall*> httpCalls;
188
189 XMLNode findTopNodeForRequest(const char* requestString);
190 std::map<std::string, RESTParam> parseParamSet(XMLNode objectNode);
191
192 XMLNode parseRequest(const char* requestString, std::map<std::string, RESTParam> &paramSet, RESTRequest* restReq, std::string &signature);
193
194 bool extractParameters(HTTPRequest* req, std::map<std::string, RESTParam> &paramSet, RESTRequest* restReq);
195 bool extractParameters(DataMessage* msg, std::map<std::string, RESTParam> &paramSet, RESTRequest* restReq);
196
197 bool extractArrayParameters(HTTPRequest* req, std::map<std::string, RESTParam> &paramSet, RESTRequest* restReq, int entryNum, const char* content, uint32 contentSize, const char* contentType);
198 bool extractArrayParameters(DataMessage* msg, std::map<std::string, RESTParam> &paramSet, RESTRequest* restReq, int entryNum, const char* content, uint32 contentSize, const char* contentType);
199
200 bool setParameterValue(HTTPRequest* req, RESTParam &param, std::string value, RESTRequest* restReq, uint32 entryNum = 0);
201 bool setParameterValue(DataMessage* msg, RESTParam &param, std::string value, RESTRequest* restReq, uint32 entryNum = 0);
202};
203
204
212public:
214 RESTHTTPCall();
217
222 bool init(XMLNode objectNode);
223
229
230 std::string name;
231 std::string url;
232 uint8 ops;
233 std::string contentType;
234 std::string cacheControl;
235
236 std::map<std::string, std::string> headerEntries;
237 std::map<std::string, std::string> headerParams;
238 std::map<std::string, std::string> bodyEntries;
239 std::map<std::string, std::string> bodyParams;
240 std::map<std::string, std::string> bodyContentTypes;
241};
242
243
244} // namespace cmlabs
245
246#endif //_RESTAPI_H_
247
Wire-protocol layer: HTTP request/reply, WebSocket frames, Telnet lines, binary DataMessages,...
The central Psyclone data container: a self-contained binary message with typed, named user entries.
A parsed or generated HTTP request (also used for WebSocket upgrade handshakes).
Definition of an outbound HTTP call template from the REST API XML.
Definition RESTAPI.h:211
std::map< std::string, std::string > headerParams
Headers filled from request parameters.
Definition RESTAPI.h:237
~RESTHTTPCall()
Destructor.
Definition RESTAPI.cpp:1602
HTTPRequest * generateHTTPRequest(RESTRequest *restReq)
Build the outbound HTTP request for a parsed REST request, substituting parameters into URL,...
Definition RESTAPI.cpp:1684
uint8 ops
Allowed HTTP operations bitmask (GET/POST/...).
Definition RESTAPI.h:232
std::string name
Call name from the API definition.
Definition RESTAPI.h:230
std::map< std::string, std::string > headerEntries
Fixed header key/values.
Definition RESTAPI.h:236
bool init(XMLNode objectNode)
Populate this call definition from its XML node in the API definition.
Definition RESTAPI.cpp:1605
std::string contentType
Content-Type for the request body.
Definition RESTAPI.h:233
std::map< std::string, std::string > bodyContentTypes
Per-body-part content types (e.g.
Definition RESTAPI.h:240
std::string cacheControl
Cache-Control header value, if any.
Definition RESTAPI.h:234
RESTHTTPCall()
Create an empty call definition; populate with init().
Definition RESTAPI.cpp:1599
std::map< std::string, std::string > bodyParams
Body fields filled from request parameters.
Definition RESTAPI.h:239
std::map< std::string, std::string > bodyEntries
Fixed body key/values.
Definition RESTAPI.h:238
std::string url
URL template (with parameter placeholders).
Definition RESTAPI.h:231
Parses and validates incoming requests against an XML REST API definition.
Definition RESTAPI.h:153
RESTParser()
Create an uninitialised parser; call init() before use.
Definition RESTAPI.cpp:13
std::map< std::string, RESTHTTPCall * > httpCalls
Definition RESTAPI.h:187
virtual ~RESTParser()
Destructor; deletes the owned RESTHTTPCall objects.
Definition RESTAPI.cpp:16
bool init(const char *restDefinition)
Load and validate the XML REST API definition.
Definition RESTAPI.cpp:26
const char * getLastErrorString()
Definition RESTAPI.h:181
XMLNode findTopNodeForRequest(const char *requestString)
Definition RESTAPI.cpp:1339
bool extractParameters(HTTPRequest *req, std::map< std::string, RESTParam > &paramSet, RESTRequest *restReq)
Definition RESTAPI.cpp:497
std::map< std::string, std::map< std::string, RESTParam > > paramSets
Definition RESTAPI.h:186
bool extractArrayParameters(HTTPRequest *req, std::map< std::string, RESTParam > &paramSet, RESTRequest *restReq, int entryNum, const char *content, uint32 contentSize, const char *contentType)
Definition RESTAPI.cpp:899
std::string lastErrorString
Definition RESTAPI.h:185
bool setParameterValue(HTTPRequest *req, RESTParam &param, std::string value, RESTRequest *restReq, uint32 entryNum=0)
Definition RESTAPI.cpp:1201
RESTRequest * parseRequest(HTTPRequest *req)
Parse an incoming HTTP request against the API definition.
Definition RESTAPI.cpp:127
static bool UnitTest()
Run the RESTParser unit tests.
Definition RESTAPI.cpp:1426
std::map< std::string, RESTParam > parseParamSet(XMLNode objectNode)
Definition RESTAPI.cpp:85
A parsed and validated REST request with typed access to its parameters.
Definition RESTAPI.h:42
virtual ~RESTRequest()
Destructor; deletes the internal storage message.
Definition RESTAPI.cpp:1382
friend class RESTParser
Definition RESTAPI.h:43
bool addToErrorString(const char *errorLine)
Definition RESTAPI.h:74
const char * getSignature(bool &success)
Get the request signature (canonical "name(paramtypes)" string from the API definition).
Definition RESTAPI.h:102
RESTHTTPCall * httpCall
Definition RESTAPI.h:56
const char * getOrigin(bool &success)
Get the request origin (e.g.
Definition RESTAPI.h:106
bool setRequestSignature(const char *signature)
Definition RESTAPI.h:61
RESTRequest()
Create an empty request (status FAILED_EMPTY) with fresh internal storage.
Definition RESTAPI.h:83
uint64 getTime(const char *key, bool &success)
Definition RESTAPI.h:116
double getDouble(const char *key, bool &success)
Definition RESTAPI.h:119
std::string signature
Definition RESTAPI.h:50
int64 getInt(const char *key, bool &success)
Definition RESTAPI.h:118
bool setBinary(const char *key, const char *data, uint32 size, const char *contentType)
Definition RESTAPI.h:68
bool setDouble(const char *key, double val)
Definition RESTAPI.h:66
bool requireAuthentication
Definition RESTAPI.h:53
enum cmlabs::RESTRequest::Status status
bool setString(const char *key, const char *val)
Definition RESTAPI.h:67
char * getDataCopy(const char *key, uint32 &size, bool &success)
Definition RESTAPI.h:121
bool setInt(const char *key, int64 val)
Definition RESTAPI.h:65
std::string getHTTPCallURL()
Definition RESTAPI.cpp:1416
bool setStatus(Status status)
Definition RESTAPI.h:58
std::string origin
Definition RESTAPI.h:49
std::string errorString
Definition RESTAPI.h:55
bool setFilter(const char *key, const char *val)
Definition RESTAPI.h:136
bool setTime(const char *key, uint64 val)
Definition RESTAPI.h:64
bool setOrigin(const char *origin)
Definition RESTAPI.h:59
RESTRequest(DataMessage *msg)
Reconstruct a request from a DataMessage previously produced by getStorageMessageCopy().
Definition RESTAPI.cpp:1366
uint64 getCreateTime(bool &success)
Get the creation timestamp (PsyTime µs).
Definition RESTAPI.h:108
bool setCreateTime(uint64 created)
Definition RESTAPI.h:60
Status getStatus()
Definition RESTAPI.h:97
std::map< std::string, std::string > filterMap
Definition RESTAPI.h:54
int64 getFilterInt(const char *key, bool &success)
Definition RESTAPI.h:134
const char * getData(const char *key, uint32 &size, bool &success)
Definition RESTAPI.h:120
const char * getString(const char *key, bool &success)
Definition RESTAPI.h:117
bool setRequireAuthentication(bool auth)
Definition RESTAPI.h:62
bool clearErrorState()
Definition RESTAPI.h:75
HTTPRequest * generateHTTPCallRequest()
Generate the outbound HTTPRequest for an HTTP-call request.
Definition RESTAPI.cpp:1410
bool getRequireAuthentication()
Definition RESTAPI.h:124
DataMessage * storage
Definition RESTAPI.h:52
bool setFilter(const char *key, float64 val)
Definition RESTAPI.h:138
const char * getErrorString()
Definition RESTAPI.h:127
DataMessage * getStorageMessageCopy()
Definition RESTAPI.cpp:1389
const char * getFilterString(const char *key, bool &success)
Definition RESTAPI.h:133
Status
Parse/validation outcome of the request.
Definition RESTAPI.h:46
float64 getFilterFloat(const char *key, bool &success)
Definition RESTAPI.h:135
bool setFilter(const char *key, int64 val)
Definition RESTAPI.h:137
std::string StringFormat(const char *format,...)
printf into a std::string.
Definition Utils.cpp:6626
int64 Ascii2Int64(const char *ascii, uint32 start=0, uint32 end=0)
Parse a signed 64-bit decimal integer from a substring.
Definition Utils.cpp:7462
float64 Ascii2Float64(const char *ascii, uint32 start=0, uint32 end=0)
Parse a 64-bit float from a substring (decimal point, not locale dependent).
Definition Utils.cpp:7546
Third-party (vendored): jsmn minimalistic JSON tokenizer by Serge Zaitsev (MIT licence),...
Definition of one parameter of a REST request, as declared in the API XML.
Definition RESTAPI.h:21
bool allowEmpty
true if an empty value is acceptable.
Definition RESTAPI.h:24
std::string name
Parameter name.
Definition RESTAPI.h:25
std::string objects
For ARRAY parameters: the nested object/param-set name.
Definition RESTAPI.h:26
bool optional
true if the parameter may be omitted.
Definition RESTAPI.h:23
Small recursive XML DOM parser (XMLNode) used by CMSDK for all PsySpec XML parsing.