/* This will restart the default server on a new IP:PORT. It will stop listening on the default endpoint on the default server, optionally modify the IP:PORT and resume listening. NOTE: running requests will be unaffected. WARNING: this is demonstration code and has no error checking. */ void maRestartServer(cchar *ip, int port) { MaAppweb *appweb; MaServer *server; HttpEndpoint *endpoint; appweb = MPR->appwebService; server = mprGetFirstItem(appweb->servers); lock(appweb->servers); endpoint = mprGetFirstItem(server->endpoints); httpStopEndpoint(endpoint); /* Alternatively, iterate over all endpoints by Http *http = MPR->httpService; int next; for (ITERATE_ITEMS(http->endpoints, endpoint, next)) { ... } */ if (port) { endpoint->port = port; } if (ip) { endpoint->ip = sclone(ip); } httpStartEndpoint(endpoint); unlock(appweb->servers); }
void httpSetEndpointAddress(HttpEndpoint *endpoint, cchar *ip, int port) { if (ip) { endpoint->ip = sclone(ip); } if (port >= 0) { endpoint->port = port; } if (endpoint->sock) { httpStopEndpoint(endpoint); httpStartEndpoint(endpoint); } }
static void restart() { MaAppweb *appweb; MaServer *server; HttpEndpoint *endpoint; render("Restarting"); flush(); finalize(); appweb = MPR->appwebService; server = mprGetFirstItem(appweb->servers); endpoint = mprGetFirstItem(server->endpoints); httpStopEndpoint(endpoint); endpoint->port = 5555; httpStartEndpoint(endpoint); print("RESTARTING ON PORT 5555"); }
PUBLIC int httpStartEndpoints() { HttpEndpoint *endpoint; int next; if (!HTTP) { return MPR_ERR_BAD_STATE; } for (ITERATE_ITEMS(HTTP->endpoints, endpoint, next)) { if (httpStartEndpoint(endpoint) < 0) { return MPR_ERR_CANT_OPEN; } } if (httpApplyUserGroup() < 0) { httpStopEndpoints(); return MPR_ERR_CANT_OPEN; } return 0; }
/* This will restart the default server on a new IP:PORT. It will stop listening on the default endpoint on the default server, optionally modify the IP:PORT and resume listening. NOTE: running requests will be unaffected. WARNING: this is demonstration code and has no error checking. */ PUBLIC void maRestartServer(cchar *ip, int port) { MaAppweb *appweb; MaServer *server; HttpEndpoint *endpoint; appweb = MPR->appwebService; server = mprGetFirstItem(appweb->servers); lock(appweb->servers); endpoint = mprGetFirstItem(server->endpoints); httpStopEndpoint(endpoint); if (port) { endpoint->port = port; } if (ip) { endpoint->ip = sclone(ip); } httpStartEndpoint(endpoint); unlock(appweb->servers); }
PUBLIC int maStartServer(MaServer *server) { HttpEndpoint *endpoint; int next, count, warned; warned = 0; count = 0; for (next = 0; (endpoint = mprGetNextItem(server->endpoints, &next)) != 0; ) { if (httpStartEndpoint(endpoint) < 0) { warned++; break; } else { count++; } } if (count == 0) { if (!warned) { mprError("Server is not listening on any addresses"); } return MPR_ERR_CANT_OPEN; } if (warned) { return MPR_ERR_CANT_OPEN; } #if BIT_UNIX_LIKE MaAppweb *appweb = server->appweb; if (appweb->userChanged || appweb->groupChanged) { if (!smatch(MPR->logPath, "stdout") && !smatch(MPR->logPath, "stderr")) { if (chown(MPR->logPath, appweb->uid, appweb->gid) < 0) { mprError("Cannot change ownership on %s", MPR->logPath); } } } if (maApplyChangedGroup(appweb) < 0 || maApplyChangedUser(appweb) < 0) { return MPR_ERR_CANT_COMPLETE; } #endif return 0; }
/* function listen(endpoint): Void An endpoint can be either a "port" or "ip:port", or null. If hosted, this call does little -- just add to the ejs->httpServers list. */ static EjsVoid *hs_listen(Ejs *ejs, EjsHttpServer *sp, int argc, EjsObj **argv) { HttpEndpoint *endpoint; HttpHost *host; HttpRoute *route; EjsString *address; EjsObj *loc; EjsPath *documents; if (!sp->hosted) { loc = (argc >= 1) ? argv[0] : ESV(null); if (loc != ESV(null)) { address = ejsToString(ejs, loc); // TODO should permit https://IP:PORT mprParseSocketAddress(address->value, &sp->ip, &sp->port, NULL, 0); } else { address = 0; } if (address == 0) { ejsThrowArgError(ejs, "Missing listen endpoint"); return 0; } if (sp->endpoint) { httpDestroyEndpoint(sp->endpoint); sp->endpoint = 0; } /* The endpoint uses the ejsDispatcher. This is VERY important. All connections will inherit this also. This serializes all activity on one dispatcher. */ if ((endpoint = httpCreateEndpoint(sp->ip, sp->port, ejs->dispatcher)) == 0) { ejsThrowIOError(ejs, "Cannot create Http endpoint object"); return 0; } sp->endpoint = endpoint; host = httpCreateHost(NULL); httpSetHostName(host, sfmt("%s:%d", sp->ip, sp->port)); route = httpCreateConfiguredRoute(host, 1); httpAddRouteMethods(route, "DELETE, HEAD, OPTIONS, PUT"); httpAddRouteHandler(route, "ejsHandler", ""); httpSetRouteTarget(route, "run", 0); httpFinalizeRoute(route); httpSetHostDefaultRoute(host, route); httpAddHostToEndpoint(endpoint, host); if (sp->limits) { ejsSetHttpLimits(ejs, endpoint->limits, sp->limits, 1); } if (sp->incomingStages || sp->outgoingStages || sp->connector) { setHttpPipeline(ejs, sp); } if (sp->ssl) { httpSecureEndpoint(endpoint, sp->ssl); } if (sp->name) { httpSetHostName(host, sp->name); } httpSetSoftware(EJS_HTTPSERVER_NAME); httpSetEndpointAsync(endpoint, sp->async); httpSetEndpointContext(endpoint, sp); httpSetEndpointNotifier(endpoint, stateChangeNotifier); /* This is only required when http is using non-ejs handlers and/or filters */ documents = ejsGetProperty(ejs, sp, ES_ejs_web_HttpServer_documents); if (ejsIs(ejs, documents, Path)) { httpSetRouteDocuments(route, documents->value); } #if KEEP // TODO -- what to do with home? // TODO - if removed, then the "home" property should be removed? home = ejsGetProperty(ejs, sp, ES_ejs_web_HttpServer_home); if (ejsIs(ejs, home, Path)) { httpSetRoutDir(host, home->value); } #endif if (httpStartEndpoint(endpoint) < 0) { httpDestroyEndpoint(sp->endpoint); sp->endpoint = 0; ejsThrowIOError(ejs, "Cannot listen on %s", address->value); } } if (ejs->httpServers == 0) { ejs->httpServers = mprCreateList(-1, MPR_LIST_STATIC_VALUES); } /* Remove to make sure old listening() registrations are removed */ mprRemoveItem(ejs->httpServers, sp); mprAddItem(ejs->httpServers, sp); return 0; }