Skip to content

Library for accessing HTTP Archives (HAR) with Java

License

Notifications You must be signed in to change notification settings

sdstoehr/har-reader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HAR reader

Read HTTP Archives with Java.

<dependency>
  <groupId>de.sstoehr</groupId>
  <artifactId>har-reader</artifactId>
  <version>3.0.1</version>
</dependency>

Build Status codecov Maven Central

Usage

Reading HAR

Reading HAR from File:

HarReader harReader = new HarReader();
Har har = harReader.readFromFile(new File("myhar.har"));
System.out.println(har.log().creator().name());

Reading HAR from String:

HarReader harReader = new HarReader();
Har har = harReader.readFromString("{ ... HAR-JSON-Data ... }");

Some HAR generators use date formats, which are not according to the specification. You can tell HAR reader to ignore those fields instead of throwing an exception:

HarReader harReader = new HarReader();   
Har har = harReader.readFromFile(new File("myhar.har"), HarReaderMode.LAX);
Har har = harReader.readFromString("{ ... HAR-JSON-Data ... }", HarReaderMode.LAX);

You can also follow the next section and configure your own mapping configuration to deal with these fields.

Writing HAR

Writing HAR to File:

Har har = new Har();
HarWriter harWriter = new HarWriter();
harWriter.writeTo(new File("myhar.har"), har);

Writing HAR to OutputStream:

Har har = new Har();
HarWriter harWriter = new HarWriter();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
harWriter.writeTo(baos, har);

Writing HAR to Writer:

Har har = new Har();
HarWriter harWriter = new HarWriter();
StringWriter sw = new StringWriter();
harWriter.writeTo(sw, har);

Writing HAR as bytes:

Har har = new Har();
HarWriter harWriter = new HarWriter();
byte[] harBytes = harWriter.writeAsBytes(har);

Manually creating HAR data structures:

The model objects can be created by using the provided 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 allow to add single entries to lists or multiple entries at once, e.g.:

harLogBuilder.page(HarPage page); // add a single page
harLogBuilder.pages(List<HarPage> pages); // add multiple pages (it is NOT replacing previously added pages!)
harLogBuilder.clearPages(); // clear previously added pages

To update an existing object, you can use .toBuilder() to obtain a prefilled builder:

Har updatedHar = har.toBuilder()
        .log(har.log().toBuilder()
                .comment("Updated comment")
                .build())
        .build();

Customizing HAR reader

As of version 2.0.0 you can create your own MapperFactory (DefaultMapperFactory)

public class MyMapperFactory implements MapperFactory {
    public ObjectMapper instance(HarReaderMode mode) {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        
        // configure Jackson object mapper as needed

        mapper.registerModule(module);
        return mapper;
    }
}

You can now use your configuration by instantiating the HarReader with your MapperFactory:

HarReader harReader = new HarReader(new MyMapperFactory());

Latest Releases

3.0.1 - 2024-12-21

  • Minimum Java version is now 17
    • Make use of records
    • Use ZonedDateTime instead of Date
  • Properly annotated fields with @Nullable and @NotNull
  • Please see full list of breaking changes in the changelog details

Details

2.5.0 - 2024-11-20

  • Fixed browser field to be nullable as required according to spec. (Previous versions mistakenly returned an empty browser object instead)

Details

2.4.1 - 2024-11-15

  • Changes see 2.4.0
  • Fixed issue introduced with 2.4.0 with duplicate fields

Details

2.4.0 - 2024-11-13

  • Updated dependencies
  • Added support for unknown HTTP methods or status codes
  • Added support to serialize HAR data back to JSON

Details

2.3.0 - 2023-11-17

  • Updated dependencies
  • Requires Java 8 or later: dropped support for Java 7

Details

Older releases

2.2.1 - 2022-05-26

  • Updated dependencies
  • #82: Make sure default values from HAR entities satisfies specification

Details

2.2.0 - 2021-03-27

  • Updated dependencies
  • Added support for fields, which are not supported in official spec. You can access these fields using Map<String, Object> getAdditional()

Details

2.1.10 - 2020-10-05

  • Updated dependencies

Details

2.1.9 - 2020-06-30

  • Updated dependencies

This is the first release, which is provided both on GitHub and Maven Central repository.

Details

2.1.8 - 2020-05-24

  • Updated dependencies

Details

2.1.7 - 2019-11-05

  • Updated dependencies

Details

2.1.6 - 2019-10-04

  • Updated dependencies

Details

2.1.5 - 2019-09-06

  • Updated dependencies

Details

2.1.4 - 2019-05-24

  • Updated dependencies

Details

2.1.3 - 2018-10-18

Details

2.1.2 - 2018-08-02

  • Added support for several HTTP status codes, e.g. (308, 422 - 451, 505 - 511)

Details

2.1.1 - 2018-07-26

  • Added support for HTTP method: PATCH

Details

2.1.0 - 2018-03-11

  • You can now access additional fields, which are not part of the HAR spec:
response.getAdditional().get("_transferSize");

Details

2.0.3 - 2017-04-14

  • Added equals and hashCode methods

2.0.2 - 2016-11-21

  • Added CCM_POST HttpMethod to enum

2.0.1 - 2016-04-16

  • Ignore invalid integers in lax mode

Details

2.0.0 - 2015-08-30

  • HAR reader is now easier customizable. Use your own MapperFactory to adjust HAR reader for your project!
  • HAR reader threw exceptions, when required fields were empty. This behaviour was changed, so that you can now read non-standard-compliant HAR files

Details