/* Open the handler for a new request */ static int openCgi(HttpQueue *q) { HttpConn *conn; Cgi *cgi; int nproc; conn = q->conn; if ((nproc = (int) httpMonitorEvent(conn, HTTP_COUNTER_ACTIVE_PROCESSES, 1)) >= conn->limits->processMax) { httpTrace(conn, "cgi.limit.error", "error", "msg=\"Too many concurrent processes\", activeProcesses=%d, maxProcesses=%d", nproc, conn->limits->processMax); httpError(conn, HTTP_CODE_SERVICE_UNAVAILABLE, "Server overloaded"); httpMonitorEvent(q->conn, HTTP_COUNTER_ACTIVE_PROCESSES, -1); return MPR_ERR_CANT_OPEN; } if ((cgi = mprAllocObj(Cgi, manageCgi)) == 0) { /* Normal mem handler recovery */ return MPR_ERR_MEMORY; } httpTrimExtraPath(conn); httpMapFile(conn); httpCreateCGIParams(conn); q->queueData = q->pair->queueData = cgi; cgi->conn = conn; cgi->readq = httpCreateQueue(conn, conn->http->cgiConnector, HTTP_QUEUE_RX, 0); cgi->writeq = httpCreateQueue(conn, conn->http->cgiConnector, HTTP_QUEUE_TX, 0); cgi->readq->pair = cgi->writeq; cgi->writeq->pair = cgi->readq; cgi->writeq->queueData = cgi->readq->queueData = cgi; return 0; }
/* Open handler for a new request */ static void openPhp(HttpQueue *q) { HttpRx *rx; rx = q->conn->rx; /* PHP will buffer all input. i.e. does not stream. The normal Limits still apply. */ q->max = q->pair->max = MAXINT; mprLog(5, "Open php handler"); httpTrimExtraPath(q->conn); if (rx->flags & (HTTP_OPTIONS | HTTP_TRACE)) { httpHandleOptionsTrace(q->conn, "DELETE,GET,HEAD,POST,PUT"); } else if (rx->flags & (HTTP_GET | HTTP_HEAD | HTTP_POST | HTTP_PUT)) { httpMapFile(q->conn, rx->route); if (!q->stage->stageData) { if (initializePhp(q->conn->http) < 0) { httpError(q->conn, HTTP_CODE_INTERNAL_SERVER_ERROR, "PHP initialization failed"); } q->stage->stageData = mprAlloc(1); } q->queueData = mprAllocObj(MaPhp, NULL); } else { httpError(q->conn, HTTP_CODE_BAD_METHOD, "Method not supported by file handler: %s", rx->method); } }