mirror of
https://gitlab.com/gnuwget/wget2.git
synced 2026-02-01 04:10:48 +00:00
410 lines
10 KiB
C
410 lines
10 KiB
C
/*
|
|
* Copyright (c) 2018-2023 Free Software Foundation, Inc.
|
|
*
|
|
* This file is part of Wget
|
|
*
|
|
* Wget is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Wget is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Wget If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <string.h>
|
|
#include <stdlib.h> // exit()
|
|
#include "libtest.h"
|
|
|
|
#define uncompressed_body "x"
|
|
|
|
#define GZIP "\x1f\x8b\x08\x08\x48\x5d\x91\x5a\x00\x03\x78\x00\xab\x00\x00\x83\x16\xdc\x8c\x01\x00\x00\x00" // gzip
|
|
#define DEFLATE "\x78\x9c\xab\x00\x00\x00\x79\x00\x79" // deflate
|
|
#define BZIP2 "\x42\x5a\x68\x39\x31\x41\x59\x26\x53\x59\x77\x4b\xb0\x14\x00\x00\x00\x00\x80\x00\x40\x20\x00\x21\x18\x46\x82\xee\x48\xa7\x0a\x12\x0e\xe9\x76\x02\x80" // bzip2
|
|
#define XZ "\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21\x01\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x00\x78\x00\x00\x00\x00\x45\xae\xef\x83\xf8\xee\x16\x0a\x00\x01\x19\x01\xa5\x2c\x81\xcc\x1f\xb6\xf3\x7d\x01\x00\x00\x00\x00\x04\x59\x5a" // xz
|
|
#define LZMA "\x5d\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x3c\x41\xfb\xff\xff\xff\xe0\x00\x00\x00" // lzma
|
|
#define BR "\x21\x00\x00\x04\x78\x03" // br
|
|
#define ZSTD "\x28\xb5\x2f\xfd\x24\x01\x09\x00\x00\x78\x23\x11\x04\x83"
|
|
#define LZIP "\x4c\x5a\x49\x50\x01\x0c\x00\x3c\x41\xfb\xff\xff\xff\xe0\x00\x00\x00\x83\x16\xdc\x8c\x01\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00"
|
|
|
|
typedef struct {
|
|
const char* body;
|
|
size_t body_len;
|
|
const char* type;
|
|
bool with_lib;
|
|
} compression_test_t;
|
|
|
|
#define KNOWN_TYPES countof(compressions)
|
|
|
|
int main(void)
|
|
{
|
|
compression_test_t compressions[] = {
|
|
{ .body = GZIP,
|
|
.body_len = sizeof(GZIP) - 1,
|
|
.type = "gzip",
|
|
.with_lib =
|
|
#ifdef WITH_ZLIB
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = DEFLATE,
|
|
.body_len = sizeof(DEFLATE) - 1,
|
|
.type = "deflate",
|
|
.with_lib =
|
|
#ifdef WITH_ZLIB
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = BZIP2,
|
|
.body_len = sizeof(BZIP2) - 1,
|
|
.type = "bzip2",
|
|
.with_lib =
|
|
#ifdef WITH_BZIP2
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = XZ,
|
|
.body_len = sizeof(XZ) - 1,
|
|
.type = "xz",
|
|
.with_lib =
|
|
#ifdef WITH_LZMA
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = LZMA,
|
|
.body_len = sizeof(LZMA) - 1,
|
|
.type = "lzma",
|
|
.with_lib =
|
|
#ifdef WITH_LZMA
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = BR,
|
|
.body_len = sizeof(BR) - 1,
|
|
.type = "br",
|
|
.with_lib =
|
|
#ifdef WITH_BROTLIDEC
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = ZSTD,
|
|
.body_len = sizeof(ZSTD) - 1,
|
|
.type = "zstd",
|
|
.with_lib =
|
|
#ifdef WITH_ZSTD
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
{ .body = LZIP,
|
|
.body_len = sizeof(LZIP) - 1,
|
|
.type = "lzip",
|
|
.with_lib =
|
|
#ifdef WITH_LZIP
|
|
true,
|
|
#else
|
|
false,
|
|
#endif
|
|
},
|
|
};
|
|
|
|
wget_test_url_t urls[] = {
|
|
{ .name = "/gzip.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[0].body,
|
|
.body_len = compressions[0].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: gzip",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: gzip"
|
|
}
|
|
},
|
|
{ .name = "/deflate.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[1].body,
|
|
.body_len = compressions[1].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: deflate",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: deflate"
|
|
}
|
|
},
|
|
{ .name = "/bzip2.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[2].body,
|
|
.body_len = compressions[2].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: bzip2",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: bzip2"
|
|
}
|
|
},
|
|
{ .name = "/xz.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[3].body,
|
|
.body_len = compressions[3].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: xz",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: xz"
|
|
}
|
|
},
|
|
{ .name = "/lzma.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[4].body,
|
|
.body_len = compressions[4].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: lzma",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: lzma"
|
|
}
|
|
},
|
|
{ .name = "/br.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[5].body,
|
|
.body_len = compressions[5].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: br",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: br"
|
|
}
|
|
},
|
|
{ .name = "/zstd.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[6].body,
|
|
.body_len = compressions[6].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: zstd",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: zstd"
|
|
}
|
|
},
|
|
{ .name = "/lzip.html",
|
|
.code = "200 Dontcare",
|
|
.body = compressions[7].body,
|
|
.body_len = compressions[7].body_len,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
"Content-Encoding: lzip",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: lzip"
|
|
}
|
|
},
|
|
{ .name = "/identity.html",
|
|
.code = "200 Dontcare",
|
|
.body = uncompressed_body,
|
|
.body_len = sizeof(uncompressed_body) - 1,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
},
|
|
.expected_req_headers = {
|
|
"Accept-Encoding: identity"
|
|
}
|
|
},
|
|
{ .name = "/no_compression.html",
|
|
.code = "200 Dontcare",
|
|
.body = uncompressed_body,
|
|
.body_len = sizeof(uncompressed_body) - 1,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
},
|
|
.unexpected_req_headers = {
|
|
"Accept-Encoding"
|
|
}
|
|
},
|
|
{ .name = "/combination.html",
|
|
.code = "200 Dontcare",
|
|
.body = uncompressed_body,
|
|
.body_len = sizeof(uncompressed_body) - 1,
|
|
.headers = {
|
|
"Content-Type: text/html",
|
|
},
|
|
.expected_req_headers = {
|
|
#if defined WITH_BROTLIDEC && defined WITH_LZMA && defined WITH_ZLIB
|
|
"Accept-Encoding: identity, br, lzma, gzip"
|
|
#else
|
|
"Accept-Encoding: identity"
|
|
#endif
|
|
}
|
|
},
|
|
};
|
|
|
|
// functions won't come back if an error occurs
|
|
wget_test_start_server(
|
|
WGET_TEST_RESPONSE_URLS, &urls, countof(urls),
|
|
WGET_TEST_FEATURE_MHD,
|
|
0);
|
|
|
|
// test all compression types
|
|
for (unsigned int i = 0; i < KNOWN_TYPES; i++) {
|
|
char test_option[64];
|
|
wget_snprintf(test_option, sizeof(test_option), "--compression=%s", compressions[i].type);
|
|
|
|
if (compressions[i].with_lib)
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, test_option,
|
|
WGET_TEST_REQUEST_URL, urls[i].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[i].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
else
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, test_option,
|
|
WGET_TEST_REQUEST_URL, urls[i].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 2,
|
|
0);
|
|
}
|
|
|
|
// test none
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=none",
|
|
WGET_TEST_REQUEST_URL, urls[8].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[8].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
|
|
// test identity
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=identity",
|
|
WGET_TEST_REQUEST_URL, urls[8].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[8].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
|
|
// test no "Accept-Encoding"
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--no-compression",
|
|
WGET_TEST_REQUEST_URL, urls[9].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[9].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
|
|
// test invalid type
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=identity,something",
|
|
WGET_TEST_REQUEST_URL, urls[1].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 2,
|
|
0);
|
|
|
|
// test set Accept-Encoding to a custom/unknown value
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--no-compression --header=\"Accept-Encoding: identity\"",
|
|
WGET_TEST_REQUEST_URL, urls[8].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[8].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
|
|
// test --compression override
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--no-compression --compression=identity",
|
|
WGET_TEST_REQUEST_URL, urls[8].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[8].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
|
|
// test --no-compression override
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=identity --no-compression",
|
|
WGET_TEST_REQUEST_URL, urls[9].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[9].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
0);
|
|
|
|
// test combination
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=identity,br,lzma,gzip",
|
|
WGET_TEST_REQUEST_URL, urls[10].name + 1,
|
|
#if defined WITH_BROTLIDEC && defined WITH_LZMA && defined WITH_ZLIB
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[10].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
#else
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 2,
|
|
#endif
|
|
0);
|
|
|
|
// test override
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=br --compression=gzip",
|
|
WGET_TEST_REQUEST_URL, urls[0].name + 1,
|
|
#if defined WITH_BROTLIDEC && defined WITH_ZLIB
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 0,
|
|
WGET_TEST_EXPECTED_FILES, &(wget_test_file_t []) {
|
|
{ urls[0].name + 1, uncompressed_body },
|
|
{ NULL } },
|
|
#else
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 2,
|
|
#endif
|
|
0);
|
|
|
|
// test duplication
|
|
wget_test(
|
|
// WGET_TEST_KEEP_TMPFILES, 1,
|
|
WGET_TEST_OPTIONS, "--compression=identity,identity",
|
|
WGET_TEST_REQUEST_URL, urls[10].name + 1,
|
|
WGET_TEST_EXPECTED_ERROR_CODE, 2,
|
|
0);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
}
|