infiniflow/ragflow · error · ValueError
Querit urls must be absolute HTTP or HTTPS URLs.
Error message
Querit urls must be absolute HTTP or HTTPS URLs.
What it means
ValueError from _validate_contents_inputs(): every entry in the urls list must parse as an absolute HTTP(S) URL — scheme exactly 'http' or 'https' AND a non-empty netloc. Scheme-relative ('//host/path'), bare hostnames ('example.com/page'), and other schemes (ftp://, file://) are rejected.
Source
Thrown at agent/tools/querit.py:378
"format": format,
"crawlTimeout": crawl_timeout,
"extrasMeta": extras_meta,
}
def _normalize_contents_urls(urls: Any) -> Any:
if isinstance(urls, str):
return [url.strip() for url in urls.split(",") if url.strip()]
return urls
def _validate_contents_inputs(urls: Any, format: Any, crawl_timeout: Any, extras_meta: Any) -> None:
if not isinstance(urls, list) or not 1 <= len(urls) <= 10 or any(not isinstance(url, str) or not url.strip() for url in urls):
raise ValueError("Querit urls must contain between 1 and 10 non-empty strings.")
for url in urls:
parsed = urlparse(url)
if parsed.scheme not in {"http", "https"} or not parsed.netloc:
raise ValueError("Querit urls must be absolute HTTP or HTTPS URLs.")
if format not in QUERIT_CONTENT_FORMATS:
raise ValueError("Querit format must be text, markdown, or html.")
if type(crawl_timeout) is not int or not 1 <= crawl_timeout <= 60:
raise ValueError("Querit crawl_timeout must be an integer from 1 to 60.")
if type(extras_meta) is not bool:
raise ValueError("Querit extras_meta must be a boolean.")
def _validate_contents_response(response_data: Any) -> None:
if not isinstance(response_data, dict):
raise TypeError("Querit API response must be a JSON object.")
if "results" in response_data and not isinstance(response_data["results"], list):
raise TypeError("Querit API response field results must be an array.")
if "statuses" in response_data and not isinstance(response_data["statuses"], list):
raise TypeError("Querit API response field statuses must be an array.")
def _validate_search_inputs(View on GitHub (pinned to 554fb1133a)
Solutions
- Prefix each URL with http:// or https:// (prefer https).
- Normalize before the call: if '://' not in url, prepend 'https://'.
- Remove ftp://, file://, mailto: entries — only http(s) is supported.
- Validate with urllib.parse.urlparse in your caller so bad rows are dropped or fixed before invoking the tool.
Example fix
# before
urls = ["example.com/page", "ftp://x.com/f"]
# after
from urllib.parse import urlparse
raw = ["example.com/page", "https://ok.com"]
urls = [u if urlparse(u).scheme in {"http", "https"} else "https://" + u for u in raw if not u.startswith("ftp://")] Defensive patterns
Strategy: validation
Validate before calling
from urllib.parse import urlparse
def absolute_http_urls(urls: list[str]) -> bool:
return all(urlparse(u).scheme in {"http", "https"} and urlparse(u).netloc for u in urls) Type guard
def is_absolute_http_url(u: Any) -> bool:
if not isinstance(u, str):
return False
p = urlparse(u)
return p.scheme in {"http", "https"} and bool(p.netloc) Try / catch
try:
querit_contents._invoke(urls=urls)
except ValueError as e:
if "absolute HTTP" in str(e):
urls = ["https://" + u if not urlparse(u).scheme else u for u in urls]
querit_contents._invoke(urls=urls)
raise Prevention
- Normalize scheme-less inputs by prefixing https:// at the boundary.
- Reject ftp/file/mailto schemes in ingestion pipelines before they reach Querit.
- Prefer copying full URLs (with scheme) from browser address bars.
When it happens
Trigger: urls containing 'example.com/page' (no scheme), '//cdn.example.com/x' (protocol-relative), 'ftp://files.example.com/x', or a value like 'https://' with empty netloc.
Common situations: Users pasting URLs copied from browsers that strip the scheme; LLM tool-call outputs emitting bare domains; data pipelines carrying internal ftp/file URIs; trailing whitespace is fine (stripped earlier) but missing scheme is not.
Related errors
- Querit urls must contain between 1 and 10 non-empty strings.
- Querit format must be text, markdown, or html.
- Querit crawl_timeout must be an integer from 1 to 60.
- Querit extras_meta must be a boolean.
- Querit count must be an integer greater than or equal to 1.
AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15).
Data as JSON: /api/errors/0009d52b8a84a6de.
Report an issue: GitHub.