Como transcodificar arquivos compactados por gzip

Nesta página, você aprenderá sobre a conversão de arquivos para um estado compactado com gzip e a partir dele. A página inclui uma visão geral da transcodificação, práticas recomendadas para trabalhar com metadados associados e comportamento de arquivos compactados no Cloud Storage.

Transcodificação e gzip

O gzip é uma forma de compactação de dados: ele normalmente reduz o tamanho de um arquivo. Assim, o arquivo é transferido mais rapidamente e usa menos espaço de armazenamento do que se não estivesse compactado. A compactação de um arquivo reduz o custo e o tempo de transferência. A transcodificação, no Cloud Storage, é a alteração automática da compactação de um arquivo antes de ele ser disponibilizado ao solicitante. Quando a transcodificação resulta em um arquivo compactado com gzip, ela pode ser considerada compressiva, e quando o resultado é um arquivo que não é mais compactado com gzip, ela pode ser considerada descompressiva. O Cloud Storage aceita a forma descompressiva de transcodificação.

Transcodificação descompressiva

Se os arquivos forem armazenados como objetos compactados com gzip no Cloud Storage, eles poderão ser descompactados automaticamente antes de serem enviados a um solicitante, resultando em arquivos codificados por identidade (isto é, não compactados). Isso reduz os custos de armazenamento do objeto no Cloud Storage, mas o solicitante recebe o arquivo em si, sem compactação. É útil, por exemplo, ao disponibilizar arquivos para clientes.

Para estar qualificado para transcodificação descompressiva, um objeto precisa atender a dois critérios:

  1. O arquivo é compactado com gzip quando é armazenado no Cloud Storage.

  2. Os metadados associados incluem Content-Encoding: gzip.

Quando um objeto atende a esses dois critérios, ele passa por uma transcodificação descompressiva quando solicitado, caso em que também é exibido sem um cabeçalho Content-Encoding. Se você quiser que um objeto que atenda a ambos os critérios seja disponibilizado no estado compactado (por exemplo, para reduzir o custo ou o tempo de saída), há duas maneiras de evitar a ocorrência da transcodificação descompressiva:

  • Se a solicitação do objeto incluir um cabeçalho Accept-Encoding: gzip, o objeto será exibido como está nessa solicitação específica e com um cabeçalho de resposta Content-Encoding: gzip.

  • Se o campo de metadados Cache-Control (em inglês) do objeto for definido como no-transform, esse objeto será exibido como um objeto compactado em todas as solicitações subsequentes, independentemente dos cabeçalhos de solicitação Accept-Encoding.

Content-Type vs. Content-Encoding

Há vários comportamentos de que você precisa estar ciente sobre como o Content-Type e Content-Encoding se relacionam com a transcodificação. Ambos são metadados armazenados junto com um objeto. Consulte Como ver e editar metadados de objeto para instruções passo a passo sobre como adicionar metadados a objetos.

O Content-Type (em inglês) precisa ser incluído em todos os uploads e indica o tipo de objeto que está sendo enviado. Por exemplo:

Content-Type: text/plain

indica que o objeto enviado é um arquivo de texto simples. Mesmo que não haja uma verificação para garantir que o Content-Type especificado corresponda à verdadeira natureza de um objeto enviado, a especificação incorreta do tipo fará com que os solicitantes recebam algo diferente do que esperavam e pode levar a comportamentos indesejados.

Content-Encoding (em inglês) é opcional e pode, se quiser, ser incluído no upload de arquivos compactados. Por exemplo:

Content-Encoding: gzip

indica que o objeto carregado é compactado com gzip. Assim como no Content-Type, não há verificação para garantir que o Content-Encoding especificado seja realmente aplicado ao objeto carregado, e a especificação incorreta da codificação de um objeto pode levar a um comportamento não intencional nas solicitações de download subsequentes.

Práticas recomendadas

  • Ao fazer upload de um objeto compactado com gzip, a maneira recomendada de definir os metadados é especificar o Content-Type e o Content-Encoding. Por exemplo, para um arquivo de texto simples compactado:

    Content-Type: text/plain
    Content-Encoding: gzip
    

    Eles fornecem o máximo de informações sobre o estado do objeto para qualquer pessoa que o acessa. Além disso, tornam o objeto elegível para transcodificação descompressiva quando o download é feito posteriormente, permitindo que os aplicativos clientes manipulem a semântica do Content-Type corretamente.

  • Como alternativa, faça upload do objeto com Content-Type definido para indicar compactação e o não uso de Content-Encoding. Por exemplo:

    Content-Type: application/gzip
    

    No entanto, nesse caso, a única coisa conhecida imediatamente sobre o objeto é que ele é compactado com gzip, sem informações sobre o tipo de objeto subjacente. Além disso, o objeto não é elegível para transcodificação descompressiva.

Práticas não recomendadas

  • Embora seja possível, não faça upload de um arquivo que é compactado com gzip com a natureza compactada do arquivo omitida. Por exemplo, para um arquivo de texto simples compactado com gzip, evite configurar somente o Content-Type: text/plain. Caso contrário, isso vai representar erroneamente o estado do objeto quando for entregue a um solicitante.

  • Da mesma forma, não faça upload dos objetos com um Content-Type omitido, mesmo que um Content-Encoding esteja incluído. Isso pode fazer com que Content-Type seja definido como um valor padrão, mas pode resultar na rejeição da solicitação, dependendo de como o upload é feito.

Práticas incorretas

  • Não defina os metadados para informar de modo redundante a compactação do objeto:

    Content-Type: application/gzip
    Content-Encoding: gzip
    

    Isto implica que você está fazendo upload de um objeto compactado com gzip que foi compactado uma segunda vez, quando esse normalmente não é o caso. Se você realmente pretende compactar duplamente um arquivo, consulte a seção Como usar o gzip em objetos compactados abaixo. Quando a transcodificação descompressiva ocorre em um objeto relatado incorretamente, o objeto é disponibilizado com codificação de identidade, mas os solicitantes acham que receberam um objeto que ainda tem uma camada de compactação associada a ele. As tentativas de descompactar o objeto não terão êxito.

  • Da mesma forma, não faça upload de um arquivo que não é compactado com gzip com o Content-Encoding: gzip. Isso faz com que o objeto pareça estar qualificado para transcodificação, mas quando as solicitações são feitas para o objeto, as tentativas de transcodificação falham.

Como usar o gzip em objetos compactados

Alguns objetos, como muitos arquivos de vídeo, áudio e imagem, sem mencionar os próprios arquivos gzip, já estão compactados. Usar o gzip em tais objetos não oferece virtualmente nenhum benefício: em quase todos os casos, fazer isso torna o objeto maior devido à sobrecarga do gzip. Por esse motivo, o uso de gzip em conteúdo compactado é geralmente desencorajado e pode causar comportamentos indesejáveis.

Por exemplo, o Cloud Storage permite que objetos "duplamente compactados" (isto é, objetos que são compactados com gzip, mas também têm um Content-Type subjacente que é compactado) sejam carregados e armazenados. No entanto, ele não permite que objetos sejam disponibilizados em estado duplamente compactado, a menos que os metadados de Cache-Control incluam no-transform. Em vez disso, ele remove o nível de compactação externo do gzip, elimina o cabeçalho de resposta Content-Encoding e disponibiliza o objeto resultante. Isso ocorre mesmo para solicitações com Accept-Encoding: gzip. O arquivo recebido pelo cliente não tem a mesma soma de verificação do que foi enviado e armazenado no Cloud Storage, então qualquer verificação de integridade falhará.

Como usar o cabeçalho Range

Quando ocorre a transcodificação, se a solicitação do objeto incluir um cabeçalho Range, ele será ignorado silenciosamente. Isso significa que as solicitações de conteúdo parcial não são atendidas e, em vez disso, a resposta disponibiliza todo o objeto solicitado. Por exemplo, se o objeto de 10 GB não estiver qualificado para transcodificação, mas incluir o cabeçalho Range: bytes=0-10000 na solicitação, você ainda receberá o objeto de 10 GB inteiro.

Esse comportamento ocorre porque não é possível selecionar um intervalo a partir do arquivo compactado sem primeiro descompactá-lo por inteiro: cada solicitação de parte de um arquivo seria acompanhada pela descompactação de todo o arquivo, potencialmente grande, o que seria uma utilização incorreta dos recursos. Esteja ciente desse comportamento e evite o uso do cabeçalho Range ao usar a transcodificação, já que há cobranças para a transmissão de todo o objeto e não apenas do intervalo solicitado. Para mais informações sobre o comportamento de resposta permitido para solicitações com cabeçalhos Range, veja a especificação (em inglês).

Se as solicitações com cabeçalhos Range forem necessárias, certifique-se de que a transcodificação não ocorra para o objeto solicitado. Para isso, escolha as propriedades adequadas ao fazer upload de objetos para iniciar. Por exemplo, as solicitações de intervalo para objetos com Content-Type: application/gzip e sem Content-Encoding são executadas conforme solicitado.

A seguir