---
title: Shrine 2.16.0
---

## New Features

* The `:download_options` option has been added to the `download_endpoint`
  plugin, for specifying options passed to `Storage#open`.

  ```rb
  plugin :download_endpoint,
    download_options: {
      sse_customer_algorithm: "AES256",
      sse_customer_key:       "secret_key",
      sse_customer_key_md5:   "secret_key_md5",
    }
  ```

* The `:upload_open_options` option has been added to the `derivation_endpoint`
  plugin, for specifying options passed to `Storage#open` when downloading a
  cached derivation result.

  ```rb
  plugin :download_endpoint,
    upload: true,
    upload_open_options: { response_content_encoding: "gzip" }
  ```

## Other improvements

* The `rack_response` and `derivation_endpoint` plugins now don't return any
  `Content-Type` response header if the MIME type could not be determined from
  the file extension. Previously it the `Content-Type` header would default to
  `application/octet-stream`, which would force the browser to view the file
  as generic binary content, as opposed to doing its own MIME type sniffing.

* Fixed `delete_raw` plugin breaking `derivation_endpoint` when `:upload` was
  enabled.

* Fixed a few things in the `Shrine::Derivation` API:

  * `Derivation#upload` doesn't close the input file anymore
  * `Derivation#upload` now requires input file to respond to `#path`
  * `Derivation#upload` now deletes the internally generated derivation result
  * `Derivation#processed` now works when derivation result is a `File` object

* The official demo app now shows the `derivation_endpoint` plugin.

* The `#to_rack_response` method from the `rack_response` plugin now always
  opens the `UploadedFile`, and does so upfront. This means if ther are any
  download errors, they will bubble up from `#to_rack_response` as opposed to
  when the response body is iterated over.

* When `store_dimensions` plugin was overriding `Shrine#extract_metadata`, it
  made the second argument (the `context` hash) mandatory. This has been fixed,
  now the second argument is optional again.
