blob: 16f5006be40f47f53507d262b7ad3f1b9c840cc4 [file] [log] [blame]
#include "server/TSimpleServer.h"
#include <string>
using namespace std;
void TSimpleServer::run() {
TTransport* client;
// Start the server listening
if (serverTransport_->listen() == false) {
// TODO(mcslee): Log error here
fprintf(stderr, "TSimpleServer::run(): Call to listen failed\n");
return;
}
// Fetch client from server
while (true) {
// fprintf(stderr, "Listening for connection\n");
if ((client = serverTransport_->accept()) == NULL) {
// fprintf(stderr, "Got NULL connection, exiting.\n");
break;
}
while (true) {
// Read header from client
// fprintf(stderr, "Reading 4 byte header from client.\n");
string in;
if (client->read(in, 4) <= 0) {
// fprintf(stderr, "Size header negative. Exception!\n");
break;
}
// Read payload from client
int32_t size = *(int32_t*)(in.data());
// fprintf(stderr, "Reading %d byte payload from client.\n", size);
if (client->read(in, size) < size) {
// fprintf(stderr, "Didn't get enough data!!!\n");
break;
}
// Pass payload to dispatcher
// TODO(mcslee): Wrap this in try/catch and return exceptions
string out = dispatcher_->dispatch(in);
size = out.size();
// Write size of response packet
client->write(string((char*)&size, 4));
// Write response payload
client->write(out);
}
// Clean up that client
// fprintf(stderr, "Closing and cleaning up client\n");
client->close();
delete client;
}
// TODO(mcslee): Is this a timeout case or the real thing?
}