diff --git a/src/cpp/HTTPInterface/ElopageWebhook.cpp b/src/cpp/HTTPInterface/ElopageWebhook.cpp index 9bcf86613..958c7437f 100644 --- a/src/cpp/HTTPInterface/ElopageWebhook.cpp +++ b/src/cpp/HTTPInterface/ElopageWebhook.cpp @@ -2,6 +2,7 @@ #include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerResponse.h" #include "Poco/DeflatingStream.h" +#include "Poco/URI.h" #include "../ServerConfig.h" @@ -14,13 +15,61 @@ void ElopageWebhook::handleRequest(Poco::Net::HTTPServerRequest& request, Poco:: std::istream& stream = request.stream(); Poco::Net::NameValueCollection elopageRequestData; - while (!stream.eof()) { + int breakCount = 100; + while (stream.good() && breakCount > 0) { + char dummy; char keyBuffer[30]; memset(keyBuffer, 0, 30); - char valueBuffer[35]; memset(valueBuffer, 0, 35); - stream.get(keyBuffer, 30, '=') - .get(valueBuffer, 35, '&'); - printf("[ElopageWebhook::handleRequest] key: %s, value: %s\n", keyBuffer, valueBuffer); - elopageRequestData.set(keyBuffer, valueBuffer); + char valueBuffer[75]; memset(valueBuffer, 0, 75); + /*stream.get(keyBuffer, 30, '=').get(dummy) + .get(valueBuffer, 35, '&').get(dummy);*/ + std::string line; + std::getline(stream, line); + int mode = 0; + int cursor = 0; + for (int i = 0; i < line.size(); i++) { + char c = line.at(i); + if (c == '\n') break; + if (c == '+') { + c = ' '; + } + if (c == '&') { + mode = 0; + cursor = 0; + std::string urlDecodedValue; + Poco::URI::decode(valueBuffer, urlDecodedValue); + elopageRequestData.set(keyBuffer, urlDecodedValue); + memset(keyBuffer, 0, 30); + memset(valueBuffer, 0, 75); + continue; + } + switch (mode) { + case 0: // read key + if (c == '=') { + mode = 1; + cursor = 0; + continue; + } + if (cursor < 29) { + keyBuffer[cursor++] = c; + } + else { + int zahl = 1; + } + break; + case 1: // read value + if (cursor < 74) { + valueBuffer[cursor++] = c; + } + else { + int zahl = 1; + } + break; + } + } + //printf("[ElopageWebhook::handleRequest] key: %s, value: %s\n", keyBuffer, valueBuffer); + /// elopageRequestData.set(keyBuffer, valueBuffer); + stream.good(); + breakCount--; } UniLib::controller::TaskPtr handleElopageTask(new HandleElopageRequestTask(elopageRequestData)); handleElopageTask->scheduleTask(handleElopageTask);