[
https://issues.apache.org/jira/browse/TS-4553?focusedWorklogId=25525&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-25525
]
ASF GitHub Bot logged work on TS-4553:
--------------------------------------
Author: ASF GitHub Bot
Created on: 16/Jul/16 21:03
Start Date: 16/Jul/16 21:03
Worklog Time Spent: 10m
Work Description: Github user bgaff commented on a diff in the pull
request:
https://github.com/apache/trafficserver/pull/776#discussion_r71071812
--- Diff: plugins/experimental/brotli_transform/brotli_transform.cc ---
@@ -0,0 +1,138 @@
+/**
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#include "brotli_transform.h"
+#include "brotli_transform_out.h"
+#define TAG "brotli_transformation"
+
+namespace
+{
+unsigned int BROTLI_QUALITY = 9;
+}
+
+BrotliTransformationPlugin::BrotliTransformationPlugin(Transaction
&transaction)
+ : TransformationPlugin(transaction, RESPONSE_TRANSFORMATION)
+{
+ registerHook(HOOK_READ_RESPONSE_HEADERS);
+}
+
+void
+BrotliTransformationPlugin::handleReadResponseHeaders(Transaction
&transaction)
+{
+ string contentEncoding = "Content-Encoding";
+ Headers &hdr = transaction.getServerResponse().getHeaders();
+ TS_DEBUG(TAG, "Set server response content-encoding to br for url %s.",
+ transaction.getClientRequest().getUrl().getUrlString().c_str());
+ hdr.set(contentEncoding, "br");
+ transaction.resume();
+}
+
+void
+BrotliTransformationPlugin::consume(const string &data)
+{
+ buffer_.append(data);
+}
+
+void
+BrotliTransformationPlugin::transformProduce(const string &data)
+{
+ produce(data);
+}
+
+void
+BrotliTransformationPlugin::handleInputComplete()
+{
+ brotli::BrotliParams params;
+ params.quality = BROTLI_QUALITY;
+
+ const char *dataPtr = buffer_.c_str();
+ brotli::BrotliMemIn brotliIn(dataPtr, buffer_.length());
+ BrotliTransformOut brotliTransformOut(this);
+
+ if (!brotli::BrotliCompress(params, &brotliIn, &brotliTransformOut)) {
+ TS_ERROR(TAG, "brotli compress failed.");
+ produce(buffer_);
+ }
+ setOutputComplete();
+}
+
+void
+GlobalHookPlugin::handleReadResponseHeaders(Transaction &transaction)
+{
+ if (isBrotliSupported(transaction)) {
+ TS_DEBUG(TAG, "Brotli is supported.");
+ if (isText(transaction)) {
+ checkContentEncoding(transaction);
+ if (osContentEncoding_ == GZIP || osContentEncoding_ == NONENCODE) {
+ if (osContentEncoding_ == GZIP) {
+ TS_DEBUG(TAG, "Origin server return gzip, do gzip inflate.");
+ transaction.addPlugin(new GzipInflateTransformation(transaction,
TransformationPlugin::RESPONSE_TRANSFORMATION));
+ }
+ transaction.addPlugin(new BrotliTransformationPlugin(transaction));
+ }
+ }
+ }
+ transaction.resume();
+}
+
+bool
+GlobalHookPlugin::isText(Transaction &transaction)
+{
+ Headers &hdr = transaction.getServerResponse().getHeaders();
+ string contentType = hdr.values("Content-Type");
+ if ((contentType.find("text") != string::npos) ||
(contentType.find("javascript") != string::npos) ||
--- End diff --
This seems fragile, there are many other content types that are
compressible, I think instead maybe it makes more sense to blacklist instead of
whitelist? obviously things like images typically would fall in this category.
This isn't a huge deal either way, I'll leave the final decision to you.
Issue Time Tracking
-------------------
Worklog Id: (was: 25525)
Time Spent: 40m (was: 0.5h)
> Add Brotli compression support
> ------------------------------
>
> Key: TS-4553
> URL: https://issues.apache.org/jira/browse/TS-4553
> Project: Traffic Server
> Issue Type: Wish
> Components: Plugins
> Reporter: David Calavera
> Fix For: sometime
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> I think it would be very interesting to add support for the Brotli
> compression format: https://github.com/google/brotli
> Since I didn't see any issue opened and went ahead so people can discuss
> about it.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)