crossroads

Git mirror of https://crossroads.e-tunity.com/
git clone git://git.finwo.net/app/crossroads
Log | Files | Refs | LICENSE

execute.cc (2061B)


      1 #include "webinterface"
      2 #include "balancer/balancer"
      3 
      4 void Webinterface::execute() {
      5     Threadlist::desc("Web interface");
      6 
      7     // Create the server socket, or retry infinitely.
      8     // This is maybe a too big precaution - previous xr's are responsible
      9     // for killing off their web interfaces. But we don't want a new xr
     10     // start to croak and cause downtime just because the web interface,
     11     // so we just retry for a bit.
     12     while (true) {
     13 	try {
     14 	    msg("Starting web interface\n");
     15 	    sfd.bind(config.webinterfaceip(), config.webinterfaceport());
     16 	} catch (Error const &e) {
     17 	    mutex_lock(&cerr);
     18 	    if (config.prefixtimestamp()) {
     19 		Timestamp tm;
     20 		cerr << tm.desc() << ' ';
     21 	    }
     22 	    cerr << e.what() << " (webinterface, retrying in a sec)\n";
     23 	    mutex_unlock(&cerr);
     24 	    sleep(1);
     25 	    continue;
     26 	}
     27 	break;
     28     }
     29 
     30     msg("Web interface started on socket " << sfd.fd() << "\n");
     31     while (!balancer.terminate()) {
     32 	try {
     33 	    Fdset fdset(0);
     34 	    fdset.add (sfd);
     35 	    fdset.wait_r();
     36 	    if (fdset.readable(sfd)) {
     37 		cfd = sfd.accept();
     38 		serve();
     39 		cfd.close();
     40 	    }
     41 	} catch (Error const &e) {
     42 	    mutex_lock(&cerr);
     43 	    if (config.prefixtimestamp()) {
     44 		Timestamp tm;
     45 		cerr << tm.desc() << ' ';
     46 	    }
     47 	    cerr << e.what() << " (webinterface)\n";
     48 	    mutex_unlock(&cerr);
     49 	    
     50 	    if (cfd.fd() >= 0) {
     51 		ostringstream m;
     52 		m <<
     53 		    "<html>\n"
     54 		    "  <head>\n"
     55 		    "    <title>Web interface error</title>\n"
     56 		    "  </head>\n"
     57 		    "  <body>\n"
     58 		    "    <h1>Web interface error</h1>\n"
     59 		    "    XR's web interface could not handle your request.\n"
     60 		    "    <p/>\n"
     61 		    "    <i>" << e.what() << "</i>\n"
     62 		    "  </body>\n"
     63 		    "</html>\n";
     64 		ostringstream o;
     65 		o << "HTTP/1.0 500 Server Error\r\n"
     66 		     "X-Reason: " << e.what() << "\r\n"
     67 		     "Content-Length: " << m.str().length() << "\r\n"
     68 		     "\r\n" <<
     69 		     m.str();
     70 		Netbuffer buf(o.str());
     71 		buf.netwrite(cfd, config.client_write_timeout());
     72 		cfd.close();
     73 	    }
     74 	}
     75     }
     76     
     77     msg("Web interface stopping.\n");
     78     sfd.close();
     79 }