Added setting 'http_native_compression_disable_checksumming_on_decompress' [#METR-20784].

This commit is contained in:
Alexey Milovidov 2016-04-10 02:24:38 +03:00
parent f538e81c98
commit 42cb486bc1
5 changed files with 32 additions and 1 deletions

View File

@ -47,6 +47,10 @@ protected:
void * fixed_size_padding = nullptr;
#endif
/// Не проверять чексуммы.
bool disable_checksum = false;
/// Прочитать сжатые данные в compressed_buffer. Достать из их заголовка размер разжатых данных. Проверить чексумму.
/// Возвращает количество прочитанных байт.
size_t readCompressedData(size_t & size_decompressed, size_t & size_compressed_without_checksum)
@ -101,7 +105,7 @@ protected:
compressed_in->readStrict(&compressed_buffer[COMPRESSED_BLOCK_HEADER_SIZE], size_compressed - COMPRESSED_BLOCK_HEADER_SIZE);
}
if (checksum != CityHash128(&compressed_buffer[0], size_compressed))
if (!disable_checksum && checksum != CityHash128(&compressed_buffer[0], size_compressed))
throw Exception("Checksum doesn't match: corrupted data.", ErrorCodes::CHECKSUM_DOESNT_MATCH);
return size_compressed + sizeof(checksum);
@ -157,6 +161,15 @@ public:
delete qlz_state;
#endif
}
/** Не проверять чексуммы.
* Может использоваться, например, в тех случаях, когда сжатые данные пишет клиент,
* который не умеет вычислять чексуммы, и вместо этого заполняет их нулями или чем угодно.
*/
void disableChecksumming()
{
disable_checksum = true;
}
};
}

View File

@ -199,6 +199,10 @@ struct Settings
M(SettingBool, enable_http_compression, 0) \
/** Уровень сжатия - используется, если клиент по HTTP сказал, что он понимает данные, сжатые методом gzip или deflate */ \
M(SettingInt64, http_zlib_compression_level, 3) \
\
/** При разжатии данных POST от клиента, сжатых родным форматом, не проверять чексуммы */ \
M(SettingBool, http_native_compression_disable_checksumming_on_decompress, 0) \
\
/** Таймаут в секундах */ \
M(SettingUInt64, resharding_barrier_timeout, 300) \

View File

@ -142,9 +142,13 @@ void HTTPHandler::processQuery(Poco::Net::HTTPServerRequest & request, Poco::Net
/// Также данные могут быть сжаты несовместимым алгоритмом для внутреннего использования - это определяется параметром query_string.
SharedPtr<ReadBuffer> in_post_maybe_compressed;
bool in_post_compressed = false;
if (parse<bool>(params.get("decompress", "0")))
{
in_post_maybe_compressed = new CompressedReadBuffer(*in_post);
in_post_compressed = true;
}
else
in_post_maybe_compressed = in_post;
@ -231,6 +235,10 @@ void HTTPHandler::processQuery(Poco::Net::HTTPServerRequest & request, Poco::Net
if (client_supports_http_compression)
used_output.out->setCompressionLevel(context.getSettingsRef().http_zlib_compression_level);
/// Возможно, что выставлена настройка - не проверять чексуммы при разжатии данных от клиента, сжатых родным форматом.
if (in_post_compressed && context.getSettingsRef().http_native_compression_disable_checksumming_on_decompress)
static_cast<CompressedReadBuffer &>(*in_post_maybe_compressed).disableChecksumming();
context.setInterface(Context::Interface::HTTP);
Context::HTTPMethod http_method = Context::HTTPMethod::UNKNOWN;

View File

@ -0,0 +1,2 @@
1
1

View File

@ -0,0 +1,4 @@
#!/bin/bash
echo -ne '\x50\x74\x32\xf2\x59\xe9\x8a\xdb\x37\xc6\x4a\xa7\xfb\x22\xc4\x39''\x82\x13\x00\x00\x00\x09\x00\x00\x00''\x90SELECT 1\n' | curl -sS 'http://localhost:8123/?decompress=1' --data-binary @-
echo -ne 'xxxxxxxxxxxxxxxx''\x82\x13\x00\x00\x00\x09\x00\x00\x00''\x90SELECT 1\n' | curl -sS 'http://localhost:8123/?decompress=1&http_native_compression_disable_checksumming_on_decompress=1' --data-binary @-