diff --git a/mongoose.c b/mongoose.c
index cde68d3e0182fefb4b6ff3d63f782ab4ebfaec5c..81f4837c6b79a90caba46577d26078210070f71b 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -2282,33 +2282,22 @@ void mg_send_data(struct mg_connection *c, const void *data, int data_len) {
 
 void mg_printf_data(struct mg_connection *c, const char *fmt, ...) {
   struct connection *conn = MG_CONN_2_CONN(c);
-  struct iobuf *io = &conn->ns_conn->send_iobuf;
   va_list ap;
-  int len, n, iolen;
-  char *p;
+  int len;
+  char mem[IOBUF_SIZE], *buf = mem;
 
   terminate_headers(c);
 
-  // Remember original io->len
-  iolen = io->len;
-  // Write the placeholder for the chunk size
-  p = io->buf + io->len;
-  iobuf_append(io, "        \r\n", 10);
-
-  // Write chunk itself
   va_start(ap, fmt);
-  len = ns_vprintf(conn->ns_conn, fmt, ap);
+  len = ns_avprintf(&buf, sizeof(mem), fmt, ap);
   va_end(ap);
 
-  // Recalculate pointer p because of potential realloc within iobuf_append
-  p = io->buf + iolen;
-
-  // Record size
-  n = mg_snprintf(p, 7, "%X", len);
-  p[n] = ' ';
-
-  // Write terminating new line
-  mg_write(c, "\r\n", 2);
+  if (len > 0) {
+    write_chunk((struct connection *) conn, buf, len);
+  }
+  if (buf != mem && buf != NULL) {
+    free(buf);
+  }
 }
 
 #if !defined(MONGOOSE_NO_WEBSOCKET) || !defined(MONGOOSE_NO_AUTH)