diff options
author | deva <deva> | 2009-11-03 13:49:15 +0000 |
---|---|---|
committer | deva <deva> | 2009-11-03 13:49:15 +0000 |
commit | 1782d12938ba89b67a52677d162d4c865f00cbe0 (patch) | |
tree | c4fe0ccd65af6485433310e54e8e8fef43f251da /server/src | |
parent | c91d9e62801aca5a12ca37429c39a71e6351d6d5 (diff) |
First working, but not in any way optimal implementation of a http transport layer.
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/server.cc | 109 |
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 |