summaryrefslogtreecommitdiff
path: root/src/client/requestbroker/APIRequest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/requestbroker/APIRequest.cpp')
-rw-r--r--src/client/requestbroker/APIRequest.cpp65
1 files changed, 62 insertions, 3 deletions
diff --git a/src/client/requestbroker/APIRequest.cpp b/src/client/requestbroker/APIRequest.cpp
index 71d683f..811096d 100644
--- a/src/client/requestbroker/APIRequest.cpp
+++ b/src/client/requestbroker/APIRequest.cpp
@@ -1,6 +1,10 @@
#include <iostream>
#include <typeinfo>
#include <cstdlib>
+#include <cstring>
+#include "Config.h"
+#include "Format.h"
+#include "client/Client.h"
#include "APIRequest.h"
#include "client/HTTP.h"
#include "APIResultParser.h"
@@ -8,6 +12,17 @@
APIRequest::APIRequest(std::string url, APIResultParser * parser, ListenerHandle listener):
RequestBroker::Request(API, listener)
{
+ Post = false;
+ HTTPContext = NULL;
+ Parser = parser;
+ URL = url;
+}
+
+APIRequest::APIRequest(std::string url, std::map<std::string, std::string> postData, APIResultParser * parser, ListenerHandle listener):
+ RequestBroker::Request(API, listener)
+{
+ Post = true;
+ PostData = postData;
HTTPContext = NULL;
Parser = parser;
URL = url;
@@ -26,17 +41,18 @@ RequestBroker::ProcessResponse APIRequest::Process(RequestBroker & rb)
if (status == 200 && data)
{
void * resultObject = Parser->ProcessResponse((unsigned char *)data, data_size);
- free(data);
if(resultObject)
{
this->ResultObject = resultObject;
rb.requestComplete(this);
+ free(data);
return RequestBroker::Finished;
}
else
{
- std::cout << typeid(*this).name() << " Request for " << URL << " could not be parsed" << status << std::endl;
+ std::cout << typeid(*this).name() << " Request for " << URL << " could not be parsed: " << data << std::endl;
+ free(data);
return RequestBroker::Failed;
}
}
@@ -55,7 +71,50 @@ RequestBroker::ProcessResponse APIRequest::Process(RequestBroker & rb)
else
{
std::cout << typeid(*this).name() << " New Request for " << URL << std::endl;
- HTTPContext = http_async_req_start(NULL, (char *)URL.c_str(), NULL, 0, 0);
+ if(Post)
+ {
+ char ** postNames = new char*[PostData.size() + 1];
+ char ** postData = new char*[PostData.size()];
+ int * postLength = new int[PostData.size()];
+
+ int i = 0;
+ std::map<std::string, std::string>::iterator iter = PostData.begin();
+ while(iter != PostData.end())
+ {
+ std::string name = iter->first;
+ std::string data = iter->second;
+ char * cName = new char[name.length() + 1];
+ char * cData = new char[data.length() + 1];
+ std::strcpy(cName, name.c_str());
+ std::strcpy(cData, data.c_str());
+ postNames[i] = cName;
+ postData[i] = cData;
+ postLength[i] = data.length();
+ i++;
+ iter++;
+ }
+ postNames[i] = NULL;
+
+ if(Client::Ref().GetAuthUser().ID)
+ {
+ std::cout << typeid(*this).name() << " Authenticated " << std::endl;
+ User user = Client::Ref().GetAuthUser();
+ char userName[12];
+ char userSession[user.SessionID.length() + 1];
+ std::strcpy(userName, format::NumberToString<int>(user.ID).c_str());
+ std::strcpy(userSession, user.SessionID.c_str());
+ HTTPContext = http_multipart_post_async((char*)URL.c_str(), postNames, postData, postLength, userName, NULL, userSession);
+ }
+ else
+ {
+ HTTPContext = http_multipart_post_async((char*)URL.c_str(), postNames, postData, postLength, NULL, NULL, NULL);
+ }
+
+ }
+ else
+ {
+ HTTPContext = http_async_req_start(NULL, (char *)URL.c_str(), NULL, 0, 0);
+ }
//RequestTime = time(NULL);
}
return RequestBroker::OK;