00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #include <pandabase.h>
00020 
00021 #include "queuedConnectionManager.h"
00022 #include "queuedConnectionListener.h"
00023 #include "queuedConnectionReader.h"
00024 #include "connectionWriter.h"
00025 #include "netAddress.h"
00026 #include "connection.h"
00027 #include "netDatagram.h"
00028 #include "pmap.h"
00029 
00030 #include <ctype.h>
00031 
00032 QueuedConnectionManager cm;
00033 QueuedConnectionReader reader(&cm, 10);
00034 ConnectionWriter writer(&cm, 10);
00035 
00036 class ClientState {
00037 public:
00038   ClientState(Connection *client);
00039   void receive_data(const Datagram &data);
00040   void receive_line(string line);
00041 
00042   Connection *_client;
00043   string _received;
00044 };
00045 
00046 ClientState::
00047 ClientState(Connection *client) {
00048   _client = client;
00049 }
00050 
00051 void ClientState::
00052 receive_data(const Datagram &data) {
00053   _received += data.get_message();
00054   size_t next = 0;
00055   size_t newline = _received.find('\n', next);
00056   while (newline != string::npos) {
00057     size_t last = next;
00058     next = newline + 1;
00059     if (newline > 0 && _received[newline - 1] == '\r') {
00060       newline--;
00061     }
00062     receive_line(_received.substr(last, newline - last));
00063     if (next < _received.size() && _received[next] == '\r') {
00064       next++;
00065     }
00066     newline = _received.find('\n', next);
00067   }
00068   _received = _received.substr(next);
00069 }
00070 
00071 void ClientState::
00072 receive_line(string line) {
00073   cerr << "received: " << line << "\n";
00074   
00075   size_t size = line.size();
00076   while (size > 0 && isspace(line[size - 1])) {
00077     size--;
00078   }
00079   if (size != line.size()) {
00080     line = line.substr(0, size);
00081   }
00082 
00083   
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 }
00094 
00095 
00096 int
00097 main(int argc, char *argv[]) {
00098   if (argc != 2) {
00099     nout << "fake_http_server port\n";
00100     exit(1);
00101   }
00102 
00103   int port = atoi(argv[1]);
00104 
00105   PT(Connection) rendezvous = cm.open_TCP_server_rendezvous(port, 5);
00106 
00107   if (rendezvous.is_null()) {
00108     nout << "Cannot grab port " << port << ".\n";
00109     exit(1);
00110   }
00111 
00112   nout << "Listening for connections on port " << port << "\n";
00113 
00114   QueuedConnectionListener listener(&cm, 1);
00115   listener.add_connection(rendezvous);
00116 
00117   typedef pmap< PT(Connection), ClientState > Clients;
00118   Clients clients;
00119 
00120   reader.set_raw_mode(1);
00121   writer.set_raw_mode(1);
00122 
00123   bool shutdown = false;
00124   while (!shutdown) {
00125     
00126     while (listener.new_connection_available()) {
00127       PT(Connection) rv;
00128       NetAddress address;
00129       PT(Connection) new_connection;
00130       if (listener.get_new_connection(rv, address, new_connection)) {
00131         nout << "Got connection from " << address << "\n";
00132         reader.add_connection(new_connection);
00133         clients.insert(Clients::value_type(new_connection, ClientState(new_connection)));
00134       }
00135     }
00136 
00137     
00138     while (cm.reset_connection_available()) {
00139       PT(Connection) connection;
00140       if (cm.get_reset_connection(connection)) {
00141         nout << "Lost connection from "
00142              << connection->get_address() << "\n";
00143         clients.erase(connection);
00144         cm.close_connection(connection);
00145       }
00146     }
00147 
00148     
00149     while (reader.data_available()) {
00150       NetDatagram datagram;
00151       if (reader.get_data(datagram)) {
00152         PT(Connection) client = datagram.get_connection();
00153         Clients::iterator ci = clients.find(client);
00154         if (ci == clients.end()) {
00155           nout << "Received data from unexpected client " << (void *)client
00156                << "\n";
00157         } else {
00158           ClientState &state = (*ci).second;
00159           state.receive_data(datagram);
00160         }
00161       }
00162     }
00163   }
00164 
00165   return (0);
00166 }
00167 
00168 
00169 
00170 
00171