mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 00:52:02 +00:00
Added setting 'enable_http_compression' [#METR-20041].
This commit is contained in:
parent
93c5ba2d4d
commit
9e81f3eea0
@ -102,6 +102,15 @@ public:
|
|||||||
sendHeaders();
|
sendHeaders();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Включить или отключить сжатие.
|
||||||
|
* Работает только перед тем, как были отправлены HTTP заголовки.
|
||||||
|
* Иначе - не имеет эффекта.
|
||||||
|
*/
|
||||||
|
void setCompression(bool enable_compression)
|
||||||
|
{
|
||||||
|
compress = enable_compression;
|
||||||
|
}
|
||||||
|
|
||||||
/** Установить уровень сжатия, если данные будут сжиматься.
|
/** Установить уровень сжатия, если данные будут сжиматься.
|
||||||
* Работает только перед тем, как были отправлены HTTP заголовки.
|
* Работает только перед тем, как были отправлены HTTP заголовки.
|
||||||
* Иначе - не имеет эффекта.
|
* Иначе - не имеет эффекта.
|
||||||
|
@ -193,6 +193,8 @@ struct Settings
|
|||||||
/** В целях тестирования exception safety - кидать исключение при каждом выделении памяти с указанной вероятностью. */ \
|
/** В целях тестирования exception safety - кидать исключение при каждом выделении памяти с указанной вероятностью. */ \
|
||||||
M(SettingFloat, memory_tracker_fault_probability, 0.) \
|
M(SettingFloat, memory_tracker_fault_probability, 0.) \
|
||||||
\
|
\
|
||||||
|
/** Сжимать результат, если клиент по HTTP сказал, что он понимает данные, сжатые методом gzip или deflate */ \
|
||||||
|
M(SettingBool, enable_http_compression, 0) \
|
||||||
/** Уровень сжатия - используется, если клиент по HTTP сказал, что он понимает данные, сжатые методом gzip или deflate */ \
|
/** Уровень сжатия - используется, если клиент по HTTP сказал, что он понимает данные, сжатые методом gzip или deflate */ \
|
||||||
M(SettingInt64, http_zlib_compression_level, 3) \
|
M(SettingInt64, http_zlib_compression_level, 3) \
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ void HTTPHandler::processQuery(Poco::Net::HTTPServerRequest & request, Poco::Net
|
|||||||
/** Клиент может указать поддерживаемый метод сжатия (gzip или deflate) в HTTP-заголовке.
|
/** Клиент может указать поддерживаемый метод сжатия (gzip или deflate) в HTTP-заголовке.
|
||||||
*/
|
*/
|
||||||
String http_response_compression_methods = request.get("Accept-Encoding", "");
|
String http_response_compression_methods = request.get("Accept-Encoding", "");
|
||||||
bool http_response_compress = false;
|
bool client_supports_http_compression = false;
|
||||||
Poco::DeflatingStreamBuf::StreamType http_response_compression_method {};
|
Poco::DeflatingStreamBuf::StreamType http_response_compression_method {};
|
||||||
|
|
||||||
if (!http_response_compression_methods.empty())
|
if (!http_response_compression_methods.empty())
|
||||||
@ -64,17 +64,17 @@ void HTTPHandler::processQuery(Poco::Net::HTTPServerRequest & request, Poco::Net
|
|||||||
|
|
||||||
if (std::string::npos != http_response_compression_methods.find("gzip"))
|
if (std::string::npos != http_response_compression_methods.find("gzip"))
|
||||||
{
|
{
|
||||||
http_response_compress = true;
|
client_supports_http_compression = true;
|
||||||
http_response_compression_method = Poco::DeflatingStreamBuf::STREAM_GZIP;
|
http_response_compression_method = Poco::DeflatingStreamBuf::STREAM_GZIP;
|
||||||
}
|
}
|
||||||
else if (std::string::npos != http_response_compression_methods.find("deflate"))
|
else if (std::string::npos != http_response_compression_methods.find("deflate"))
|
||||||
{
|
{
|
||||||
http_response_compress = true;
|
client_supports_http_compression = true;
|
||||||
http_response_compression_method = Poco::DeflatingStreamBuf::STREAM_ZLIB;
|
http_response_compression_method = Poco::DeflatingStreamBuf::STREAM_ZLIB;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
used_output.out = new WriteBufferFromHTTPServerResponse(response, http_response_compress, http_response_compression_method);
|
used_output.out = new WriteBufferFromHTTPServerResponse(response, client_supports_http_compression, http_response_compression_method);
|
||||||
|
|
||||||
/** Клиент может указать compress в query string.
|
/** Клиент может указать compress в query string.
|
||||||
* В этом случае, результат сжимается несовместимым алгоритмом для внутреннего использования и этот факт не отражается в HTTP заголовках.
|
* В этом случае, результат сжимается несовместимым алгоритмом для внутреннего использования и этот факт не отражается в HTTP заголовках.
|
||||||
@ -225,7 +225,10 @@ void HTTPHandler::processQuery(Poco::Net::HTTPServerRequest & request, Poco::Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (http_response_compress)
|
/// Сжатие ответа (Content-Encoding) включается только если клиент сказал, что он это понимает (Accept-Encoding)
|
||||||
|
/// и выставлена настройка, разрешающая сжатие.
|
||||||
|
used_output.out->setCompression(client_supports_http_compression && context.getSettingsRef().enable_http_compression);
|
||||||
|
if (client_supports_http_compression)
|
||||||
used_output.out->setCompressionLevel(context.getSettingsRef().http_zlib_compression_level);
|
used_output.out->setCompressionLevel(context.getSettingsRef().http_zlib_compression_level);
|
||||||
|
|
||||||
context.setInterface(Context::Interface::HTTP);
|
context.setInterface(Context::Interface::HTTP);
|
||||||
|
@ -38,6 +38,16 @@
|
|||||||
7
|
7
|
||||||
8
|
8
|
||||||
9
|
9
|
||||||
|
0
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
< Content-Encoding: gzip
|
< Content-Encoding: gzip
|
||||||
< Content-Encoding: deflate
|
< Content-Encoding: deflate
|
||||||
< Content-Encoding: gzip
|
< Content-Encoding: gzip
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
curl -sS 'http://localhost:8123/' -d 'SELECT number FROM system.numbers LIMIT 10';
|
curl -sS 'http://localhost:8123/?enable_http_compression=1' -d 'SELECT number FROM system.numbers LIMIT 10';
|
||||||
curl -sS 'http://localhost:8123/' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 10' | gzip -d;
|
curl -sS 'http://localhost:8123/?enable_http_compression=0' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 10';
|
||||||
curl -sS 'http://localhost:8123/' -H 'Accept-Encoding: gzip, deflate' -d 'SELECT number FROM system.numbers LIMIT 10' | gzip -d;
|
curl -sS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 10' | gzip -d;
|
||||||
curl -sS 'http://localhost:8123/' -H 'Accept-Encoding: zip, eflate' -d 'SELECT number FROM system.numbers LIMIT 10';
|
curl -sS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: gzip, deflate' -d 'SELECT number FROM system.numbers LIMIT 10' | gzip -d;
|
||||||
|
curl -sS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: zip, eflate' -d 'SELECT number FROM system.numbers LIMIT 10';
|
||||||
|
|
||||||
curl -vsS 'http://localhost:8123/' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
curl -vsS 'http://localhost:8123/?enable_http_compression=1' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
||||||
curl -vsS 'http://localhost:8123/' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
curl -vsS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
||||||
curl -vsS 'http://localhost:8123/' -H 'Accept-Encoding: deflate' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
curl -vsS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: deflate' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
||||||
curl -vsS 'http://localhost:8123/' -H 'Accept-Encoding: gzip, deflate' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
curl -vsS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: gzip, deflate' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
||||||
curl -vsS 'http://localhost:8123/' -H 'Accept-Encoding: zip, eflate' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
curl -vsS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: zip, eflate' -d 'SELECT number FROM system.numbers LIMIT 10' 2>&1 | grep --text '< Content-Encoding';
|
||||||
|
|
||||||
echo "SELECT 1" | curl -sS --data-binary @- 'http://localhost:8123/';
|
echo "SELECT 1" | curl -sS --data-binary @- 'http://localhost:8123/';
|
||||||
echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/';
|
echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/';
|
||||||
@ -17,4 +18,4 @@ echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip
|
|||||||
echo "'Hello, world'" | curl -sS --data-binary @- 'http://localhost:8123/?query=SELECT';
|
echo "'Hello, world'" | curl -sS --data-binary @- 'http://localhost:8123/?query=SELECT';
|
||||||
echo "'Hello, world'" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/?query=SELECT';
|
echo "'Hello, world'" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/?query=SELECT';
|
||||||
|
|
||||||
curl -sS 'http://localhost:8123/' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 0' | wc -c;
|
curl -sS 'http://localhost:8123/?enable_http_compression=1' -H 'Accept-Encoding: gzip' -d 'SELECT number FROM system.numbers LIMIT 0' | wc -c;
|
||||||
|
Loading…
Reference in New Issue
Block a user