diff options
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 | 
