A Java library for reading and writing HTTP Archive (HAR) files.
- ✅ Read HAR files from File, String, or InputStream
- ✅ Write HAR data to File, OutputStream, Writer, or byte array
- ✅ Fluent builder API for creating HAR data structures
- ✅ Support for non-standard date formats (LAX mode)
- ✅ Customizable Jackson ObjectMapper configuration
- ✅ Support for additional non-standard HAR fields
- ✅ Fully compliant with HAR 1.2 specification
- ✅ Records-based immutable model (Java 17+)
- Java 17 or higher
- Jackson 3.x (for version 4.0.0+)
- Jackson 2.x (for version 3.1.6 and earlier)
Add the dependency to your pom.xml:
<dependency>
<groupId>de.sstoehr</groupId>
<artifactId>har-reader</artifactId>
<version>4.0.1</version>
</dependency>HarReader harReader = new HarReader();
Har har = harReader.readFromFile(new File("myhar.har"));
System.out.println(har.log().creator().name());HarReader harReader = new HarReader();
Har har = harReader.readFromString("{ ... HAR-JSON-Data ... }");Some HAR generators use date formats that don't comply with the specification. Use LAX mode to handle these gracefully:
HarReader harReader = new HarReader();
Har har = harReader.readFromFile(new File("myhar.har"), HarReaderMode.LAX);
// or
Har har = harReader.readFromString("{ ... }", HarReaderMode.LAX);For more control over date parsing, see the Customization section.
Har har = new Har();
HarWriter harWriter = new HarWriter();
harWriter.writeTo(new File("myhar.har"), har);Har har = new Har();
HarWriter harWriter = new HarWriter();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
harWriter.writeTo(baos, har);Har har = new Har();
HarWriter harWriter = new HarWriter();
StringWriter sw = new StringWriter();
harWriter.writeTo(sw, har);Har har = new Har();
HarWriter harWriter = new HarWriter();
byte[] harBytes = harWriter.writeAsBytes(har);Create HAR data structures using the fluent builder API:
Har har = Har.builder()
.log(HarLog.builder()
.creator(HarCreatorBrowser.builder()
.name("HAR reader")
.version("1.0")
.build())
.entry(HarEntry.builder()
.pageref("page_0")
.startedDateTime(ZonedDateTime.parse("2021-01-01T00:00:00Z"))
.time(42)
.request(HarRequest.builder()
.method(HttpMethod.GET.name())
.url("https://www.example.com")
.httpVersion("HTTP/1.1")
.build())
.response(HarResponse.builder()
.status(200)
.statusText("OK")
.httpVersion("HTTP/1.1")
.build())
.build())
.build())
.build();The builders support both single and batch operations:
// Add single entry
harLogBuilder.page(HarPage page);
// Add multiple entries (does NOT replace existing entries)
harLogBuilder.pages(List<HarPage> pages);
// Clear all entries
harLogBuilder.clearPages();Use .toBuilder() to create a modified copy of an existing object:
Har updatedHar = har.toBuilder()
.log(har.log().toBuilder()
.comment("Updated comment")
.build())
.build();Create a custom MapperFactory to configure Jackson's ObjectMapper behavior:
public class MyMapperFactory implements MapperFactory {
public ObjectMapper instance(HarReaderMode mode) {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
// Configure Jackson object mapper as needed
// e.g., custom date deserializers, property naming strategies, etc.
mapper.registerModule(module);
return mapper;
}
}Use your custom factory:
HarReader harReader = new HarReader(new MyMapperFactory());See DefaultMapperFactory for reference.
- Dependency updates
If you need Jackson 2 support, use version 3.1.6.
- Dependency updates
int to long
Major modernization release:
- Minimum Java version: 17
- Records-based model (immutable by default)
ZonedDateTimeinstead ofDate- Proper
@Nullableand@NotNullannotations
Full Release Details & Breaking Changes
View Older Releases
- 2.5.0 (2024-11-20): Fixed browser field nullability
- 2.4.1 (2024-11-15): Fixed duplicate fields issue
- 2.4.0 (2024-11-13): HAR serialization support, unknown HTTP methods/status codes
- 2.3.0 (2023-11-17): Dropped Java 7 support
- 2.2.1 (2022-05-26): Default values compliance
- 2.2.0 (2021-03-27): Support for additional non-standard fields
- 2.1.x (2018-2020): Various dependency updates and minor enhancements
- 2.0.0 (2015-08-30): Customizable MapperFactory support
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE.md file for details.