char *test_Server_adds() { int rc = 0; Server *srv = Server_create( bfromcstr("uuid"), bfromcstr("localhost"), bfromcstr("0.0.0.0"), 8080, bfromcstr("chroot"), bfromcstr("access_log"), bfromcstr("error_log"), bfromcstr("pid_file"), NULL, 0); mu_assert(srv != NULL, "Failed to make the server, something on 8090?"); Host *host = Host_create(bfromcstr("zedshaw.com"), bfromcstr("zedshaw.com")); mu_assert(host != NULL, "Failed to make host."); rc = Server_add_host(srv, host); mu_assert(rc == 0, "Failed to add host to server."); Server_set_default_host(srv, host); Host *zedshaw = Server_match_backend(srv, host->name); mu_assert(zedshaw == host, "Didn't get the right one back."); mu_assert(Server_match_backend(srv, bfromcstr("NOWAY")) == host, "Didn't fall back to default_host"); Server_destroy(srv); return NULL; }
void Server_queue_cleanup() { if(darray_end(SERVER_QUEUE) < SERVER_ACTIVE) { // skip it, not enough to care about return; } // pop the last one off to make sure it's never deleted Server *cur_srv = darray_pop(SERVER_QUEUE); uint32_t too_old = time(NULL) - SERVER_TTL; int i = 0; // TODO: kind of a dumb way to do this since it reorders the list // go through all but the max we want to keep for(i = 0; i < darray_end(SERVER_QUEUE) - SERVER_ACTIVE; i++) { Server *srv = darray_get(SERVER_QUEUE, i); if(srv->created_on < too_old) { Server *replace = darray_pop(SERVER_QUEUE); darray_set(SERVER_QUEUE, i, replace); srv->listen_fd = -1; // don't close it Server_destroy(srv); } } // put the sacred server back on the end darray_push(SERVER_QUEUE, cur_srv); return; }
Server *Server_create(bstring uuid, bstring default_host, bstring bind_addr, int port, bstring chroot, bstring access_log, bstring error_log, bstring pid_file, bstring control_port, int use_ssl) { Server *srv = NULL; int rc = 0; srv = h_calloc(sizeof(Server), 1); check_mem(srv); srv->hosts = RouteMap_create(host_destroy_cb); check(srv->hosts != NULL, "Failed to create host RouteMap."); srv->handlers = darray_create(sizeof(Handler), 20); check_mem(srv->handlers); check(port > 0, "Invalid port given, must be > 0: %d", port); srv->port = port; srv->listen_fd = 0; srv->bind_addr = bstrcpy(bind_addr); check_mem(srv->bind_addr); srv->uuid = bstrcpy(uuid); check_mem(srv->uuid); // TODO: once mbedtls supports opening urandom early and keeping it open, // put the rng initialization back here (before chroot) //if(use_ssl) { // rc = Server_init_rng(srv); // check(rc == 0, "Failed to initialize rng for server %s", bdata(uuid)); //} if(blength(chroot) > 0) { srv->chroot = bstrcpy(chroot); check_mem(srv->chroot); } else { srv->chroot = NULL; } srv->access_log = bstrcpy(access_log); check_mem(srv->access_log); srv->error_log = bstrcpy(error_log); check_mem(srv->error_log); srv->pid_file = bstrcpy(pid_file); check_mem(srv->pid_file); if(blength(control_port) > 0) { srv->control_port = bstrcpy(control_port); check_mem(srv->control_port); } else { srv->control_port = NULL; } srv->default_hostname = bstrcpy(default_host); srv->use_ssl = use_ssl; srv->created_on = time(NULL); if(srv->use_ssl) { rc = Server_init_ssl(srv); check(rc == 0, "Failed to initialize ssl for server %s", bdata(uuid)); } return srv; error: Server_destroy(srv); return NULL; }
char *test_Server_create_destroy() { Server *server = Server_create("uuid", "8080", "chroot", "access_log", "error_log", "pid_file"); mu_assert(server != NULL, "Failed to make the server, something on 8090?"); Server_destroy(server); return NULL; }
char *test_Server_adds() { int rc = 0; Server *srv = Server_create("uuid", "8080", "chroot", "access_log", "error_log", "pid_file"); mu_assert(srv != NULL, "Failed to make the server, something on 8090?"); Host *host = Host_create("zedshaw.com"); mu_assert(host != NULL, "Failed to make host."); rc = Server_add_host(srv, bstrcpy(host->name), host); mu_assert(rc == 0, "Failed to add host to server."); Server_destroy(srv); return NULL; }
int Server_queue_destroy() { int i = 0; Server *srv = NULL; for(i = 0; i < darray_end(SERVER_QUEUE); i++) { srv = darray_get(SERVER_QUEUE, i); check(srv != NULL, "Got a NULL value from the server queue."); Server_destroy(srv); } darray_destroy(SERVER_QUEUE); return 0; error: return -1; }
char *test_Server_create_destroy() { Server *server = Server_create( bfromcstr("uuid"), bfromcstr("localhost"), bfromcstr("0.0.0.0"), 8080, bfromcstr("chroot"), bfromcstr("access_log"), bfromcstr("error_log"), bfromcstr("pid_file"), 0); mu_assert(server != NULL, "Failed to make the server, something on 8090?"); Server_destroy(server); return NULL; }
Server * Server_new ( ServerStartupInfo *info ) { Server *self; if ((self = calloc (1, sizeof (Server))) == NULL) { return NULL; } if (!Server_init (self, info)) { Server_destroy (&self); error ("Server failed to initialize."); return NULL; } return self; }
Server *load_server(const char *db_file, const char *server_uuid, Server *old_srv) { int rc = 0; Server *srv = NULL; rc = Config_init_db(db_file); check(rc == 0, "Failed to load config database at %s", db_file); rc = Config_load_settings(); check(rc != -1, "Failed to load global settings."); rc = Config_load_mimetypes(); check(rc != -1, "Failed to load mime types."); srv = Config_load_server(server_uuid); check(srv, "Failed to load server %s from %s", server_uuid, db_file); check(srv->default_host, "No default_host set for server: %s, you need one host named: %s", server_uuid, bdata(srv->default_hostname)); if(old_srv == NULL || old_srv->listen_fd == -1) { srv->listen_fd = netannounce(TCP, bdata(srv->bind_addr), srv->port); check(srv->listen_fd >= 0, "Can't announce on TCP port %d", srv->port); check(fdnoblock(srv->listen_fd) == 0, "Failed to set listening port %d nonblocking.", srv->port); } else { srv->listen_fd = old_srv->listen_fd; } check(Server_start_handlers(srv, old_srv) == 0, "Failed to start handlers."); Config_close_db(); return srv; error: Server_destroy(srv); Config_close_db(); return NULL; }
def(bool, Run) { Signal_listen(Signal_GetInstance()); Signal_uponTermination(Signal_GetInstance(), Signal_OnTerminate_For(this, ref(shutdown))); Server server = Server_new(HttpConnection_GetImpl(), &this->logger); try { Server_listen(&server, 8080); Logger_Info(&this->logger, $("Server started.")); } catch(SocketServer, AddressInUse) { Logger_Error(&this->logger, $("The address is already in use!")); excReturn false; } finally { } tryEnd; try { EventLoop_run(EventLoop_GetInstance()); } catchAny { Exception_Print(e); #if Exception_SaveTrace Backtrace_PrintTrace( Exception_GetTraceBuffer(), Exception_GetTraceLength()); #endif excReturn false; } finally { Server_destroy(&server); } tryEnd; return true; }