summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2008-09-23 08:10:37 +0000
committerdeva <deva>2008-09-23 08:10:37 +0000
commitefb0b27f5bc659a49e330fb7970a9b1b6ae0f398 (patch)
tree4872d87d301ea5d31c7b2e7f0435ec9318222086
parent587f685b6f7cbc63a8ee8dc8b3d5c590144db045 (diff)
Made fix for the 'multiple xml buffers in single network buffer' problem.
-rw-r--r--server/src/server.cc36
-rw-r--r--server/src/transactionparser.cc13
-rw-r--r--server/src/transactionparser.h4
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;
};