EjsVar *ejsCreateException(Ejs *ejs, int slot, cchar *fmt, va_list fmtArgs) { EjsType *type; EjsVar *error; char *buf; if (ejs->exception) { buf = mprVasprintf(ejs, 0, fmt, fmtArgs); mprError(ejs, "Double exception: %s", buf); mprFree(buf); return ejs->exception; } if (!ejs->initialized || (ejs->flags & EJS_FLAG_EMPTY)) { buf = mprVasprintf(ejs, 0, fmt, fmtArgs); mprError(ejs, "Exception: %s", buf); mprFree(buf); return ejs->exception; } type = (EjsType*) ejsGetProperty(ejs, ejs->global, slot); if (type == 0) { type = ejs->errorType; } error = createException(ejs, type, fmt, fmtArgs); if (error) { ejsThrowException(ejs, error); } return error; }
/* * Create an exception object. */ static EjsVar *createException(Ejs *ejs, EjsType *type, cchar* fmt, va_list fmtArgs) { EjsVar *error, *argv[1]; char *msg; mprAssert(type); if (ejs->noExceptions) { return 0; } msg = mprVasprintf(ejs, -1, fmt, fmtArgs); argv[0] = (EjsVar*) ejsCreateString(ejs, msg); if (argv[0] == 0) { mprAssert(argv[0]); return 0; } error = (EjsVar*) ejsCreateInstance(ejs, type, 1, argv); if (error == 0) { mprAssert(error); return 0; } mprFree(msg); return error; }
int maWrite(MaQueue *q, cchar *fmt, ...) { va_list vargs; char *buf; int rc; va_start(vargs, fmt); buf = mprVasprintf(q, -1, fmt, vargs); va_end(vargs); rc = maWriteString(q, buf); mprFree(buf); return rc; }
/* * Add a response header */ static void setHeader(void *handle, bool allowMultiple, cchar *key, cchar *fmt, ...) { char *value; va_list vargs; va_start(vargs, fmt); value = mprVasprintf(mpr, EJS_MAX_HEADERS, fmt, vargs); if (allowMultiple) { mprAddDuplicateHash(responseHeaders, key, value); } else { mprAddHash(responseHeaders, key, value); } }
void error(void *handle, int code, cchar *fmt, ...) { va_list args; if (responseMsg == 0) { if (code == 0) { code = MPR_HTTP_CODE_BAD_GATEWAY; } responseCode = code; va_start(args, fmt); responseMsg = mprVasprintf(mpr, -1, fmt, args); va_end(args); } }
/* * Output a parse message */ static void xmlError(MprXml *xp, char *fmt, ...) { va_list args; char *buf; mprAssert(fmt); va_start(args, fmt); buf = mprVasprintf(xp, MPR_MAX_STRING, fmt, args); va_end(args); mprFree(xp->errMsg); xp->errMsg = mprAsprintf(xp, MPR_MAX_STRING, "XML error: %s\nAt line %d\n", buf, xp->lineNumber); mprFree(buf); }
void ejsSetWebHeader(Ejs *ejs, bool allowMultiple, cchar *key, cchar *fmt, ...) { EjsWeb *web; char *value; va_list vargs; mprAssert(ejs); web = ejsGetHandle(ejs); mprAssert(web->control->setHeader); va_start(vargs, fmt); value = mprVasprintf(web, -1, fmt, vargs); web->control->setHeader(web->handle, allowMultiple, key, value); }
/* * Return an error to the client */ void ejsWebError(Ejs *ejs, int code, cchar *fmt, ...) { EjsWeb *web; va_list args; char *buf; mprAssert(ejs); mprAssert(fmt); va_start(args, fmt); buf = mprVasprintf(ejs, -1, fmt, args); web = ejsGetHandle(ejs); if (web->control->error) { web->control->error(web->handle, code, buf); } mprFree(buf); va_end(args); }
int ejsWrite(Ejs *ejs, cchar *fmt, ...) { EjsWeb *web; va_list args; char *buf; int rc; mprAssert(ejs); mprAssert(fmt); web = ejsGetHandle(ejs); mprAssert(web->control->write); va_start(args, fmt); buf = mprVasprintf(web, -1, fmt, args); rc = web->control->write(web->handle, buf, (int) strlen(buf)); mprFree(buf); va_end(args); return rc; }
int mprPutFmtToBuf(MprBuf *bp, cchar *fmt, ...) { va_list ap; char *buf; int rc, space; if (fmt == 0) { return 0; } va_start(ap, fmt); space = mprGetBufSpace(bp); /* * Add max that the buffer can grow */ space += (bp->maxsize - bp->buflen); buf = mprVasprintf(bp, space, fmt, ap); rc = mprPutStringToBuf(bp, buf); mprFree(buf); va_end(ap); return rc; }
static void reportFailure(MaConn *conn, int code, cchar *fmt, va_list args) { MaResponse *resp; MaRequest *req; cchar *url, *status; char *emsg, *msg, *filename; mprAssert(fmt); if (conn->requestFailed) { return; } conn->requestFailed = 1; if (fmt == 0) { fmt = ""; } req = conn->request; resp = conn->response; maDontCacheResponse(conn); msg = mprVasprintf(conn, MA_BUFSIZE, fmt, args); if (resp == 0 || req == 0) { mprLog(conn, 2, "\"%s\", code %d: %s.", mprGetHttpCodeString(conn, code), code, msg); } else { resp->code = code; filename = resp->filename ? resp->filename : 0; /* 711 is a custom error used by the test suite. */ if (code != 711) { mprLog(resp, 2, "Error: \"%s\", code %d for URI \"%s\", file \"%s\": %s.", mprGetHttpCodeString(conn, code), code, req->url ? req->url : "", filename ? filename : "", msg); } /* * Use an error document rather than standard error boilerplate. */ if (req->location) { url = maLookupErrorDocument(req->location, code); if (url && *url) { maRedirect(conn, 302, url); mprFree(msg); return; } } /* * If the headers have already been filled, this alternate response body will be ignored. */ if (resp->altBody == 0) { status = mprGetHttpCodeString(conn, code); /* * For security, escape the message */ emsg = mprEscapeHtml(resp, msg); resp->altBody = mprAsprintf(resp, -1, "<!DOCTYPE html>\r\n" "<html><head><title>Document Error: %s</title></head>\r\n" "<body><h2>Access Error: %d -- %s</h2>\r\n<p>%s</p>\r\n</body>\r\n</html>\r\n", status, code, status, emsg); } resp->flags |= MA_RESP_NO_BODY; } mprFree(msg); }