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 }