summaryrefslogtreecommitdiff
path: root/server/src/server.cc
diff options
context:
space:
mode:
authordeva <deva>2009-11-03 13:49:15 +0000
committerdeva <deva>2009-11-03 13:49:15 +0000
commit1782d12938ba89b67a52677d162d4c865f00cbe0 (patch)
treec4fe0ccd65af6485433310e54e8e8fef43f251da /server/src/server.cc
parentc91d9e62801aca5a12ca37429c39a71e6351d6d5 (diff)
First working, but not in any way optimal implementation of a http transport layer.
Diffstat (limited to 'server/src/server.cc')
-rw-r--r--server/src/server.cc109
1 files changed, 63 insertions, 46 deletions
diff --git a/server/src/server.cc b/server/src/server.cc
index f2be8a4..9d3caba 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -36,6 +36,8 @@
#include <unistd.h>
#include <string.h>
+#include <microhttpd.h>
+
#include "configuration.h"
#include "transaction.h"
#include "transactionparser.h"
@@ -294,8 +296,11 @@ static std::string handleTransaction(Transaction *transaction,
}
-static void handleConnection(TCPSocket *socket)
+static std::string handleConnection(char *buf, size_t size)
{
+ if(size == 0)
+ return error_box(xml_encode("Empty document received."));
+
TCPSocket pentominos_socket;
#ifndef WITHOUT_PENTOMINOS
pentominos_socket.connect(Conf::pentominos_addr, Conf::pentominos_port);
@@ -308,63 +313,75 @@ static void handleConnection(TCPSocket *socket)
MacroList macrolist(Conf::xml_basedir + "/macros");
TemplateList templatelist(Conf::xml_basedir + "/templates");
- ssize_t size;
- char buf[4096];
+ Transaction transaction;
+ TransactionParser parser(&transaction);
- Transaction *transaction = NULL;
- TransactionParser *parser = NULL;
-
- // while( (size = socket->read(buf, sizeof(buf))) != -1) {
- while( (size = socket->read(buf, sizeof(buf))) > 0) {
+ PRACRO_DEBUG(server, "Read %d bytes from network\n", size);
- PRACRO_DEBUG(server, "Read %d bytes from network\n", size);
-
- while(size) {
+ if(parser.parse(buf, size)) {
+ PRACRO_DEBUG(server, "Got complete XML document, %d bytes in current buffer.\n", size);
- if(transaction == NULL) {
- transaction = new Transaction();
- }
+ std::string res = handleTransaction(&transaction, pentominos_socket,
+ db, journalwriter, macrolist, templatelist);
+ journalwriter.commit();
- if(parser == NULL) {
- parser = new TransactionParser(transaction);
- }
+ return res;
+ }
+
+ PRACRO_ERR(server, "Failed to parse data!\n");
+ return error_box(xml_encode("XML Parse error."));
+}
- PRACRO_DEBUG(server, "Got %d bytes in read loop\n", size);
- if(parser->parse(buf, size)) {
- PRACRO_DEBUG(server, "Got complete XML document %d bytes used, %d bytes in current buffer.\n", parser->usedBytes(), size);
+static int handle_request(void *cls,
+ struct MHD_Connection *con,
+ const char *url,
+ const char *method,
+ const char *version,
+ const char *data,
+ unsigned int *data_size,
+ void **ptr)
+{
+ PRACRO_DEBUG(httpd, "handle_request(url=\"%s\", method=\"%s\", version=\"%s\", data_size=\"%d\")\n",
+ url, method, version, *data_size);
- socket->write(handleTransaction(transaction, pentominos_socket,
- db, journalwriter, macrolist, templatelist));
- size = size - parser->usedBytes();
- if(size) {
- strcpy(buf, buf + parser->usedBytes());
- PRACRO_DEBUG(server, "Replaying %d bytes.\n", size);
- }
+ std::string reply = handleConnection((char*)data, *data_size);
+
+ struct MHD_Response *rsp;
+ rsp = MHD_create_response_from_data(reply.length(), (char*)reply.c_str(), MHD_NO, MHD_YES);
+ MHD_add_response_header(rsp, MHD_HTTP_HEADER_CONTENT_TYPE, "text/plain; charset=UTF-8");
+ int ret = MHD_queue_response(con, MHD_HTTP_OK, rsp);
+ MHD_destroy_response(rsp);
- delete transaction; transaction = NULL;
- delete parser; parser = NULL;
- } else {
- size = 0;
- memset(buf, 0, sizeof(buf));
- }
- }
- }
+ return ret;
+}
- if(transaction) {
- delete transaction;
- transaction = NULL;
- }
+extern bool pracro_is_running;
+void server()
+{
+ port_t port = Conf::server_port;
- if(parser) {
- delete parser;
- parser = NULL;
- }
+ PRACRO_DEBUG(server, "Server running on port %d.\n", port);
+
+ struct MHD_Daemon *d;
+ d = MHD_start_daemon(MHD_USE_DEBUG | MHD_USE_SELECT_INTERNALLY,
+ port,
+ NULL, NULL,
+ handle_request, NULL,
+ MHD_OPTION_NOTIFY_COMPLETED, NULL, NULL,
+ // MHD_OPTION_CONNECTION_LIMIT, 42,
+ MHD_OPTION_CONNECTION_TIMEOUT, 0,
+ MHD_OPTION_EXTERNAL_LOGGER, NULL, NULL,
+ MHD_OPTION_END);
+
+ while(pracro_is_running) sleep(1);
- journalwriter.commit();
+ MHD_stop_daemon(d);
- PRACRO_DEBUG(server, "Out of read loop!\n");
+ PRACRO_DEBUG(server, "Server gracefully shut down.\n");
}
+
+#if 0
//#define NON_FORKING
#include <sys/socket.h>
extern bool pracro_is_running;
@@ -428,7 +445,7 @@ void server()
PRACRO_DEBUG(server, "Server gracefully shut down.\n");
}
-
+#endif//0
#ifdef TEST_SERVER