Buffering

How to Read the Request before Forwarding It

Buffering

The Buffering middleware gives you control on how you want to read the requests before sending them to services.

With Buffering, Traefik reads the entire request into memory (possibly buffering large requests into disk), and rejects requests that are over a specified limit.

This can help services deal with large data (multipart/form-data for example), and can minimize time spent sending data to a service.

Configuration Examples

Docker

  1. # Sets the maximum request body to 2Mb
  2. labels:
  3. - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"

Kubernetes

  1. # Sets the maximum request body to 2Mb
  2. apiVersion: traefik.containo.us/v1alpha1
  3. kind: Middleware
  4. metadata:
  5. name: limit
  6. spec:
  7. buffering:
  8. maxRequestBodyBytes: 2000000

Consul Catalog

  1. # Sets the maximum request body to 2Mb
  2. - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"

Marathon

  1. "labels": {
  2. "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes": "2000000"
  3. }

Rancher

  1. # Sets the maximum request body to 2Mb
  2. labels:
  3. - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"

File (TOML)

  1. # Sets the maximum request body to 2Mb
  2. [http.middlewares]
  3. [http.middlewares.limit.buffering]
  4. maxRequestBodyBytes = 2000000

File (YAML)

  1. # Sets the maximum request body to 2Mb
  2. http:
  3. middlewares:
  4. limit:
  5. buffering:
  6. maxRequestBodyBytes: 2000000

Configuration Options

maxRequestBodyBytes

With the maxRequestBodyBytes option, you can configure the maximum allowed body size for the request (in Bytes).

If the request exceeds the allowed size, it is not forwarded to the service and the client gets a 413 (Request Entity Too Large) response.

Docker

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"

Kubernetes

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: Middleware
  3. metadata:
  4. name: limit
  5. spec:
  6. buffering:
  7. maxRequestBodyBytes: 2000000

Consul Catalog

  1. - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"

Marathon

  1. "labels": {
  2. "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes": "2000000"
  3. }

Rancher

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"

File (TOML)

  1. [http.middlewares]
  2. [http.middlewares.limit.buffering]
  3. maxRequestBodyBytes = 2000000

File (YAML)

  1. http:
  2. middlewares:
  3. limit:
  4. buffering:
  5. maxRequestBodyBytes: 2000000

memRequestBodyBytes

You can configure a threshold (in Bytes) from which the request will be buffered on disk instead of in memory with the memRequestBodyBytes option.

Docker

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000"

Kubernetes

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: Middleware
  3. metadata:
  4. name: limit
  5. spec:
  6. buffering:
  7. memRequestBodyBytes: 2000000

Consul Catalog

  1. - "traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000"

Marathon

  1. "labels": {
  2. "traefik.http.middlewares.limit.buffering.memRequestBodyBytes": "2000000"
  3. }

Rancher

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000"

File (TOML)

  1. [http.middlewares]
  2. [http.middlewares.limit.buffering]
  3. memRequestBodyBytes = 2000000

File (YAML)

  1. http:
  2. middlewares:
  3. limit:
  4. buffering:
  5. memRequestBodyBytes: 2000000

maxResponseBodyBytes

With the maxResponseBodyBytes option, you can configure the maximum allowed response size from the service (in Bytes).

If the response exceeds the allowed size, it is not forwarded to the client. The client gets a 413 (Request Entity Too Large) response instead.

Docker

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=2000000"

Kubernetes

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: Middleware
  3. metadata:
  4. name: limit
  5. spec:
  6. buffering:
  7. maxResponseBodyBytes: 2000000

Consul Catalog

  1. - "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=2000000"

Marathon

  1. "labels": {
  2. "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes": "2000000"
  3. }

Rancher

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=2000000"

File (TOML)

  1. [http.middlewares]
  2. [http.middlewares.limit.buffering]
  3. maxResponseBodyBytes = 2000000

File (YAML)

  1. http:
  2. middlewares:
  3. limit:
  4. buffering:
  5. maxResponseBodyBytes: 2000000

memResponseBodyBytes

You can configure a threshold (in Bytes) from which the response will be buffered on disk instead of in memory with the memResponseBodyBytes option.

Docker

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000"

Kubernetes

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: Middleware
  3. metadata:
  4. name: limit
  5. spec:
  6. buffering:
  7. memResponseBodyBytes: 2000000

Consul Catalog

  1. - "traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000"

Marathon

  1. "labels": {
  2. "traefik.http.middlewares.limit.buffering.memResponseBodyBytes": "2000000"
  3. }

Rancher

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000"

File (TOML)

  1. [http.middlewares]
  2. [http.middlewares.limit.buffering]
  3. memResponseBodyBytes = 2000000

File (YAML)

  1. http:
  2. middlewares:
  3. limit:
  4. buffering:
  5. memResponseBodyBytes: 2000000

retryExpression

You can have the Buffering middleware replay the request with the help of the retryExpression option.

Retries once in case of a network error

Docker

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.retryExpression=IsNetworkError() && Attempts() < 2"

Kubernetes

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: Middleware
  3. metadata:
  4. name: limit
  5. spec:
  6. buffering:
  7. retryExpression: "IsNetworkError() && Attempts() < 2"

Consul Catalog

  1. - "traefik.http.middlewares.limit.buffering.retryExpression=IsNetworkError() && Attempts() < 2"

Marathon

  1. "labels": {
  2. "traefik.http.middlewares.limit.buffering.retryExpression": "IsNetworkError() && Attempts() < 2"
  3. }

Rancher

  1. labels:
  2. - "traefik.http.middlewares.limit.buffering.retryExpression=IsNetworkError() && Attempts() < 2"

File (TOML)

  1. [http.middlewares]
  2. [http.middlewares.limit.buffering]
  3. retryExpression = "IsNetworkError() && Attempts() < 2"

File (YAML)

  1. http:
  2. middlewares:
  3. limit:
  4. buffering:
  5. retryExpression: "IsNetworkError() && Attempts() < 2"

The retry expression is defined as a logical combination of the functions below with the operators AND (&&) and OR (||). At least one function is required:

  • Attempts() number of attempts (the first one counts)
  • ResponseCode() response code of the service
  • IsNetworkError() - if the response code is related to networking error