/* Accept incoming body data from the client destined for the CGI gateway. This is typically POST or PUT data. Note: For POST "form" requests, this will be called before the command is actually started. */ static void browserToCgiData(HttpQueue *q, HttpPacket *packet) { HttpConn *conn; Cgi *cgi; assert(q); assert(packet); if ((cgi = q->queueData) == 0) { return; } conn = q->conn; assert(q == conn->readq); if (httpGetPacketLength(packet) == 0) { /* End of input */ if (conn->rx->remainingContent > 0) { /* Short incoming body data. Just kill the CGI process */ if (cgi->cmd) { mprDestroyCmd(cgi->cmd); } httpError(conn, HTTP_CODE_BAD_REQUEST, "Client supplied insufficient body data"); } } httpPutForService(cgi->writeq, packet, HTTP_SCHEDULE_QUEUE); }
static void closeCgi(HttpQueue *q) { Cgi *cgi; MprCmd *cmd; if ((cgi = q->queueData) != 0) { cmd = cgi->cmd; if (cmd) { mprSetCmdCallback(cmd, NULL, NULL); mprDestroyCmd(cmd); cgi->cmd = 0; } httpMonitorEvent(q->conn, HTTP_COUNTER_ACTIVE_PROCESSES, -1); } }
static bool run(cchar *fmt, ...) { va_list args; MprCmd *cmd; char *out, *err; int rc; va_start(args, fmt); app->command = sfmtv(fmt, args); mprLog(1, "Run: %s", app->command); cmd = mprCreateCmd(NULL); rc = mprRunCmd(cmd, app->command, &out, &err, MANAGE_TIMEOUT, 0); app->error = sclone(err); app->output = sclone(out); mprDestroyCmd(cmd); va_end(args); return (rc != 0) ? 0 : 1; }
PUBLIC int espEmail(HttpConn *conn, cchar *to, cchar *from, cchar *subject, MprTime date, cchar *mime, cchar *message, MprList *files) { MprList *lines; MprCmd *cmd; cchar *body, *boundary, *contents, *encoded, *file; char *out, *err; ssize length; int i, next, status; if (!from || !*from) { from = "anonymous"; } if (!subject || !*subject) { subject = "Mail message"; } if (!mime || !*mime) { mime = "text/plain"; } if (!date) { date = mprGetTime(); } boundary = sjoin("esp.mail=", mprGetMD5("BOUNDARY"), NULL); lines = mprCreateList(0, 0); mprAddItem(lines, sfmt("To: %s", to)); mprAddItem(lines, sfmt("From: %s", from)); mprAddItem(lines, sfmt("Date: %s", mprFormatLocalTime(0, date))); mprAddItem(lines, sfmt("Subject: %s", subject)); mprAddItem(lines, "MIME-Version: 1.0"); mprAddItem(lines, sfmt("Content-Type: multipart/mixed; boundary=%s", boundary)); mprAddItem(lines, ""); boundary = sjoin("--", boundary, NULL); mprAddItem(lines, boundary); mprAddItem(lines, sfmt("Content-Type: %s", mime)); mprAddItem(lines, ""); mprAddItem(lines, ""); mprAddItem(lines, message); for (ITERATE_ITEMS(files, file, next)) { mprAddItem(lines, boundary); if ((mime = mprLookupMime(NULL, file)) == 0) { mime = "application/octet-stream"; } mprAddItem(lines, "Content-Transfer-Encoding: base64"); mprAddItem(lines, sfmt("Content-Disposition: inline; filename=\"%s\"", mprGetPathBase(file))); mprAddItem(lines, sfmt("Content-Type: %s; name=\"%s\"", mime, mprGetPathBase(file))); mprAddItem(lines, ""); contents = mprReadPathContents(file, &length); encoded = mprEncode64Block(contents, length); for (i = 0; i < length; i += 76) { mprAddItem(lines, snclone(&encoded[i], i + 76)); } } mprAddItem(lines, sfmt("%s--", boundary)); body = mprListToString(lines, "\n"); httpTraceContent(conn, "esp.email", "context", body, slen(body), 0); cmd = mprCreateCmd(conn->dispatcher); if (mprRunCmd(cmd, "sendmail -t", NULL, body, &out, &err, -1, 0) < 0) { mprDestroyCmd(cmd); return MPR_ERR_CANT_OPEN; } if (mprWaitForCmd(cmd, ME_ESP_EMAIL_TIMEOUT) < 0) { httpTrace(conn, "esp.email.error", "error", "msg=\"Timeout waiting for command to complete\", timeout=%d, command=\"%s\"", ME_ESP_EMAIL_TIMEOUT, cmd->argv[0]); mprDestroyCmd(cmd); return MPR_ERR_CANT_COMPLETE; } if ((status = mprGetCmdExitStatus(cmd)) != 0) { httpTrace(conn, "esp.email.error", "error", "msg=\"Sendmail failed\", status=%d, error=\"%s\"", status, err); mprDestroyCmd(cmd); return MPR_ERR_CANT_WRITE; } mprDestroyCmd(cmd); return 0; }