earlydata

package
v2.42.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 9, 2023 License: MIT Imports: 1 Imported by: 0

README

Early Data Middleware

The Early Data middleware for Fiber adds support for TLS 1.3's early data ("0-RTT") feature. Citing RFC 8446, when a client and server share a PSK, TLS 1.3 allows clients to send data on the first flight ("early data") to speed up the request, effectively reducing the regular 1-RTT request to a 0-RTT request.

Make sure to enable fiber's EnableTrustedProxyCheck config option before using this middleware in order to not trust bogus HTTP request headers of the client.

Also be aware that enabling support for early data in your reverse proxy (e.g. nginx, as done with a simple ssl_early_data on;) makes requests replayable. Refer to the following documents before continuing:

By default, this middleware allows early data requests on safe HTTP request methods only and rejects the request otherwise, i.e. aborts the request before executing your handler. This behavior can be controlled by the AllowEarlyData config option. Safe HTTP methods — GET, HEAD, OPTIONS and TRACE — should not modify a state on the server.

Table of Contents

Signatures

func New(config ...Config) fiber.Handler

Examples

First import the middleware from Fiber,

import (
	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/middleware/earlydata"
)

Then create a Fiber app with app := fiber.New().

Default Config
app.Use(earlydata.New())
Custom Config
app.Use(earlydata.New(earlydata.Config{
	Error: fiber.ErrTooEarly,
	// ...
}))
Config
type Config struct {
	// Next defines a function to skip this middleware when returned true.
	//
	// Optional. Default: nil
	Next func(c *fiber.Ctx) bool

	// IsEarlyData returns whether the request is an early-data request.
	//
	// Optional. Default: a function which checks if the "Early-Data" request header equals "1".
	IsEarlyData func(c *fiber.Ctx) bool

	// AllowEarlyData returns whether the early-data request should be allowed or rejected.
	//
	// Optional. Default: a function which rejects the request on unsafe and allows the request on safe HTTP request methods.
	AllowEarlyData func(c *fiber.Ctx) bool

	// Error is returned in case an early-data request is rejected.
	//
	// Optional. Default: fiber.ErrTooEarly.
	Error error
}
Default Config
var ConfigDefault = Config{
	IsEarlyData: func(c *fiber.Ctx) bool {
		return c.Get("Early-Data") == "1"
	},

	AllowEarlyData: func(c *fiber.Ctx) bool {
		return fiber.IsMethodSafe(c.Method())
	},

	Error: fiber.ErrTooEarly,
}

Documentation

Index

Constants

View Source
const (
	DefaultHeaderName      = "Early-Data"
	DefaultHeaderTrueValue = "1"
)

Variables

View Source
var ConfigDefault = Config{
	IsEarlyData: func(c *fiber.Ctx) bool {
		return c.Get(DefaultHeaderName) == DefaultHeaderTrueValue
	},

	AllowEarlyData: func(c *fiber.Ctx) bool {
		return fiber.IsMethodSafe(c.Method())
	},

	Error: fiber.ErrTooEarly,
}

ConfigDefault is the default config

Functions

func IsEarly

func IsEarly(c *fiber.Ctx) bool

func New

func New(config ...Config) fiber.Handler

New creates a new middleware handler https://datatracker.ietf.org/doc/html/rfc8470#section-5.1

Types

type Config

type Config struct {
	// Next defines a function to skip this middleware when returned true.
	//
	// Optional. Default: nil
	Next func(c *fiber.Ctx) bool

	// IsEarlyData returns whether the request is an early-data request.
	//
	// Optional. Default: a function which checks if the "Early-Data" request header equals "1".
	IsEarlyData func(c *fiber.Ctx) bool

	// AllowEarlyData returns whether the early-data request should be allowed or rejected.
	//
	// Optional. Default: a function which rejects the request on unsafe and allows the request on safe HTTP request methods.
	AllowEarlyData func(c *fiber.Ctx) bool

	// Error is returned in case an early-data request is rejected.
	//
	// Optional. Default: fiber.ErrTooEarly.
	Error error
}

Config defines the config for middleware.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL