Skip to content

Commit

Permalink
Merge upstream (#2)
Browse files Browse the repository at this point in the history
* Fixed Timeout in readme, 30 ~> 60 (h2non#340)

* Fix invalid parameters "-path-prefix" (h2non#344)

* fix: small errors in docs (h2non#346)

* fix: use proper formatter for usage template (h2non#347)

Co-authored-by: Mads Moeller <madsmm@gmail.com>

* Add Cloud Run Button (h2non#362)

* Delete app.json

* Update README.md

* Update README.md

* updated docker builder OS to go version 1.17 (h2non#371)

* fix(readme): remove gocard obsolete badge

* feat(readme): update placeholder description

* fix(readme): update fly deploy tutorial

* fix(docs): allowed-origins examples h2non#333

* memory leak issue fixed with jemalloc (h2non#381)

* exposed palette from GET endpoints (h2non#380)

* Updated Dockerfile (h2non#384)

1. Changed base image to bullseye
2. The updated base image contains an updated version of libjemalloc too, so building from source is no longer necessary
3. Updated libvips version too

* Added dev container (h2non#385)

* Added dev container

* Removed irrelevant lines

* allow speed from get (h2non#383)

* allow speed from get

* updating the version to use effor param in libvips

* Return with and heigh of the generated images (h2non#382)

* Return with and heigh of the generated images

Use case:

When using the fit image transformation, it is helpful to know the size
of the resulting image without having to either read the image locally
or do another request to the info endpoint.

Used in: nextcloud/server#24166

Signed-off-by: Carl Schwan <carl@carlschwan.eu>

* Make mimetype support always return true

* Add command line option to enable this feature

Signed-off-by: Carl Schwan <carl@carlschwan.eu>

* refactor: remove deprecated X- prefix in response headers

Co-authored-by: Tom <tomas@aparicio.me>

* Decompression exploit check (h2non#404)

* Bump bimg version to 1.1.7

* Add decompression bomb exploit check

* Update README with new flag

* Fix tests

* Fix typos (h2non#405)

Found via `codespell -S .git`.

---------

Co-authored-by: Julian <2564520+judomu@users.noreply.github.com>
Co-authored-by: liuxu <i@liuxu.me>
Co-authored-by: 0xflotus <0xflotus@gmail.com>
Co-authored-by: Mads Moeller <mmoeller@users.noreply.github.com>
Co-authored-by: Mads Moeller <madsmm@gmail.com>
Co-authored-by: James Ward <james@jamesward.com>
Co-authored-by: Angelo Girardi <angelo.girardi@goat.com>
Co-authored-by: Tom <tomas@aparicio.me>
Co-authored-by: Vaibhav Sharma <vaib.sharma44@gmail.com>
Co-authored-by: Alessandro (Ale) Segala <43508+ItalyPaleAle@users.noreply.github.com>
Co-authored-by: Vaibhav Sharma <vaibhavsharma.v@udaan.com>
Co-authored-by: Carl Schwan <carl@carlschwan.eu>
Co-authored-by: SeaaaaaSharp <98841125+SeaaaaaSharp@users.noreply.github.com>
Co-authored-by: Kian-Meng Ang <kianmeng.ang@gmail.com>
  • Loading branch information
15 people committed Feb 1, 2023
1 parent f66c217 commit 68b1b25
Show file tree
Hide file tree
Showing 19 changed files with 269 additions and 122 deletions.
49 changes: 49 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.217.4/containers/go/.devcontainer/base.Dockerfile

# [Choice] Go version (use -bullseye variants on local arm64/Apple Silicon): 1, 1.16, 1.17, 1-bullseye, 1.16-bullseye, 1.17-bullseye, 1-buster, 1.16-buster, 1.17-buster
ARG VARIANT="1.17-bullseye"
FROM mcr.microsoft.com/vscode/devcontainers/go:0-${VARIANT}

# Versions of libvips and golanci-lint
ARG LIBVIPS_VERSION=8.12.2
ARG GOLANGCILINT_VERSION=1.29.0

# Install additional OS packages
RUN DEBIAN_FRONTEND=noninteractive \
apt-get update && \
apt-get install --no-install-recommends -y \
ca-certificates \
automake build-essential curl \
procps libopenexr25 libmagickwand-6.q16-6 libpango1.0-0 libmatio11 \
libopenslide0 libjemalloc2 gobject-introspection gtk-doc-tools \
libglib2.0-0 libglib2.0-dev libjpeg62-turbo libjpeg62-turbo-dev \
libpng16-16 libpng-dev libwebp6 libwebpmux3 libwebpdemux2 libwebp-dev \
libtiff5 libtiff5-dev libgif7 libgif-dev libexif12 libexif-dev \
libxml2 libxml2-dev libpoppler-glib8 libpoppler-glib-dev \
swig libmagickwand-dev libpango1.0-dev libmatio-dev libopenslide-dev \
libcfitsio9 libcfitsio-dev libgsf-1-114 libgsf-1-dev fftw3 fftw3-dev \
liborc-0.4-0 liborc-0.4-dev librsvg2-2 librsvg2-dev libimagequant0 \
libimagequant-dev libheif1 libheif-dev && \
cd /tmp && \
curl -fsSLO https://github.com/libvips/libvips/releases/download/v${LIBVIPS_VERSION}/vips-${LIBVIPS_VERSION}.tar.gz && \
tar zvxf vips-${LIBVIPS_VERSION}.tar.gz && \
cd /tmp/vips-${LIBVIPS_VERSION} && \
CFLAGS="-g -O3" CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0 -g -O3" \
./configure \
--disable-debug \
--disable-dependency-tracking \
--disable-introspection \
--disable-static \
--enable-gtk-doc-html=no \
--enable-gtk-doc=no \
--enable-pyvips8=no && \
make && \
make install && \
ldconfig

# Installing golangci-lint
RUN curl -fsSL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v${GOLANGCILINT_VERSION}

# [Optional] Uncomment the next lines to use go get to install anything else you need
# USER vscode
# RUN go get -x <your-dependency-or-tool>
40 changes: 40 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.217.4/containers/go
{
"name": "Go",
"build": {
"dockerfile": "Dockerfile",
"args": {
// Update the VARIANT arg to pick a version of Go: 1, 1.16, 1.17
// Append -bullseye or -buster to pin to an OS version.
// Use -bullseye variants on local arm64/Apple Silicon.
"VARIANT": "1.17-bullseye"
}
},
"runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],

// Set *default* container specific settings.json values on container create.
"settings": {
"go.toolsManagement.checkForUpdates": "local",
"go.useLanguageServer": true,
"go.gopath": "/go",
"go.goroot": "/usr/local/go"
},

// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"golang.Go"
],

// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [9000],

// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "go version",

// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode",
"features": {
"docker-from-docker": "latest"
}
}
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
**/*~
.devcontainer
.github
.git
Dockerfile
docker-compose.yml
18 changes: 10 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
ARG GOLANG_VERSION=1.14
FROM golang:${GOLANG_VERSION} as builder
ARG GOLANG_VERSION=1.17
FROM golang:${GOLANG_VERSION}-bullseye as builder

ARG IMAGINARY_VERSION=dev
ARG LIBVIPS_VERSION=8.10.0
ARG LIBVIPS_VERSION=8.12.2
ARG GOLANGCILINT_VERSION=1.29.0

# Installs libvips + required libraries
Expand Down Expand Up @@ -51,7 +51,7 @@ RUN go mod download
COPY . .

# Run quality control
RUN go test -test.v -test.race -test.covermode=atomic .
RUN go test ./... -test.v -race -test.coverprofile=atomic .
RUN golangci-lint run .

# Compile imaginary
Expand All @@ -60,7 +60,7 @@ RUN go build -a \
-ldflags="-s -w -h -X main.Version=${IMAGINARY_VERSION}" \
github.com/h2non/imaginary

FROM debian:buster-slim
FROM debian:bullseye-slim

ARG IMAGINARY_VERSION

Expand All @@ -79,15 +79,17 @@ COPY --from=builder /etc/ssl/certs /etc/ssl/certs
RUN DEBIAN_FRONTEND=noninteractive \
apt-get update && \
apt-get install --no-install-recommends -y \
procps libglib2.0-0 libjpeg62-turbo libpng16-16 libopenexr23 \
procps libglib2.0-0 libjpeg62-turbo libpng16-16 libopenexr25 \
libwebp6 libwebpmux3 libwebpdemux2 libtiff5 libgif7 libexif12 libxml2 libpoppler-glib8 \
libmagickwand-6.q16-6 libpango1.0-0 libmatio4 libopenslide0 \
libgsf-1-114 fftw3 liborc-0.4-0 librsvg2-2 libcfitsio7 libimagequant0 libheif1 imagemagick ghostscript && \
libmagickwand-6.q16-6 libpango1.0-0 libmatio11 libopenslide0 libjemalloc2 \
libgsf-1-114 fftw3 liborc-0.4-0 librsvg2-2 libcfitsio9 libimagequant0 libheif1 imagemagick ghostscript && \
ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so && \
apt-get autoremove -y && \
apt-get autoclean && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
sed -i 's/<policy domain="coder" rights="none"/<policy domain="coder" rights="read|write"/g' /etc/ImageMagick-6/policy.xml
ENV LD_PRELOAD=/usr/local/lib/libjemalloc.so

# Server port to listen
ENV PORT 9000
Expand Down
4 changes: 2 additions & 2 deletions History.md
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ v0.1.26 / 2016-09-06
* feat(docs): update CLI usage and help
* feat: forward authorization headers support
* Fix description for URL source, and allowed origins server options (#83)
* fix(version): ups, editting from iPad
* fix(version): ups, editing from iPad
* fix(version): unresolved conflict
* merge: fix History conflicts
* Merge branch 'develop'
Expand Down Expand Up @@ -750,7 +750,7 @@ v0.1.24 / 2016-04-21
==================

* feat(#18): http docs
* fix(travis): another attemp
* fix(travis): another attempt
* fix(travis)
* fix(docs)
* fix(travis)
Expand Down
50 changes: 36 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# imaginary [![Build Status](https://travis-ci.org/h2non/imaginary.svg)](https://travis-ci.org/h2non/imaginary) [![Docker](https://img.shields.io/badge/docker-h2non/imaginary-blue.svg)](https://hub.docker.com/r/h2non/imaginary/) [![Docker Registry](https://img.shields.io/docker/pulls/h2non/imaginary.svg)](https://hub.docker.com/r/h2non/imaginary/) [![Go Report Card](http://goreportcard.com/badge/h2non/imaginary)](https://goreportcard.com/report/h2non/imaginary) [![Fly.io](https://img.shields.io/badge/deploy-fly.io-blue.svg)](https://fly.io/launch/github/h2non/imaginary)
# imaginary [![Build Status](https://travis-ci.org/h2non/imaginary.svg)](https://travis-ci.org/h2non/imaginary) [![Docker](https://img.shields.io/badge/docker-h2non/imaginary-blue.svg)](https://hub.docker.com/r/h2non/imaginary/) [![Docker Registry](https://img.shields.io/docker/pulls/h2non/imaginary.svg)](https://hub.docker.com/r/h2non/imaginary/) [![Fly.io](https://img.shields.io/badge/deploy-fly.io-blue.svg)](https://fly.io/launch/github/h2non/imaginary)

**[Fast](#benchmarks) HTTP [microservice](http://microservices.io/patterns/microservices.html)** written in Go **for high-level image processing** backed by [bimg](https://github.com/h2non/bimg) and [libvips](https://github.com/jcupitt/libvips). `imaginary` can be used as private or public HTTP service for massive image processing with first-class support for [Docker](#docker) & [Fly.io](#flyio).
It's almost dependency-free and only uses [`net/http`](http://golang.org/pkg/net/http/) native package without additional abstractions for better [performance](#performance).
Expand All @@ -10,7 +10,7 @@ with additional optional features such as **API token authorization**, **URL sig

`imaginary` is able to output images as JPEG, PNG and WEBP formats, including transparent conversion across them.

`imaginary` also optionally **supports image placeholder fallback mechanism** in case of image processing error or server error of any nature, therefore an image will be always returned by the server in terms of HTTP response body and content MIME type, even in case of error, matching the expected image size and format transparently.
`imaginary` optionally **supports image placeholder fallback mechanism** in case of image processing error or server error of any nature, hence an image will be always returned by imaginary even in case of error, trying to match the requested image size and format type transparently. The error details will be provided in the response HTTP header `Error` field serialized as JSON.

`imaginary` uses internally `libvips`, a powerful and efficient library written in C for fast image processing
which requires a [low memory footprint](https://github.com/libvips/libvips/wiki/Benchmarks)
Expand All @@ -27,6 +27,7 @@ To get started, take a look the [installation](#installation) steps, [usage](#co
- [Docker](#docker)
- [Fly.io](#flyio)
- [Cloud Foundry](#cloudfoundry)
- [Google Cloud Run](#google-cloud-run)
- [Recommended resources](#recommended-resources)
- [Production notes](#production-notes)
- [Scalability](#scalability)
Expand Down Expand Up @@ -162,7 +163,7 @@ services:

Deploy imaginary in seconds close to your users in [Fly.io](https://fly.io) cloud by clicking on the button below:

<a href="https://fly.io/launch/github/h2non/imaginary">
<a href="https://fly.io/docs/app-guides/run-a-global-image-service/">
<img src="testdata/flyio-button.svg?raw=true" width="200">
</a>

Expand Down Expand Up @@ -200,6 +201,12 @@ Start the application
cf start imaginary-inst01
```

### Google Cloud Run

Click to deploy on Google Cloud Run:

[![Run on Google Cloud](https://deploy.cloud.run/button.svg)](https://deploy.cloud.run)

### Recommended resources

Given the multithreaded native nature of Go, in terms of CPUs, most cores means more concurrency and therefore, a better performance can be achieved.
Expand All @@ -222,7 +229,7 @@ $ imaginary -concurrency 20

### Memory issues

In case you are experiencing any persistent unreleased memory issues in your deployment, you can try passing this environemnt variables to `imaginary`:
In case you are experiencing any persistent unreleased memory issues in your deployment, you can try passing this environment variables to `imaginary`:

```
MALLOC_ARENA_MAX=2 imaginary -p 9000 -enable-url-source
Expand Down Expand Up @@ -330,8 +337,8 @@ Options:
-key <key> Define API key for authorization
-mount <path> Mount server local directory
-http-cache-ttl <num> The TTL in seconds. Adds caching headers to locally served files.
-http-read-timeout <num> HTTP read timeout in seconds [default: 30]
-http-write-timeout <num> HTTP write timeout in seconds [default: 30]
-http-read-timeout <num> HTTP read timeout in seconds [default: 60]
-http-write-timeout <num> HTTP write timeout in seconds [default: 60]
-enable-url-source Enable remote HTTP URL image source processing (?url=http://..)
-enable-placeholder Enable image response placeholder to be used in case of error [default: false]
-enable-auth-forwarding Forwards X-Forward-Authorization or Authorization header to the image source server. -enable-url-source flag must be defined. Tip: secure your server from public access to prevent attack vectors
Expand All @@ -340,6 +347,7 @@ Options:
-url-signature-key The URL signature key (32 characters minimum)
-allowed-origins <urls> Restrict remote image source processing to certain origins (separated by commas). Note: Origins are validated against host *AND* path.
-max-allowed-size <bytes> Restrict maximum size of http image source (in bytes)
-max-allowed-resolution <megapixels> Restrict maximum resolution of the image [default: 18.0]
-certfile <path> TLS certificate file path
-keyfile <path> TLS private key file path
-authorization <value> Defines a constant Authorization header value passed to all the image source servers. -enable-url-source flag must be defined. This overwrites authorization headers forwarding behavior via X-Forward-Authorization
Expand Down Expand Up @@ -422,7 +430,7 @@ This feature is particularly useful to protect against multiple image operations
imaginary -p 8080 -enable-url-signature -url-signature-key 4f46feebafc4b5e988f131c4ff8b5997
```

It is recommanded to pass key as environment variables:
It is recommended to pass key as environment variables:
```
URL_SIGNATURE_KEY=4f46feebafc4b5e988f131c4ff8b5997 imaginary -p 8080 -enable-url-signature
```
Expand Down Expand Up @@ -477,13 +485,13 @@ imaginary can be configured to block all requests for images with a src URL this

| `allowed-origins` setting | image url | is valid |
| ------------------------- | --------- | -------- |
| `--allowed-origins s3.amazonaws.com/some-bucket/` | `s3.amazonaws.com/some-bucket/images/image.png` | VALID |
| `--allowed-origins s3.amazonaws.com/some-bucket/` | `s3.amazonaws.com/images/image.png` | NOT VALID (no matching basepath) |
| `--allowed-origins s3.amazonaws.com/some-*` | `s3.amazonaws.com/some-bucket/images/image.png` | VALID |
| `--allowed-origins *.amazonaws.com/some-bucket/` | `anysubdomain.amazonaws.com/some-bucket/images/image.png` | VALID |
| `--allowed-origins *.amazonaws.com` | `anysubdomain.amazonaws.comimages/image.png` | VALID |
| `--allowed-origins *.amazonaws.com` | `www.notaws.comimages/image.png` | NOT VALID (no matching host) |
| `--allowed-origins *.amazonaws.com, foo.amazonaws.com/some-bucket/` | `bar.amazonaws.com/some-other-bucket/image.png` | VALID (matches first condition but not second) |
| `-allowed-origins https://s3.amazonaws.com/some-bucket/` | `s3.amazonaws.com/some-bucket/images/image.png` | VALID |
| `-allowed-origins https://s3.amazonaws.com/some-bucket/` | `s3.amazonaws.com/images/image.png` | NOT VALID (no matching basepath) |
| `-allowed-origins https://s3.amazonaws.com/some-*` | `s3.amazonaws.com/some-bucket/images/image.png` | VALID |
| `-allowed-origins https://*.amazonaws.com/some-bucket/` | `anysubdomain.amazonaws.com/some-bucket/images/image.png` | VALID |
| `-allowed-origins https://*.amazonaws.com` | `anysubdomain.amazonaws.comimages/image.png` | VALID |
| `-allowed-origins https://*.amazonaws.com` | `www.notaws.comimages/image.png` | NOT VALID (no matching host) |
| `-allowed-origins https://*.amazonaws.com, foo.amazonaws.com/some-bucket/` | `bar.amazonaws.com/some-other-bucket/image.png` | VALID (matches first condition but not second) |

### Authorization

Expand Down Expand Up @@ -565,6 +573,7 @@ Image measures are always in pixels, unless otherwise indicated.
- **areaheight** `int` - Width area to extract. Example: `300`
- **quality** `int` - JPEG image quality between 1-100. Defaults to `80`
- **compression** `int` - PNG compression level. Default: `6`
- **palette** `bool` - Enable 8-bit quantisation. Works with only PNG images. Default: `false`
- **rotate** `int` - Image rotation angle. Must be multiple of `90`. Example: `180`
- **factor** `int` - Zoom factor level. Example: `2`
- **margin** `int` - Text area margin for watermark. Example: `50`
Expand Down Expand Up @@ -751,6 +760,7 @@ Resize an image by width or height. Image aspect ratio is maintained
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /enlarge
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -780,6 +790,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- minampl `float`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- palette `bool`

#### GET | POST /extract
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -813,6 +824,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /zoom
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -844,6 +856,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /thumbnail
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -873,6 +886,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /fit
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -905,6 +919,7 @@ The width and height specify a maximum bounding box for the image.
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /rotate
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -942,6 +957,7 @@ Returns a new image with the same size and format as the input image.
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /flip
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -970,6 +986,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /flop
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -998,6 +1015,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /convert
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -1025,6 +1043,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

#### GET | POST /pipeline
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -1148,6 +1167,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- minampl `float`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- palette `bool`

#### GET | POST /watermarkimage
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -1178,6 +1198,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- minampl `float`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- palette `bool`

#### GET | POST /blur
Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
Expand Down Expand Up @@ -1206,6 +1227,7 @@ Accepts: `image/*, multipart/form-data`. Content-Type: `image/*`
- field `string` - Only POST and `multipart/form` payloads
- interlace `bool`
- aspectratio `string`
- palette `bool`

## Logging

Expand Down
Loading

0 comments on commit 68b1b25

Please sign in to comment.