| 341 | |
| 342 | |
| 343 | def choose_encoder(accept_header: str) -> Tuple[Callable[[Collector], bytes], str]: |
| 344 | # Python client library accepts a narrower range of content-types than |
| 345 | # Prometheus does. |
| 346 | accept_header = accept_header or '' |
| 347 | escaping = openmetrics.UNDERSCORES |
| 348 | for accepted in accept_header.split(','): |
| 349 | if accepted.split(';')[0].strip() == 'application/openmetrics-text': |
| 350 | toks = accepted.split(';') |
| 351 | version = _get_version(toks) |
| 352 | escaping = _get_escaping(toks) |
| 353 | # Only return an escaping header if we have a good version and |
| 354 | # mimetype. |
| 355 | if not version: |
| 356 | return (partial(openmetrics.generate_latest, escaping=openmetrics.UNDERSCORES, version="1.0.0"), openmetrics.CONTENT_TYPE_LATEST) |
| 357 | if version and parse_version(version) >= (1, 0, 0): |
| 358 | return (partial(openmetrics.generate_latest, escaping=escaping, version=version), |
| 359 | f'application/openmetrics-text; version={version}; charset=utf-8; escaping=' + str(escaping)) |
| 360 | elif accepted.split(';')[0].strip() == 'text/plain': |
| 361 | toks = accepted.split(';') |
| 362 | version = _get_version(toks) |
| 363 | escaping = _get_escaping(toks) |
| 364 | # Only return an escaping header if we have a good version and |
| 365 | # mimetype. |
| 366 | if version and parse_version(version) >= (1, 0, 0): |
| 367 | return (partial(generate_latest, escaping=escaping), |
| 368 | CONTENT_TYPE_LATEST + '; escaping=' + str(escaping)) |
| 369 | return generate_latest, CONTENT_TYPE_PLAIN_0_0_4 |
| 370 | |
| 371 | |
| 372 | def _get_version(accept_header: List[str]) -> str: |