aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-04-25 14:51:44 -0400
committerNick Mathewson <nickm@torproject.org>2017-04-25 16:47:46 -0400
commit0274ea749a6a1456d905878730c226985db183ad (patch)
tree840e6b19a338e791005ff09073af237ef6e249db
parentd4a2decc56cc5328c8edfde2cc512efd844cc32b (diff)
downloadtor-0274ea749a6a1456d905878730c226985db183ad.tar.gz
tor-0274ea749a6a1456d905878730c226985db183ad.zip
Function to convert compression methods to/from strings.
-rw-r--r--src/common/compress.c43
-rw-r--r--src/common/compress.h2
2 files changed, 45 insertions, 0 deletions
diff --git a/src/common/compress.c b/src/common/compress.c
index 5a3359aa05..72669391bb 100644
--- a/src/common/compress.c
+++ b/src/common/compress.c
@@ -277,6 +277,49 @@ tor_compress_supports_method(compress_method_t method)
}
}
+/** Table of compression method names. These should have an "x-" prefix,
+ * if they are not listed in the IANA content coding registry. */
+static const struct {
+ const char *name;
+ compress_method_t method;
+} compression_method_names[] = {
+ { "gzip", GZIP_METHOD },
+ { "deflate", ZLIB_METHOD },
+ { "x-lzma2", LZMA_METHOD },
+ { "x-zstd" , ZSTD_METHOD },
+ { "identity", NO_METHOD },
+
+ /* Later entries in this table are not canonical; these are recognized but
+ * not emitted. */
+ { "x-gzip", GZIP_METHOD },
+};
+
+/** Return the canonical string representation of the compression method
+ * <b>method</b>, or NULL if the method isn't recognized. */
+const char *
+compression_method_get_name(compress_method_t method)
+{
+ unsigned i;
+ for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) {
+ if (method == compression_method_names[i].method)
+ return compression_method_names[i].name;
+ }
+ return NULL;
+}
+
+/** Return the compression method represented by the string <b>name</b>, or
+ * UNKNOWN_METHOD if the string isn't recognized. */
+compress_method_t
+compression_method_get_by_name(const char *name)
+{
+ unsigned i;
+ for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) {
+ if (!strcmp(compression_method_names[i].name, name))
+ return compression_method_names[i].method;
+ }
+ return UNKNOWN_METHOD;
+}
+
/** Return a string representation of the version of the library providing the
* compression method given in <b>method</b>. Returns NULL if <b>method</b> is
* unknown or unsupported. */
diff --git a/src/common/compress.h b/src/common/compress.h
index cb5caeaf07..95b70c02ec 100644
--- a/src/common/compress.h
+++ b/src/common/compress.h
@@ -48,6 +48,8 @@ compress_method_t detect_compression_method(const char *in, size_t in_len);
int tor_compress_is_compression_bomb(size_t size_in, size_t size_out);
int tor_compress_supports_method(compress_method_t method);
+const char * compression_method_get_name(compress_method_t method);
+compress_method_t compression_method_get_by_name(const char *name);
const char *tor_compress_version_str(compress_method_t method);