//lint -e{818} void vtc_log(struct vtclog *vl, unsigned lvl, const char *fmt, ...) { CHECK_OBJ_NOTNULL(vl, VTCLOG_MAGIC); AZ(pthread_mutex_lock(&vl->mtx)); assert(lvl < NLEAD); vsb_clear(vl->vsb); vsb_printf(vl->vsb, "%s %-4s ", lead[lvl], vl->id); va_list ap; va_start(ap, fmt); (void)vsb_vprintf(vl->vsb, fmt, ap); va_end(ap); vsb_putc(vl->vsb, '\n'); vsb_finish(vl->vsb); AZ(vsb_overflowed(vl->vsb)); vtc_log_emit(vl, lvl); vsb_clear(vl->vsb); AZ(pthread_mutex_unlock(&vl->mtx)); if (lvl == 0) { vtc_error = 1; if (pthread_self() != vtc_thread) pthread_exit(NULL); } }
//lint -e{818} void vtc_dump(struct vtclog *vl, unsigned lvl, const char *pfx, const char *str) { int nl = 1; CHECK_OBJ_NOTNULL(vl, VTCLOG_MAGIC); assert(lvl < NLEAD); AZ(pthread_mutex_lock(&vl->mtx)); vsb_clear(vl->vsb); if (pfx == NULL) pfx = ""; if (str == NULL) vsb_printf(vl->vsb, "%s %-4s %s(null)\n", lead[lvl], vl->id, pfx); else for(; *str != '\0'; str++) { if (nl) { vsb_printf(vl->vsb, "%s %-4s %s| ", lead[lvl], vl->id, pfx); nl = 0; } if (*str == '\r') vsb_printf(vl->vsb, "\\r"); else if (*str == '\t') vsb_printf(vl->vsb, "\\t"); else if (*str == '\n') { vsb_printf(vl->vsb, "\\n\n"); nl = 1; } else if (*str < 0x20 || *str > 0x7e) vsb_printf(vl->vsb, "\\x%02x", *str); else vsb_printf(vl->vsb, "%c", *str); } if (!nl) vsb_printf(vl->vsb, "\n"); vsb_finish(vl->vsb); AZ(vsb_overflowed(vl->vsb)); vtc_log_emit(vl, lvl); vsb_clear(vl->vsb); AZ(pthread_mutex_unlock(&vl->mtx)); if (lvl == 0) { vtc_error = 1; if (pthread_self() != vtc_thread) pthread_exit(NULL); } }
static void cmd_http_chunkedlen(CMD_ARGS) { unsigned len; unsigned u, v; char buf[16384]; struct http *hp; (void)cmd; (void)vl; CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC); AN(av[1]); AZ(av[2]); vsb_clear(hp->vsb); len = atoi(av[1]); for (u = 0; u < sizeof buf; u++) buf[u] = (u & 7) + '0'; for (u = 0; u < len; u += 16384) { v = len - u; if (v > sizeof buf) v = sizeof buf; vsb_printf(hp->vsb, "%x%s", v, nl); vsb_printf(hp->vsb, "%*.*s%s", v, v, buf, nl); } vsb_printf(hp->vsb, "%x%s%s", 0, nl, nl); http_write(hp, 4, "chunked"); }
/* * Copy a string into an vsb. */ int vsb_cpy(struct vsb *s, const char *str) { assert_vsb_integrity(s); assert_vsb_state(s, 0); vsb_clear(s); return (vsb_cat(s, str)); }
/* * Copy a byte string into an vsb. */ int vsb_bcpy(struct vsb *s, const void *buf, size_t len) { assert_vsb_integrity(s); assert_vsb_state(s, 0); vsb_clear(s); return (vsb_bcat(s, buf, len)); }
static void cmd_http_chunked(CMD_ARGS) { struct http *hp; (void)cmd; (void)vl; CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC); AN(av[1]); AZ(av[2]); vsb_clear(hp->vsb); vsb_printf(hp->vsb, "%x%s%s%s", strlen(av[1]), nl, av[1], nl); http_write(hp, 4, "chunked"); }
static void cmd_http_txreq(CMD_ARGS) { struct http *hp; const char *req = "GET"; const char *url = "/"; const char *proto = "HTTP/1.1"; const char *body = NULL; (void)cmd; (void)vl; CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC); ONLY_CLIENT(hp, av); assert(!strcmp(av[0], "txreq")); av++; vsb_clear(hp->vsb); for(; *av != NULL; av++) { if (!strcmp(*av, "-url")) { url = av[1]; av++; } else if (!strcmp(*av, "-proto")) { proto = av[1]; av++; } else if (!strcmp(*av, "-req")) { req = av[1]; av++; } else break; } vsb_printf(hp->vsb, "%s %s %s%s", req, url, proto, nl); for(; *av != NULL; av++) { if (!strcmp(*av, "-hdr")) { vsb_printf(hp->vsb, "%s%s", av[1], nl); av++; } else break; } for(; *av != NULL; av++) { if (!strcmp(*av, "-body")) { AZ(body); body = av[1]; av++; } else if (!strcmp(*av, "-bodylen")) { AZ(body); body = synth_body(av[1]); av++; } else break; } if (*av != NULL) vtc_log(hp->vl, 0, "Unknown http txreq spec: %s\n", *av); if (body != NULL) vsb_printf(hp->vsb, "Content-Length: %d%s", strlen(body), nl); vsb_cat(hp->vsb, nl); if (body != NULL) { vsb_cat(hp->vsb, body); vsb_cat(hp->vsb, nl); } http_write(hp, 4, "txreq"); }
static void cmd_http_txresp(CMD_ARGS) { struct http *hp; const char *proto = "HTTP/1.1"; const char *status = "200"; const char *msg = "Ok"; int bodylen = 0; char *b, *c; char *body = NULL, *nullbody; int nolen = 0; (void)cmd; (void)vl; CAST_OBJ_NOTNULL(hp, priv, HTTP_MAGIC); ONLY_SERVER(hp, av); assert(!strcmp(av[0], "txresp")); av++; vsb_clear(hp->vsb); /* send a "Content-Length: 0" header unless something else happens */ REPLACE(body, ""); nullbody = body; for(; *av != NULL; av++) { if (!strcmp(*av, "-proto")) { proto = av[1]; av++; } else if (!strcmp(*av, "-status")) { status = av[1]; av++; } else if (!strcmp(*av, "-msg")) { msg = av[1]; av++; continue; } else break; } vsb_printf(hp->vsb, "%s %s %s%s", proto, status, msg, nl); for(; *av != NULL; av++) { if (!strcmp(*av, "-nolen")) { nolen = 1; } else if (!strcmp(*av, "-hdr")) { vsb_printf(hp->vsb, "%s%s", av[1], nl); av++; } else break; } for(; *av != NULL; av++) { if (!strcmp(*av, "-body")) { assert(body == nullbody); REPLACE(body, av[1]); AN(body); av++; bodylen = strlen(body); for (b = body; *b != '\0'; b++) { if(*b == '\\' && b[1] == '0') { *b = '\0'; for(c = b+1; *c != '\0'; c++) { *c = c[1]; } b++; bodylen--; } } } else if (!strcmp(*av, "-bodylen")) { assert(body == nullbody); body = synth_body(av[1]); bodylen = strlen(body); av++; } else break; } if (*av != NULL) vtc_log(hp->vl, 0, "Unknown http txresp spec: %s\n", *av); if (body != NULL && !nolen) vsb_printf(hp->vsb, "Content-Length: %d%s", bodylen, nl); vsb_cat(hp->vsb, nl); if (body != NULL) vsb_bcat(hp->vsb, body, bodylen); http_write(hp, 4, "txresp"); }
void vtc_logreset() { vsb_clear(vtclog_full); }