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
- Fall back to a ranged GET (Range: bytes=0-0) and parse the total from the Content-Range header (bytes 0-0/TOTAL)
- Or treat unknown size as -1/0 and stream-download with an indeterminate progress bar
- Check with curl -sI whether the URL consistently lacks Content-Length; if it is a redirect, resolve the final URL first and size that
- 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
- Never assume Content-Length exists; always code the Content-Range fallback
- Resolve redirect chains to the final media URL before sizing
- Design downloaders to proceed with unknown size instead of aborting
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.