diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/server.cc | 36 | ||||
| -rw-r--r-- | server/src/transactionparser.cc | 13 | ||||
| -rw-r--r-- | server/src/transactionparser.h | 4 | 
3 files changed, 41 insertions, 12 deletions
| diff --git a/server/src/server.cc b/server/src/server.cc index ad7065e..688a310 100644 --- a/server/src/server.cc +++ b/server/src/server.cc @@ -262,21 +262,33 @@ static void handleConnection(TCPSocket *socket)    while((size = socket->read(buf, bufsize)) > 0) { -    if(transaction == NULL) { -      transaction = new Transaction(); -      parser = new TransactionParser(transaction); -    } +    while(size) { + +      if(transaction == NULL) { +        transaction = new Transaction(); +        parser = new TransactionParser(transaction); +      } -    printf("Got %d bytes in read loop\n", size); -    if(parser->parse(buf)) { -      printf("Got complete XML document\n"); -      socket->write(handleTransaction(*transaction)); +      printf("Got %d bytes in read loop\n", size); +      size = 0; +      if(parser->parse(buf)) { +        printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" +               "!! Got complete XML document %d bytes used, %d bytes in current buffer.\n" +               "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", parser->usedBytes(), strlen(buf)); -      delete transaction; -      transaction = NULL; +        if(parser->usedBytes() < strlen(buf)) { +          size = strlen(buf) - parser->usedBytes(); +          strcpy(buf, buf + parser->usedBytes()); +        } -      delete parser; -      parser = NULL; +        socket->write(handleTransaction(*transaction)); +         +        delete transaction; +        transaction = NULL; +         +        delete parser; +        parser = NULL; +      }      }      memset(buf, 0, bufsize);    } diff --git a/server/src/transactionparser.cc b/server/src/transactionparser.cc index 1dbeb39..2ba4fc4 100644 --- a/server/src/transactionparser.cc +++ b/server/src/transactionparser.cc @@ -37,6 +37,7 @@ TransactionParser::TransactionParser(Transaction *transaction)  {    this->transaction = transaction;    done = false; +  totalbytes = 0;  }  TransactionParser::~TransactionParser() @@ -83,18 +84,25 @@ int TransactionParser::readData(char *data, size_t size)  bool TransactionParser::parse(std::string data)  { +  bufferbytes = data.length(); +  totalbytes += bufferbytes; +    if(! XML_Parse(p, (char*)data.c_str(), data.size(), false) ) { +    if(XML_GetErrorCode(p) == XML_ERROR_JUNK_AFTER_DOC_ELEMENT) return true;      parseError((char*)data.c_str(), data.size(), XML_ErrorString(XML_GetErrorCode(p)), (int)XML_GetCurrentLineNumber(p));      return false;    }    if(done) {      if(! XML_Parse(p, (char*)data.c_str(), 0, true) ) { +      if(XML_GetErrorCode(p) == XML_ERROR_JUNK_AFTER_DOC_ELEMENT) return true;        parseError((char*)data.c_str(), 0, XML_ErrorString(XML_GetErrorCode(p)), (int)XML_GetCurrentLineNumber(p));        return false;      }    } +  printf("Got END_OF_TEMPLATE at %ld\n", XML_GetCurrentByteIndex(p)); +    return done;  } @@ -106,3 +114,8 @@ void TransactionParser::parseError(char *buf, size_t len, std::string error, int    fprintf(stderr, "]\n");    fflush(stderr);  } + +unsigned int TransactionParser::usedBytes() +{ +  return bufferbytes + (XML_GetCurrentByteIndex(p) - totalbytes); +} diff --git a/server/src/transactionparser.h b/server/src/transactionparser.h index 3f477c9..1f7d23f 100644 --- a/server/src/transactionparser.h +++ b/server/src/transactionparser.h @@ -43,10 +43,14 @@ public:    bool parse(std::string data); +  unsigned int usedBytes(); +  protected:    int readData(char *data, size_t size);  private: +  unsigned int bufferbytes; +  unsigned int totalbytes;    Transaction *transaction;    bool done;  }; | 
