Skip to content

reportportal/logger-java-httpcomponents

Repository files navigation

Report Portal logger for Apache HttpComponents client

Maven Central CI Build codecov Join Slack chat! stackoverflow Build with Love

The latest version: 5.1.4. Please use Maven Central link above to get the logger.

Overview

Apache HttpComponents Request/Response logging interceptor for Report Portal

The logger intercept and logs all Requests and Responses issued by Apache HttpComponents into Report Portal in Markdown format, including multipart requests. It recognizes payload types and attach them in corresponding manner: image types will be logged as images with thumbnails, binary types will be logged as entry attachments, text types will be formatted and logged in Markdown code blocks.

Configuration

Build system configuration

You need to add the logger as one of your dependencies in Maven or Gradle.

Maven

pom.xml

<project>
    <!-- project declaration omitted -->

    <dependencies>
        <dependency>
            <groupId>com.epam.reportportal</groupId>
            <artifactId>logger-java-httpcomponents</artifactId>
            <version>5.1.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- build config omitted -->
</project>

Gradle

build.gradle

dependencies {
    testImplementation 'com.epam.reportportal:logger-java-httpcomponents:5.1.4'
}

HTTP Client configuration

To start getting Request and Response logging in Report Portal you need to add the logger as one of your HTTP Client interceptors. The best place for it is one before hook methods. E.G. @BeforeClass method for TestNG or @BeforeAll method for JUnit 5:

public class BaseTest {
	private final ReportPortalHttpLoggingInterceptor logger = new ReportPortalHttpLoggingInterceptor(LogLevel.INFO);

	private HttpClient client;

	@BeforeClass
	public void setupHttpClient() {
		client = HttpClientBuilder.create()
				.addInterceptorLast((HttpRequestInterceptor) logger)
				.addInterceptorLast((HttpResponseInterceptor) logger)
				.build();
	}
}

Sanitize Request / Response data

To avoid logging sensitive data into Report Portal you can use corresponding converters:

  • Cookie converter
  • Header converter
  • URI converter
  • Content prettiers

Cookie, Header and URI converters are set in the logger constructor:

public class BaseTest {
	private final ReportPortalHttpLoggingInterceptor logger = new ReportPortalHttpLoggingInterceptor(LogLevel.INFO,
			SanitizingHttpHeaderConverter.INSTANCE,
			DefaultHttpHeaderConverter.INSTANCE
	);

	private HttpClient client;

	@BeforeClass
	public void setupHttpClient() {
		client = HttpClientBuilder.create()
				.addInterceptorLast((HttpRequestInterceptor) logger)
				.addInterceptorLast((HttpResponseInterceptor) logger)
				.build();
	}
}

You are free to implement any converter by yourself with java.util.function.Function interface.

Content prettier are more complex, they parse data based on its content type and apply defined transformations. Default prettiers just pretty-print JSON, HTML and XML data. To apply a custom content prettier call ReportPortalHttpLoggingInterceptor.setContentPrettiers. E.G.:

public class BaseTest {
	private static final Map<String, Function<String, String>> MY_PRETTIERS = new HashMap<String, Function<String, String>>() {{
		put(ContentType.APPLICATION_XML.getMimeType(), XmlPrettier.INSTANCE);
		put(ContentType.APPLICATION_SOAP_XML.getMimeType(), XmlPrettier.INSTANCE);
		put(ContentType.APPLICATION_ATOM_XML.getMimeType(), XmlPrettier.INSTANCE);
		put(ContentType.APPLICATION_SVG_XML.getMimeType(), XmlPrettier.INSTANCE);
		put(ContentType.APPLICATION_XHTML_XML.getMimeType(), XmlPrettier.INSTANCE);
		put(ContentType.TEXT_XML.getMimeType(), XmlPrettier.INSTANCE);
		put(ContentType.APPLICATION_JSON.getMimeType(), JsonPrettier.INSTANCE);
		put("text/json", JsonPrettier.INSTANCE);
		put(ContentType.TEXT_HTML.getMimeType(), HtmlPrettier.INSTANCE);
	}};

	private final ReportPortalHttpLoggingInterceptor logger = new ReportPortalHttpLoggingInterceptor(LogLevel.INFO).setContentPrettiers(
			MY_PRETTIERS);

	private HttpClient client;

	@BeforeClass
	public void setupHttpClient() {
		client = HttpClientBuilder.create()
				.addInterceptorLast((HttpRequestInterceptor) logger)
				.addInterceptorLast((HttpResponseInterceptor) logger)
				.build();
	}
}