@@ -48,6 +48,23 @@ class Config(BaseSettings):
4848 description = "Minimum storage size in MB free" ,
4949 )
5050
51+ # Compression settings
52+ COMPRESSION_ENABLED : bool = Field (
53+ default = True ,
54+ validation_alias = "APP_COMPRESSION_ENABLED" ,
55+ description = "Enable gzip compression for paste content"
56+ )
57+ COMPRESSION_THRESHOLD_BYTES : int = Field (
58+ default = 512 ,
59+ validation_alias = "APP_COMPRESSION_THRESHOLD_BYTES" ,
60+ description = "Minimum content size in bytes to trigger compression"
61+ )
62+ COMPRESSION_LEVEL : int = Field (
63+ default = 6 ,
64+ validation_alias = "APP_COMPRESSION_LEVEL" ,
65+ description = "Gzip compression level (1-9, 6=balanced)"
66+ )
67+
5168 KEEP_DELETED_PASTES_TIME_HOURS : int = Field (
5269 default = 336 ,
5370 validation_alias = "APP_KEEP_DELETED_PASTES_TIME_HOURS" ,
@@ -129,6 +146,28 @@ def validate_cors_domains(cls, domains: list[str], info) -> list[str]:
129146 logging .info ("CORS domains: %s" , domains )
130147 return domains
131148
149+ @field_validator ("COMPRESSION_LEVEL" , mode = "after" )
150+ def validate_compression_level (cls , level : int ) -> int :
151+ """Validate compression level is in valid range."""
152+ if not 1 <= level <= 9 :
153+ logging .warning (
154+ "Invalid compression level %d, must be 1-9. Using default 6." ,
155+ level
156+ )
157+ return 6
158+ return level
159+
160+ @field_validator ("COMPRESSION_THRESHOLD_BYTES" , mode = "after" )
161+ def validate_compression_threshold (cls , threshold : int ) -> int :
162+ """Validate compression threshold is reasonable."""
163+ if threshold < 0 :
164+ logging .warning (
165+ "Invalid compression threshold %d, must be >= 0. Using default 512." ,
166+ threshold
167+ )
168+ return 512
169+ return threshold
170+
132171
133172config = Config ()
134173
0 commit comments