diff --git a/changes/ticket28816 b/changes/ticket28816
new file mode 100644
index 0000000000..02878ccfdc
--- /dev/null
+++ b/changes/ticket28816
@@ -0,0 +1,4 @@
+ o Code simplification and refactoring:
+ - Introduce a connection_dir_buf_add() helper function that checks for
+ compress_state of dir_connection_t and automatically writes a string to
+ directory connection with or without compression. Resolves issue 28816.
diff --git a/changes/ticket29897 b/changes/ticket29897
new file mode 100644
index 0000000000..232a79fbce
--- /dev/null
+++ b/changes/ticket29897
@@ -0,0 +1,3 @@
+ o Code simplification and refactoring:
+ - Refactor handle_get_next_bandwidth() to use connection_dir_buf_add().
+ Implements ticket 29897.
diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c
index c8b19344bd..7f2e96b4d1 100644
--- a/src/core/mainloop/connection.c
+++ b/src/core/mainloop/connection.c
@@ -4341,6 +4341,23 @@ connection_write_to_buf_impl_,(const char *string, size_t len,
connection_write_to_buf_commit(conn, written);
}
+/**
+ * Write a string (of size len to directory connection
+ * dir_conn. Apply compression if connection is configured to use
+ * it and finalize it if done is true.
+ */
+void
+connection_dir_buf_add(const char *string, size_t len,
+ dir_connection_t *dir_conn, int done)
+{
+ if (dir_conn->compress_state != NULL) {
+ connection_buf_add_compress(string, len, dir_conn, done);
+ return;
+ }
+
+ connection_buf_add(string, len, TO_CONN(dir_conn));
+}
+
void
connection_buf_add_compress(const char *string, size_t len,
dir_connection_t *conn, int done)
diff --git a/src/core/mainloop/connection.h b/src/core/mainloop/connection.h
index 411f13a8b8..c93f1ef8e8 100644
--- a/src/core/mainloop/connection.h
+++ b/src/core/mainloop/connection.h
@@ -226,6 +226,8 @@ MOCK_DECL(void, connection_write_to_buf_impl_,
/* DOCDOC connection_write_to_buf */
static void connection_buf_add(const char *string, size_t len,
connection_t *conn);
+void connection_dir_buf_add(const char *string, size_t len,
+ dir_connection_t *dir_conn, int done);
static inline void
connection_buf_add(const char *string, size_t len, connection_t *conn)
{
diff --git a/src/feature/dircache/dircache.c b/src/feature/dircache/dircache.c
index caa085dd63..62eb4c86c2 100644
--- a/src/feature/dircache/dircache.c
+++ b/src/feature/dircache/dircache.c
@@ -1486,13 +1486,10 @@ handle_get_next_bandwidth(dir_connection_t *conn,
conn->compress_state = tor_compress_new(1, compress_method,
choose_compression_level(len/2));
log_debug(LD_DIR, "Compressing bandwidth file.");
- connection_buf_add_compress(bandwidth, len, conn, 0);
- /* Flush the compression state. */
- connection_buf_add_compress("", 0, conn, 1);
} else {
log_debug(LD_DIR, "Not compressing bandwidth file.");
- connection_buf_add(bandwidth, len, TO_CONN(conn));
}
+ connection_dir_buf_add((const char*)bandwidth, len, conn, 1);
tor_free(bandwidth);
return 0;
}