Browse Source
			
			
			
			
				
		* encode: implement prefer setting * encode: minimum_length configurable via caddyfile * encode: configurable content-types which to encode * file_server: support precompressed files * encode: use ReponseMatcher for conditional encoding of content * linting error & documentation of encode.PrecompressedOrder * encode: allow just one response matcher also change the namespace of the encoders back, I accidently changed to precompressed >.> default matchers include a * to match to any charset, that may be appended * rounding of the PR * added integration tests for new caddyfile directives * improved various doc strings (punctuation and typos) * added json tag for file_server precompress order and encode matcher * file_server: add vary header, remove accept-ranges when serving precompressed files * encode: move Suffix implementation to precompressed modulesmaster
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 12 changed files with 768 additions and 49 deletions
			
			
		| @ -0,0 +1,66 @@ | |||||
|  | :80 | ||||
|  | 
 | ||||
|  | encode gzip zstd { | ||||
|  | 	minimum_length 256 | ||||
|  | 	prefer zstd gzip | ||||
|  | 	match { | ||||
|  | 		status 2xx 4xx 500 | ||||
|  | 		header Content-Type text/* | ||||
|  | 		header Content-Type application/json* | ||||
|  | 		header Content-Type application/javascript* | ||||
|  | 		header Content-Type application/xhtml+xml* | ||||
|  | 		header Content-Type application/atom+xml* | ||||
|  | 		header Content-Type application/rss+xml* | ||||
|  | 		header Content-Type image/svg+xml* | ||||
|  | 	} | ||||
|  | } | ||||
|  | ---------- | ||||
|  | { | ||||
|  | 	"apps": { | ||||
|  | 		"http": { | ||||
|  | 			"servers": { | ||||
|  | 				"srv0": { | ||||
|  | 					"listen": [ | ||||
|  | 						":80" | ||||
|  | 					], | ||||
|  | 					"routes": [ | ||||
|  | 						{ | ||||
|  | 							"handle": [ | ||||
|  | 								{ | ||||
|  | 									"encodings": { | ||||
|  | 										"gzip": {}, | ||||
|  | 										"zstd": {} | ||||
|  | 									}, | ||||
|  | 									"handler": "encode", | ||||
|  | 									"match": { | ||||
|  | 										"headers": { | ||||
|  | 											"Content-Type": [ | ||||
|  | 												"text/*", | ||||
|  | 												"application/json*", | ||||
|  | 												"application/javascript*", | ||||
|  | 												"application/xhtml+xml*", | ||||
|  | 												"application/atom+xml*", | ||||
|  | 												"application/rss+xml*", | ||||
|  | 												"image/svg+xml*" | ||||
|  | 											] | ||||
|  | 										}, | ||||
|  | 										"status_code": [ | ||||
|  | 											2, | ||||
|  | 											4, | ||||
|  | 											500 | ||||
|  | 										] | ||||
|  | 									}, | ||||
|  | 									"minimum_length": 256, | ||||
|  | 									"prefer": [ | ||||
|  | 										"zstd", | ||||
|  | 										"gzip" | ||||
|  | 									] | ||||
|  | 								} | ||||
|  | 							] | ||||
|  | 						} | ||||
|  | 					] | ||||
|  | 				} | ||||
|  | 			} | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
| @ -0,0 +1,41 @@ | |||||
|  | :80 | ||||
|  | 
 | ||||
|  | file_server { | ||||
|  | 	precompressed zstd br gzip | ||||
|  | } | ||||
|  | ---------- | ||||
|  | { | ||||
|  | 	"apps": { | ||||
|  | 		"http": { | ||||
|  | 			"servers": { | ||||
|  | 				"srv0": { | ||||
|  | 					"listen": [ | ||||
|  | 						":80" | ||||
|  | 					], | ||||
|  | 					"routes": [ | ||||
|  | 						{ | ||||
|  | 							"handle": [ | ||||
|  | 								{ | ||||
|  | 									"handler": "file_server", | ||||
|  | 									"hide": [ | ||||
|  | 										"./Caddyfile" | ||||
|  | 									], | ||||
|  | 									"precompressed": { | ||||
|  | 										"br": {}, | ||||
|  | 										"gzip": {}, | ||||
|  | 										"zstd": {} | ||||
|  | 									}, | ||||
|  | 									"precompressed_order": [ | ||||
|  | 										"zstd", | ||||
|  | 										"br", | ||||
|  | 										"gzip" | ||||
|  | 									] | ||||
|  | 								} | ||||
|  | 							] | ||||
|  | 						} | ||||
|  | 					] | ||||
|  | 				} | ||||
|  | 			} | ||||
|  | 		} | ||||
|  | 	} | ||||
|  | } | ||||
| @ -0,0 +1,31 @@ | |||||
|  | package caddybrotli | ||||
|  | 
 | ||||
|  | import ( | ||||
|  | 	"github.com/caddyserver/caddy/v2" | ||||
|  | 	"github.com/caddyserver/caddy/v2/modules/caddyhttp/encode" | ||||
|  | ) | ||||
|  | 
 | ||||
|  | func init() { | ||||
|  | 	caddy.RegisterModule(BrotliPrecompressed{}) | ||||
|  | } | ||||
|  | 
 | ||||
|  | // BrotliPrecompressed provides the file extension for files precompressed with brotli encoding.
 | ||||
|  | type BrotliPrecompressed struct{} | ||||
|  | 
 | ||||
|  | // CaddyModule returns the Caddy module information.
 | ||||
|  | func (BrotliPrecompressed) CaddyModule() caddy.ModuleInfo { | ||||
|  | 	return caddy.ModuleInfo{ | ||||
|  | 		ID:  "http.precompressed.br", | ||||
|  | 		New: func() caddy.Module { return new(BrotliPrecompressed) }, | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | // AcceptEncoding returns the name of the encoding as
 | ||||
|  | // used in the Accept-Encoding request headers.
 | ||||
|  | func (BrotliPrecompressed) AcceptEncoding() string { return "br" } | ||||
|  | 
 | ||||
|  | // Suffix returns the filename suffix of precompressed files.
 | ||||
|  | func (BrotliPrecompressed) Suffix() string { return ".br" } | ||||
|  | 
 | ||||
|  | // Interface guards
 | ||||
|  | var _ encode.Precompressed = (*BrotliPrecompressed)(nil) | ||||
| @ -0,0 +1,28 @@ | |||||
|  | package caddygzip | ||||
|  | 
 | ||||
|  | import ( | ||||
|  | 	"github.com/caddyserver/caddy/v2" | ||||
|  | 	"github.com/caddyserver/caddy/v2/modules/caddyhttp/encode" | ||||
|  | ) | ||||
|  | 
 | ||||
|  | func init() { | ||||
|  | 	caddy.RegisterModule(GzipPrecompressed{}) | ||||
|  | } | ||||
|  | 
 | ||||
|  | // GzipPrecompressed provides the file extension for files precompressed with gzip encoding.
 | ||||
|  | type GzipPrecompressed struct { | ||||
|  | 	Gzip | ||||
|  | } | ||||
|  | 
 | ||||
|  | // CaddyModule returns the Caddy module information.
 | ||||
|  | func (GzipPrecompressed) CaddyModule() caddy.ModuleInfo { | ||||
|  | 	return caddy.ModuleInfo{ | ||||
|  | 		ID:  "http.precompressed.gzip", | ||||
|  | 		New: func() caddy.Module { return new(GzipPrecompressed) }, | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | // Suffix returns the filename suffix of precompressed files.
 | ||||
|  | func (GzipPrecompressed) Suffix() string { return ".gz" } | ||||
|  | 
 | ||||
|  | var _ encode.Precompressed = (*GzipPrecompressed)(nil) | ||||
| @ -0,0 +1,28 @@ | |||||
|  | package caddyzstd | ||||
|  | 
 | ||||
|  | import ( | ||||
|  | 	"github.com/caddyserver/caddy/v2" | ||||
|  | 	"github.com/caddyserver/caddy/v2/modules/caddyhttp/encode" | ||||
|  | ) | ||||
|  | 
 | ||||
|  | func init() { | ||||
|  | 	caddy.RegisterModule(ZstdPrecompressed{}) | ||||
|  | } | ||||
|  | 
 | ||||
|  | // ZstdPrecompressed provides the file extension for files precompressed with zstandard encoding.
 | ||||
|  | type ZstdPrecompressed struct { | ||||
|  | 	Zstd | ||||
|  | } | ||||
|  | 
 | ||||
|  | // CaddyModule returns the Caddy module information.
 | ||||
|  | func (ZstdPrecompressed) CaddyModule() caddy.ModuleInfo { | ||||
|  | 	return caddy.ModuleInfo{ | ||||
|  | 		ID:  "http.precompressed.zstd", | ||||
|  | 		New: func() caddy.Module { return new(ZstdPrecompressed) }, | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | // Suffix returns the filename suffix of precompressed files.
 | ||||
|  | func (ZstdPrecompressed) Suffix() string { return ".zst" } | ||||
|  | 
 | ||||
|  | var _ encode.Precompressed = (*ZstdPrecompressed)(nil) | ||||
					Loading…
					
					
				
		Reference in new issue