Implementing Response Compression

1. Using gzip Compression

PropertyValue
AlgorithmDEFLATE (LZ77 + Huffman)
Browser supportUniversal
Compression ratio (JSON)60-80%
CPU costLow-moderate
HeaderContent-Encoding: gzip

2. Using Brotli Compression

PropertyValue
Compression ratio15-25% better than gzip
Decompression speedComparable to gzip
Compression speed (high level)Slower than gzip
Browser supportAll modern (HTTPS only)
HeaderContent-Encoding: br

3. Using deflate Compression

NoteDetail
StatusLegacy; rarely used
Compatibility issuesImplementations differ (raw deflate vs zlib wrap)
RecommendationSkip; offer gzip + br

4. Configuring Compression Thresholds

SettingTypical
Min size to compress1 KB (smaller = overhead exceeds gain)
Skip already-compressedimage/*, video/*, application/zip
Compress JSON / HTML / CSS / JSAlways

5. Setting Content-Encoding Header

HeaderUse
Content-Encoding: gzipResponse gzipped
Content-Encoding: brResponse Brotli
Vary: Accept-EncodingRequired for caches

6. Handling Compressed Request Bodies

PatternNotes
Client sends Content-Encoding: gzipServer must decompress
Less common than response compressionUseful for large uploads (logs, telemetry)
Reject unsupported encoding415 Unsupported Media Type

7. Implementing Conditional Compression

ConditionAction
Client supports brUse Brotli (best ratio)
Client supports gzip onlyUse gzip
NeitherSend uncompressed
Already compressed typeSkip compression

8. Optimizing Compression Levels

AlgorithmLevelsRecommendation
gzip1 (fast) – 9 (max)Level 6 (balanced)
Brotli0 – 114-6 dynamic, 11 static
Pre-compress staticGenerate .gz / .brServe directly

9. Measuring Compression Performance

MetricTrack
Compression ratioBytes out / bytes in
CPU timems per request added
Bandwidth savedTotal bytes saved per day
Time-to-first-byteMay increase slightly with compression

10. Handling Compression Errors

ErrorMitigation
Out-of-memory on huge responseStream compression, chunk transfer
Client decompression failureFallback to identity
BREACH attack on HTTPS+gzipAvoid reflecting user input in compressed responses with secrets