A modern, extensible, and type-safe Python library for parsing, transforming, and analyzing HAR (HTTP Archive) files. Built on Pydantic, Hario-Core provides robust validation, flexible transformation, and easy extension for custom HAR formats.
- Type-Safe Parsing: Validates HAR files using Pydantic models, catching errors early.
- Transformers: Apply built-in or custom transformations to each HAR entry (e.g., flatten, normalizations).
- Normalization: Ensures all numeric fields (sizes, timings) are non-negative, so you can safely sum, aggregate, and analyze data without errors from negative values. This is crucial for analytics and reporting.
- Deterministic & Random IDs: Generate unique or deterministic IDs for each entry. Deterministic IDs ensure that the same request always gets the same ID—useful for deduplication, comparison, and building analytics pipelines.
- Extensible: Register your own entry models to support browser-specific or proprietary HAR extensions (e.g., Chrome DevTools, Safari).
- Composable Pipelines: Chain any number of transformers and ID strategies for flexible data processing.
pip install hario-core
from hario_core.parse import parse
har_log = parse("example.har")
entries = har_log.model_dump()["entries"] # list of dicts
from hario_core.transform import Pipeline, flatten, set_id, by_field
pipeline = Pipeline([
set_id(by_field(["request.url", "startedDateTime"]))
])
results = pipeline.process(entries)
from hario_core.parse import register_entry_model
from hario_core.models import Entry
def is_custom_entry(entry: dict) -> bool:
return "x-custom" in entry
class CustomEntry(Entry):
x_custom: str
register_entry_model(is_custom_entry, CustomEntry)
parse(path_or_bytes_or_filelike) -> HarLog
validate(har_dict: dict) -> HarLog
register_entry_model(detector: Callable, model: Type[Entry])
entry_selector(entry_dict: dict) -> Type[Entry]
Entry
,HarLog
,DevToolsEntry
(and all standard HAR 1.2 models)
Pipeline
,flatten
,normalize_sizes
,normalize_timings
,set_id
,by_field
,uuid
,json_array_handler
MIT License. See LICENSE.
- Python 3.10+