summaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
authorAlexander Færøy <ahf@torproject.org>2017-04-17 14:57:37 +0200
committerAlexander Færøy <ahf@torproject.org>2017-04-17 14:57:37 +0200
commit3c4459bcbf1d3a9da4a8b3a8bfed10d2e045af74 (patch)
tree2024be186cba95ece1fd6d7681568f741d12bf1f /src/or
parent44cb86adbe2e9b9fef7bf5fd64b52a8e44441be5 (diff)
downloadtor-3c4459bcbf1d3a9da4a8b3a8bfed10d2e045af74.tar.gz
tor-3c4459bcbf1d3a9da4a8b3a8bfed10d2e045af74.zip
Refactor the streaming compression code.
This patch refactors our streaming compression code to allow us to extend it with non-zlib/non-gzip based compression schemas. See https://bugs.torproject.org/21663
Diffstat (limited to 'src/or')
-rw-r--r--src/or/buffers.c20
-rw-r--r--src/or/buffers.h2
-rw-r--r--src/or/circuitlist.c4
-rw-r--r--src/or/connection.c2
-rw-r--r--src/or/directory.c14
-rw-r--r--src/or/dirserv.c2
-rw-r--r--src/or/or.h4
7 files changed, 25 insertions, 23 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c
index e559f80a1e..3490ce48a8 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -2088,11 +2088,11 @@ fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len)
}
/** Compress on uncompress the <b>data_len</b> bytes in <b>data</b> using the
- * zlib state <b>state</b>, appending the result to <b>buf</b>. If
+ * compression state <b>state</b>, appending the result to <b>buf</b>. If
* <b>done</b> is true, flush the data in the state and finish the
* compression/uncompression. Return -1 on failure, 0 on success. */
int
-write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
+write_to_buf_zlib(buf_t *buf, tor_compress_state_t *state,
const char *data, size_t data_len,
int done)
{
@@ -2108,20 +2108,22 @@ write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
}
next = CHUNK_WRITE_PTR(buf->tail);
avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail);
- switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) {
- case TOR_ZLIB_DONE:
+ switch (tor_compress_process(state, &next, &avail,
+ &data, &data_len, done)) {
+ case TOR_COMPRESS_DONE:
over = 1;
break;
- case TOR_ZLIB_ERR:
+ case TOR_COMPRESS_ERROR:
return -1;
- case TOR_ZLIB_OK:
+ case TOR_COMPRESS_OK:
if (data_len == 0)
over = 1;
break;
- case TOR_ZLIB_BUF_FULL:
+ case TOR_COMPRESS_BUFFER_FULL:
if (avail) {
- /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk
- * automatically, whether were going to or not. */
+ /* The compression module says we need more room
+ * (TOR_COMPRESS_BUFFER_FULL). Start a new chunk automatically,
+ * whether were going to or not. */
need_new_chunk = 1;
}
break;
diff --git a/src/or/buffers.h b/src/or/buffers.h
index c6a5ffaad5..49a2ae49bc 100644
--- a/src/or/buffers.h
+++ b/src/or/buffers.h
@@ -36,7 +36,7 @@ int flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen);
int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen);
int write_to_buf(const char *string, size_t string_len, buf_t *buf);
-int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state,
+int write_to_buf_zlib(buf_t *buf, tor_compress_state_t *state,
const char *data, size_t data_len, int done);
int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen);
int fetch_from_buf(char *string, size_t string_len, buf_t *buf);
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 80bb7f69f3..4f11586373 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -1991,8 +1991,8 @@ single_conn_free_bytes(connection_t *conn)
if (conn->type == CONN_TYPE_DIR) {
dir_connection_t *dir_conn = TO_DIR_CONN(conn);
if (dir_conn->zlib_state) {
- result += tor_zlib_state_size(dir_conn->zlib_state);
- tor_zlib_free(dir_conn->zlib_state);
+ result += tor_compress_state_size(dir_conn->zlib_state);
+ tor_compress_free(dir_conn->zlib_state);
dir_conn->zlib_state = NULL;
}
}
diff --git a/src/or/connection.c b/src/or/connection.c
index 09e316d214..ad97c3bc2a 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -628,7 +628,7 @@ connection_free_(connection_t *conn)
dir_connection_t *dir_conn = TO_DIR_CONN(conn);
tor_free(dir_conn->requested_resource);
- tor_zlib_free(dir_conn->zlib_state);
+ tor_compress_free(dir_conn->zlib_state);
if (dir_conn->spool) {
SMARTLIST_FOREACH(dir_conn->spool, spooled_resource_t *, spooled,
spooled_resource_free(spooled));
diff --git a/src/or/directory.c b/src/or/directory.c
index e7a71dde15..5ae61e470f 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -3178,7 +3178,7 @@ handle_get_current_consensus(dir_connection_t *conn,
write_http_response_header(conn, -1, compressed,
smartlist_len(conn->spool) == 1 ? lifetime : 0);
if (! compressed)
- conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
+ conn->zlib_state = tor_compress_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
/* Prime the connection with some data. */
const int initial_flush_result = connection_dirserv_flushed_some(conn);
@@ -3276,8 +3276,8 @@ handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args)
if (smartlist_len(items)) {
if (compressed) {
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
- choose_compression_level(estimated_len));
+ conn->zlib_state = tor_compress_new(1, ZLIB_METHOD,
+ choose_compression_level(estimated_len));
SMARTLIST_FOREACH(items, const char *, c,
connection_write_to_buf_zlib(c, strlen(c), conn, 0));
connection_write_to_buf_zlib("", 0, conn, 1);
@@ -3335,7 +3335,7 @@ handle_get_microdesc(dir_connection_t *conn, const get_handler_args_t *args)
write_http_response_header(conn, -1, compressed, MICRODESC_CACHE_LIFETIME);
if (compressed)
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
+ conn->zlib_state = tor_compress_new(1, ZLIB_METHOD,
choose_compression_level(size_guess));
const int initial_flush_result = connection_dirserv_flushed_some(conn);
@@ -3428,7 +3428,7 @@ handle_get_descriptor(dir_connection_t *conn, const get_handler_args_t *args)
}
write_http_response_header(conn, -1, compressed, cache_lifetime);
if (compressed)
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
+ conn->zlib_state = tor_compress_new(1, ZLIB_METHOD,
choose_compression_level(size_guess));
clear_spool = 0;
/* Prime the connection with some data. */
@@ -3519,8 +3519,8 @@ handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args)
write_http_response_header(conn, compressed?-1:len, compressed, 60*60);
if (compressed) {
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
- choose_compression_level(len));
+ conn->zlib_state = tor_compress_new(1, ZLIB_METHOD,
+ choose_compression_level(len));
SMARTLIST_FOREACH(certs, authority_cert_t *, c,
connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body,
c->cache_info.signed_descriptor_len,
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 87afd69aba..186478c1c7 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -3792,7 +3792,7 @@ connection_dirserv_flushed_some(dir_connection_t *conn)
/* Flush the zlib state: there could be more bytes pending in there, and
* we don't want to omit bytes. */
connection_write_to_buf_zlib("", 0, conn, 1);
- tor_zlib_free(conn->zlib_state);
+ tor_compress_free(conn->zlib_state);
conn->zlib_state = NULL;
}
return 0;
diff --git a/src/or/or.h b/src/or/or.h
index a7b3a66561..6aec5882b0 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1773,8 +1773,8 @@ typedef struct dir_connection_t {
/** List of spooled_resource_t for objects that we're spooling. We use
* it from back to front. */
smartlist_t *spool;
- /** The zlib object doing on-the-fly compression for spooled data. */
- tor_zlib_state_t *zlib_state;
+ /** The compression object doing on-the-fly compression for spooled data. */
+ tor_compress_state_t *zlib_state;
/** What rendezvous service are we querying for? */
rend_data_t *rend_data;