[ 
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)

Reply via email to