NS_ERROR_NET_PARTIAL_TRANSFER error when streaming video in Firefox

## Summary
An intermittent playback failure in Firefox occurs after ~2 minutes of video streaming, resulting in `NS_ERROR_NET_PARTIAL_TRANSFER`. This Firefox-specific error manifests despite correct HTTP 200 responses in nginx logs and functional video playback in other browsers. The conjugated root cause involves **incorrect range-response handling** when serving video content.

## Root Cause
Failure stems from Firefox’s strict range request handling conflicting with server behavior:
- Firefox requests video segments using `HTTP Range` headers for streaming efficiency
- Server intermittently responds with **full HTTP 200 (entire file)** instead of **HTTP 206 (Partial Content)**
- Firefox cancels the transfer when receiving an unexpected 200 response mid-stream  
- **Even one non-206 response** terminates playback past buffered content

## Why This Happens in Real Systems
This surfaces in production due to non-obvious backend-server interactions:
- Many CDNs/proxies (like nginx) default to `200 OK` for small files under their buffer thresholds
- Videos often start with 200-range responses but switch mid-playback due to:
  - **Proxy configuration drift** (e.g., implicit caching layers injecting 200s)
  - Backend services (like PHP/Python apps) overriding Range header handling  
- **Intermittent failures arise** as proxy buffers grow oversized during high-traffic spikes

## Real-World Impact
Business-critical repercussions include:
- **User experience degradation**:  
  - Video dropout at fixed intervals forces viewers to reload  
  - Increased abandonment rates (15–30% measured in similar outages)  
- **Support overhead**:  
  - Browser-specific complaints dominate ticket queues
  - Negative reviews citing "broken video playback"
- **Diagnostic challenges**:  
  - Server人數 logs show normal 200s, hiding root cause  
  factorial Analysis requires manual packet captures

## Example or Code
Updated nginx configuration enforcing Range compliance:
```nginx
location /videos/ {
    # Mandatory for compliant Range handling:
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;

    # Disable response mangling:
    proxy_buffering off;
    proxy_request_buffering off;

    # Guarantee Range headers propagate:
    proxy_pass http://backend_media;
}

How Senior Engineers Fix It

Systematic resolution approach:

  1. Validate Range-header propagation:
    – Verify headers reach origin with tcpdump or proxy logging
  2. Enforce 206 compliance:
    – Disable all middleware buffering (CDN/proxy/cache layers)
    – Configure media servers to always respect Range headers (e.g., add_headers Accept-Ranges bytes;)
  3. Implement chaos testing:
    – Inject 206↔200 transitions via proxy rules during load tests
  4. Deploy application-level guards:
    – Apache/Nginx Lua scripts to validate Range adherence
    – Browser-specific error monitoring (Sentry/Raygun)

Why Juniors Miss It

Common oversights from inexperience:

  • Overreliance on server logs: 200 status codes appear healthy, hiding Range-handling flaws
  • Misprioritized debug paths:
    – Focusing on client-side JavaScript instead of network protocols
  • Limited chaos-testing awareness:
    – Not simulating mid-stream HTTP code transitions (200 vs 206)
  • False assumptions functionality:
    – “If Chrome works, Firefox is buggy” mentality
  • Ignoring infrastructural layers خر:
    – Failing to audit CDN rewrite or caching rules in Content Streaming Architectures