blob: 8d62bf990921e58acb1029106347b4a1964951f1 [file] [log] [blame]
Mark Sleee8540632006-05-30 09:24:40 +00001#include "server/TSimpleServer.h"
Mark Slee8d7e1f62006-06-07 06:48:56 +00002#include "transport/TTransportException.h"
Mark Sleee8540632006-05-30 09:24:40 +00003#include <string>
Mark Slee8d7e1f62006-06-07 06:48:56 +00004#include <iostream>
Mark Sleee8540632006-05-30 09:24:40 +00005using namespace std;
6
Marc Slemko6f038a72006-08-03 18:58:09 +00007namespace facebook { namespace thrift { namespace server {
8
Mark Slee8d7e1f62006-06-07 06:48:56 +00009/**
10 * A simple single-threaded application server. Perfect for unit tests!
11 *
12 * @author Mark Slee <mcslee@facebook.com>
13 */
Mark Slee794993d2006-09-20 01:56:10 +000014void TSimpleServer::serve() {
Marc Slemko16698852006-08-04 03:16:10 +000015
16 shared_ptr<TTransport> client;
Mark Slee4af6ed72006-10-25 19:02:49 +000017 pair<shared_ptr<TTransport>,shared_ptr<TTransport> > iot;
18 pair<shared_ptr<TProtocol>,shared_ptr<TProtocol> > iop;
Mark Sleee8540632006-05-30 09:24:40 +000019
Mark Slee8d7e1f62006-06-07 06:48:56 +000020 try {
21 // Start the server listening
22 serverTransport_->listen();
23 } catch (TTransportException& ttx) {
Mark Sleeb9ff32a2006-11-16 01:00:24 +000024 cerr << "TSimpleServer::run() listen(): " << ttx.what() << endl;
Mark Sleee8540632006-05-30 09:24:40 +000025 return;
26 }
27
28 // Fetch client from server
Mark Sleed788b2e2006-09-07 01:26:35 +000029 try {
30 while (true) {
Mark Slee8d7e1f62006-06-07 06:48:56 +000031 client = serverTransport_->accept();
Mark Slee4af6ed72006-10-25 19:02:49 +000032 iot = transportFactory_->getIOTransports(client);
33 iop = protocolFactory_->getIOProtocols(iot.first, iot.second);
Mark Sleed788b2e2006-09-07 01:26:35 +000034 try {
Mark Sleeb9ff32a2006-11-16 01:00:24 +000035 while (processor_->process(iop.first, iop.second)) {
36 // Peek ahead, is the remote side closed?
37 if (!iot.first->peek()) {
38 break;
39 }
40 }
Mark Sleed788b2e2006-09-07 01:26:35 +000041 } catch (TTransportException& ttx) {
Mark Sleeb9ff32a2006-11-16 01:00:24 +000042 cerr << "TSimpleServer client died: " << ttx.what() << endl;
Mark Slee3860c9a2006-12-06 00:13:42 +000043 } catch (TException& tx) {
44 cerr << "TSimpleServer exception: " << tx.what() << endl;
Mark Sleee8540632006-05-30 09:24:40 +000045 }
Mark Slee4af6ed72006-10-25 19:02:49 +000046 iot.first->close();
47 iot.second->close();
Mark Slee8d7e1f62006-06-07 06:48:56 +000048 client->close();
Mark Sleed788b2e2006-09-07 01:26:35 +000049 }
50 } catch (TTransportException& ttx) {
Mark Sleeb9ff32a2006-11-16 01:00:24 +000051 cerr << "TServerTransport died on accept: " << ttx.what() << endl;
Mark Slee3860c9a2006-12-06 00:13:42 +000052 } catch (TException& tx) {
53 cerr << "Some kind of accept exception: " << tx.what() << endl;
Mark Sleee8540632006-05-30 09:24:40 +000054 }
55
Mark Slee8d7e1f62006-06-07 06:48:56 +000056 // TODO(mcslee): Could this be a timeout case? Or always the real thing?
Mark Sleee8540632006-05-30 09:24:40 +000057}
Marc Slemko6f038a72006-08-03 18:58:09 +000058
59}}} // facebook::thrift::server