io.qameta.allure.httpclient5.AllureHttpClient5Request Maven / Gradle / Ivy
/*
* Copyright 2016-2024 Qameta Software Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.qameta.allure.httpclient5;
import io.qameta.allure.attachment.AttachmentData;
import io.qameta.allure.attachment.AttachmentProcessor;
import io.qameta.allure.attachment.AttachmentRenderer;
import io.qameta.allure.attachment.DefaultAttachmentProcessor;
import io.qameta.allure.attachment.FreemarkerAttachmentRenderer;
import io.qameta.allure.attachment.http.HttpRequestAttachment;
import org.apache.hc.core5.http.EntityDetails;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.HttpRequestInterceptor;
import org.apache.hc.core5.http.protocol.HttpContext;
import java.util.stream.Stream;
import static io.qameta.allure.attachment.http.HttpRequestAttachment.Builder.create;
/**
* @author a-simeshin (Simeshin Artem)
*/
public class AllureHttpClient5Request implements HttpRequestInterceptor {
private final AttachmentRenderer renderer;
private final AttachmentProcessor processor;
public AllureHttpClient5Request() {
this("http-request.ftl");
}
public AllureHttpClient5Request(final String templateName) {
this(new FreemarkerAttachmentRenderer(templateName), new DefaultAttachmentProcessor());
}
public AllureHttpClient5Request(final AttachmentRenderer renderer,
final AttachmentProcessor processor) {
this.renderer = renderer;
this.processor = processor;
}
/**
* Processes the HTTP request and adds an attachment to the Allure Attachment processor.
*
* @param request the HTTP request
* @param entity the entity details
* @param context the HTTP context
*/
@Override
public void process(final HttpRequest request,
final EntityDetails entity,
final HttpContext context) {
final String attachmentName = getAttachmentName(request);
final HttpRequestAttachment.Builder builder = create(attachmentName, request.getRequestUri());
builder.setMethod(request.getMethod());
Stream.of(request.getHeaders()).forEach(header -> builder.setHeader(header.getName(), header.getValue()));
if (entity instanceof HttpEntity && ((HttpEntity) entity).isRepeatable() && entity.getContentLength() != 0) {
builder.setBody(AllureHttpEntityUtils.getBody((HttpEntity) entity));
}
processor.addAttachment(builder.build(), renderer);
}
private String getAttachmentName(final HttpRequest request) {
return String.format("Request_%s_%s", request.getMethod(), request.getRequestUri());
}
}