iawia002/lux · warning

Content-Length is not present

Error message

Content-Length is not present

What it means

request.Size fetches the response headers (via Headers) and reads the Content-Length header to determine file size. When the header is absent it returns this error. Servers replying with chunked transfer-encoding, or redirects ending at a page without a length, omit Content-Length even though the request succeeded.

Source

Thrown at request/request.go:200

		"Referer": refer,
	}
	res, err := Request(http.MethodGet, url, nil, headers)
	if err != nil {
		return nil, errors.WithStack(err)
	}
	defer res.Body.Close() // nolint
	return res.Header, nil
}

// Size get size of the url
func Size(url, refer string) (int64, error) {
	h, err := Headers(url, refer)
	if err != nil {
		return 0, err
	}
	s := h.Get("Content-Length")
	if s == "" {
		return 0, errors.New("Content-Length is not present")
	}
	size, err := strconv.ParseInt(s, 10, 64)
	if err != nil {
		return 0, err
	}
	return size, nil
}

// ContentType get Content-Type of the url
func ContentType(url, refer string) (string, error) {
	h, err := Headers(url, refer)
	if err != nil {
		return "", err
	}
	s := h.Get("Content-Type")
	// handle Content-Type like this: "text/html; charset=utf-8"
	return strings.Split(s, ";")[0], nil
}

View on GitHub (pinned to dd00f6d258)

Solutions

  1. Fall back to a ranged GET (Range: bytes=0-0) and parse the total from the Content-Range header (bytes 0-0/TOTAL)
  2. Or treat unknown size as -1/0 and stream-download with an indeterminate progress bar
  3. Check with curl -sI whether the URL consistently lacks Content-Length; if it is a redirect, resolve the final URL first and size that
  4. Patch request.Size in request/request.go to do the Content-Range fallback automatically

Example fix

// before
s := h.Get("Content-Length")
if s == "" {
    return 0, errors.New("Content-Length is not present")
}

// after (ranged-GET fallback to Content-Range)
s := h.Get("Content-Length")
if s == "" {
    req, _ := http.NewRequest(http.MethodGet, url, nil)
    req.Header.Set("Range", "bytes=0-0")
    res, err := client.Do(req)
    if err == nil {
        defer res.Body.Close() // nolint
        if cr := res.Header.Get("Content-Range"); cr != "" {
            if total := strings.Split(cr, "/"); len(total) == 2 {
                return strconv.ParseInt(total[1], 10, 64)
            }
        }
    }
    return 0, errors.New("Content-Length is not present")
}
Defensive patterns

Strategy: fallback

Try / catch

size, err := request.Size(mediaURL, referer)
if err != nil && strings.Contains(err.Error(), "Content-Length is not present") {
    // ranged GET fallback: total is in Content-Range 'bytes 0-0/TOTAL'
    req, _ := http.NewRequest(http.MethodGet, mediaURL, nil)
    req.Header.Set("Range", "bytes=0-0")
    if res, rerr := http.DefaultClient.Do(req); rerr == nil {
        cr := res.Header.Get("Content-Range")
        res.Body.Close() // nolint
        if parts := strings.Split(cr, "/"); len(parts) == 2 {
            size, err = strconv.ParseInt(parts[1], 10, 64)
        }
    }
    if err != nil {
        size = -1 // proceed with unknown size
    }
}

Prevention

When it happens

Trigger: Any extractor calling request.Size against a media URL whose server responds with Transfer-Encoding: chunked, a 30x redirect chain ending on a page without Content-Length, or a CDN that omits the header for signed/pre-flight requests.

Common situations: HLS/DASH-style CDNs, dynamic endpoints, and some object stores behind proxies. Downloaders that need a size for progress reporting hit this on otherwise-downloadable streams.

Related errors


AI-assisted analysis of iawia002/lux@dd00f6d258 (2026-08-15). Data as JSON: /api/errors/6c7153236f34fd55. Report an issue: GitHub.