static void mod_deflate_note_ratio(server *srv, connection *con, handler_ctx *hctx) { /* store compression ratio in con->environment * for possible logging by mod_accesslog * (late in response handling, so not seen by most other modules) */ /*(should be called only at end of successful response compression)*/ char ratio[LI_ITOSTRING_LENGTH]; if (0 == hctx->bytes_in) return; li_itostrn(ratio, sizeof(ratio), hctx->bytes_out * 100 / hctx->bytes_in); array_set_key_value(con->environment, CONST_STR_LEN("ratio"), ratio, strlen(ratio)); UNUSED(srv); }
/* buffer must be able to hold "999.9K" * conversion is simple but not perfect */ static int http_list_directory_sizefmt(char *buf, size_t bufsz, off_t size) { const char unit[] = " KMGTPE"; /* Kilo, Mega, Giga, Tera, Peta, Exa */ const char *u = unit; /* u will always increment at least once */ int remain; size_t buflen; if (size < 100) size += 99; if (size < 100) size = 0; while (1) { remain = (int) size & 1023; size >>= 10; u++; if ((size & (~0 ^ 1023)) == 0) break; } remain /= 100; if (remain > 9) remain = 9; if (size > 999) { size = 0; remain = 9; u++; } li_itostrn(buf, bufsz, size); buflen = strlen(buf); if (buflen + 3 >= bufsz) return buflen; buf[buflen+0] = '.'; buf[buflen+1] = remain + '0'; buf[buflen+2] = *u; buf[buflen+3] = '\0'; return buflen + 3; }
void li_itostr(char *buf, intmax_t val) { li_itostrn(buf, LI_ITOSTRING_LENGTH, val); }