Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,20 @@
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;

public class NameUtils {
public final class NameUtils {

private NameUtils() { }

public static String getOuterClassesAsPrefix(Element element) {
var prefix = new StringBuilder("$");
var parent = element.getEnclosingElement();
var prefixBuilder = (element.getSimpleName().toString().startsWith("$"))
? new StringBuilder()
: new StringBuilder("$");
while (parent.getKind() != ElementKind.PACKAGE) {
prefix.insert(1, parent.getSimpleName().toString() + "_");
prefixBuilder.insert(1, parent.getSimpleName().toString() + "_");
parent = parent.getEnclosingElement();
}
return prefix.toString();
return prefixBuilder.toString();
}

public static String generatedType(Element from, String postfix) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,13 @@ public ContentRange contentRange() {

return new ContentRange(firstPosition, lastPosition, completeLength);
}

@Override
public String toString() {
return "HttpClientResponseS3{code=" + code() +
", bodyLength=" + ((rs.body() != null) ? rs.body().contentLength() : -1) +
", bodyType=" + ((rs.body() != null) ? rs.body().contentType() : -1) +
", headers=" + rs.headers().size() +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,12 @@ private MethodSpec buildConstructor(TypeSpec.Builder tb, TypeElement element, Li
var packageName = this.processingEnv.getElementUtils().getPackageOf(element).getQualifiedName().toString();
var configClassName = HttpClientUtils.configName(element);
var annotation = Objects.requireNonNull(AnnotationUtils.findAnnotation(element, httpClientAnnotation));
var configPath = AnnotationUtils.<String>parseAnnotationValueWithoutDefault(AnnotationUtils.findAnnotation(element, httpClientAnnotation), "value");
if (configPath == null || configPath.isBlank()) {
var lowercaseName = new StringBuilder(element.getSimpleName());
lowercaseName.setCharAt(0, Character.toLowerCase(lowercaseName.charAt(0)));
configPath = "httpClient." + lowercaseName;
}
var telemetryTag = AnnotationUtils.<TypeMirror>parseAnnotationValueWithoutDefault(annotation, "telemetryTag");
var httpClientTag = AnnotationUtils.<TypeMirror>parseAnnotationValueWithoutDefault(annotation, "httpClientTag");
var clientParameter = ParameterSpec.builder(httpClient, "httpClient");
Expand Down Expand Up @@ -662,7 +668,7 @@ record Interceptor(TypeName type, @Nullable AnnotationSpec tag) {}
var name = method.getSimpleName();
var httpRoute = AnnotationUtils.findAnnotation(method, HttpClientClassNames.httpRoute);
var httpPath = AnnotationUtils.parseAnnotationValueWithoutDefault(httpRoute, "path");
builder.addCode("var $L = config.apply(httpClient, $T.class, $S, config.$L(), telemetryFactory, $S);\n", name, element, name, name, httpPath);
builder.addCode("var $L = config.apply(httpClient, $S, $T.class, $S, config.$L(), telemetryFactory, $S);\n", name, configPath, element, name, name, httpPath);
builder.addCode("this.$LUriTemplate = $L.url();\n", name, name);
var hasUriParameters = methodData.parameters().stream().anyMatch(p -> p instanceof Parameter.QueryParameter || p instanceof Parameter.PathParameter);
if (!hasUriParameters) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public JavaFile generate(TypeElement element) {
lowercaseName.setCharAt(0, Character.toLowerCase(lowercaseName.charAt(0)));
var packageName = this.elements.getPackageOf(element).getQualifiedName().toString();

var configPath = AnnotationUtils.<String>parseAnnotationValueWithoutDefault(AnnotationUtils.findAnnotation(element, httpClientAnnotation), "configPath");
var configPath = AnnotationUtils.<String>parseAnnotationValueWithoutDefault(AnnotationUtils.findAnnotation(element, httpClientAnnotation), "value");
if (configPath == null || configPath.isBlank()) {
configPath = "httpClient." + lowercaseName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ protected TestObject compileClient(List<Object> arguments, @Language("java") Str
var clientClass = compileResult.loadClass("$TestClient_ClientImpl");
var durationCVE = new DurationConfigValueExtractor();
var telemetryCVE = new $HttpClientTelemetryConfig_ConfigValueExtractor(
new $HttpClientTelemetryConfig_HttpClientLoggerConfig_ConfigValueExtractor(new SetConfigValueExtractor<>(new StringConfigValueExtractor())),
new $HttpClientTelemetryConfig_HttpClientLoggerConfig_ConfigValueExtractor(new SetConfigValueExtractor<>(new StringConfigValueExtractor()), new SizeConfigValueExtractor()),
new $HttpClientTelemetryConfig_HttpClientTracingConfig_ConfigValueExtractor(new MapConfigValueExtractor<>(new StringConfigValueExtractor())),
new $HttpClientTelemetryConfig_HttpClientMetricsConfig_ConfigValueExtractor(new DurationArrayConfigValueExtractor(new DurationConfigValueExtractor()), new MapConfigValueExtractor<>(new StringConfigValueExtractor()))
);
Expand All @@ -77,7 +77,7 @@ protected TestObject compileClient(List<Object> arguments, @Language("java") Str
);
var operationConfigCVE = new $HttpClientOperationConfig_ConfigValueExtractor(durationCVE, operationTelemetryCVE);

var configValueExtractor = (ConfigValueExtractor<?>) newObject("$$TestClient_Config_ConfigValueExtractor", telemetryCVE, operationConfigCVE, durationCVE);
var configValueExtractor = (ConfigValueExtractor<?>) newObject("$TestClient_Config_ConfigValueExtractor", telemetryCVE, operationConfigCVE, durationCVE);
var config = configValueExtractor.extract(MapConfigFactory.fromMap(Map.of(
"url", "http://test-url:8080"
)).root());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class BlockingApiTest extends AbstractHttpClientTest {
@Test
public void testComponentAnnotationPreserved() {
var client = compileClient(List.of(), """
import io.koraframework.common.Component;@Component
@Component
@HttpClient
public interface TestClient {
@HttpRoute(method = "POST", path = "/test")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class HttpClientCommonTest extends AbstractHttpClientTest {
public void testMethodAopAnnotationPreserved() {
var mapper = mock(HttpClientResponseMapper.class);
var client = compileClient(List.of(mapper), """
import io.koraframework.common.Component;@Component
@Component
@HttpClient
public interface TestClient {

Expand All @@ -37,7 +37,7 @@ public void testMethodArgumentsAnnotationPreserved() {
var requestMapper = mock(HttpClientRequestMapper.class);
var responseMapper = mock(HttpClientResponseMapper.class);
var client = compileClient(List.of(requestMapper, responseMapper), """
import io.koraframework.common.Component;@Component
@Component
@HttpClient
public interface TestClient {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.koraframework.http.client.common;

import org.jspecify.annotations.Nullable;
import io.koraframework.config.common.annotation.ConfigValueExtractor;
import org.jspecify.annotations.Nullable;

import java.net.URI;
import java.time.Duration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import io.koraframework.http.client.common.request.mapper.HttpClientParameterWriterModule;
import io.koraframework.http.client.common.request.mapper.HttpClientRequestMapperModule;
import io.koraframework.http.client.common.response.HttpClientResponseMapperModule;
import io.koraframework.http.client.common.telemetry.impl.DefaultHttpClientBodyConverter;
import io.koraframework.http.client.common.telemetry.impl.DefaultHttpClientTelemetryFactory;
import io.micrometer.core.instrument.MeterRegistry;
import io.opentelemetry.api.trace.Tracer;
Expand All @@ -19,7 +20,9 @@ default HttpClientConfig httpClientConfig(Config config, ConfigValueExtractor<Ht
}

@DefaultComponent
default DefaultHttpClientTelemetryFactory defaultHttpClientTelemetryFactory(@Nullable Tracer tracer, @Nullable MeterRegistry meterRegistry) {
return new DefaultHttpClientTelemetryFactory(tracer, meterRegistry);
default DefaultHttpClientTelemetryFactory defaultHttpClientTelemetryFactory(@Nullable Tracer tracer,
@Nullable MeterRegistry meterRegistry,
@Nullable DefaultHttpClientBodyConverter bodyLogger) {
return new DefaultHttpClientTelemetryFactory(tracer, meterRegistry, bodyLogger);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
* <hr>
* <b>English</b>: Specifies the configuration path of the HTTP client
*/
String configPath() default "";
String value() default "";

/**
* @return <b>Русский</b>: Теги {@link Tag} для собственной телеметрии
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.koraframework.http.client.common.auth;

import org.jspecify.annotations.Nullable;
import io.koraframework.http.client.common.request.HttpClientRequest;
import org.jspecify.annotations.Nullable;

/**
* <b>Русский</b>: Интерфейс для предоставление токена авторизации при запроса HTTP клиента
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package io.koraframework.http.client.common.declarative;

import org.jspecify.annotations.Nullable;
import io.koraframework.http.client.common.HttpClient;
import io.koraframework.http.client.common.interceptor.TelemetryInterceptor;
import io.koraframework.http.client.common.telemetry.HttpClientTelemetryConfig;
import io.koraframework.http.client.common.telemetry.HttpClientTelemetryFactory;
import org.jspecify.annotations.Nullable;

import java.time.Duration;

Expand All @@ -17,7 +17,7 @@ public interface DeclarativeHttpClientConfig {
@Nullable
Duration requestTimeout();

default DeclarativeHttpClientOperationData apply(HttpClient root, Class<?> clientClass, String operationName, HttpClientOperationConfig operationConfig, HttpClientTelemetryFactory telemetryFactory, String operationPath) {
default DeclarativeHttpClientOperationData apply(HttpClient root, String clientName, Class<?> clientClass, String operationName, HttpClientOperationConfig operationConfig, HttpClientTelemetryFactory telemetryFactory, String operationPath) {
var builder = root;
var url = this.url() + operationPath;
var requestTimeout = (this.requestTimeout() == null)
Expand All @@ -29,7 +29,7 @@ default DeclarativeHttpClientOperationData apply(HttpClient root, Class<?> clien
}
var telemetryConfig = new HttpClientOperationTelemetryConfig(telemetry(), operationConfig.telemetry());

var telemetry = telemetryFactory.get(telemetryConfig, clientClass.getCanonicalName() + "." + operationName);
var telemetry = telemetryFactory.get(clientName, clientClass.getCanonicalName() + "." + operationName, telemetryConfig);
if (telemetry != null) {
builder = builder.with(new TelemetryInterceptor(telemetry));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.koraframework.http.client.common.declarative;

import org.jspecify.annotations.Nullable;
import io.koraframework.http.client.common.HttpClient;
import org.jspecify.annotations.Nullable;

import java.time.Duration;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.koraframework.http.client.common.declarative;

import org.jspecify.annotations.Nullable;
import io.koraframework.config.common.annotation.ConfigValueExtractor;
import org.jspecify.annotations.Nullable;

import java.time.Duration;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.koraframework.http.client.common.declarative;

import io.koraframework.http.client.common.telemetry.HttpClientTelemetryConfig;
import org.jspecify.annotations.Nullable;

import java.time.Duration;
import java.util.Map;
Expand Down Expand Up @@ -66,8 +67,9 @@ public String mask() {
return Objects.requireNonNullElse(this.operation.mask(), this.client.mask());
}

@Nullable
@Override
public boolean pathTemplate() {
public Boolean pathTemplate() {
var operation = this.operation.pathTemplate();
if (operation != null) {
return operation;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package io.koraframework.http.client.common.exception;

public class HttpClientUnknownException extends HttpClientException {

public HttpClientUnknownException(Throwable cause) {
super(cause);
}

public HttpClientUnknownException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import io.koraframework.http.client.common.request.HttpClientRequest;
import io.koraframework.http.client.common.response.HttpClientResponse;
import io.koraframework.http.common.cookie.Cookie;

import java.util.Objects;

public final class ApiKeyHttpClientInterceptor implements HttpClientInterceptor {

private final String parameterName;
private final String secret;
private final ApiKeyLocation parameterLocation;
Expand All @@ -25,7 +27,7 @@ public HttpClientResponse processRequest(InterceptChain chain, HttpClientRequest
var modifiedRequest = switch (this.parameterLocation) {
case HEADER -> request.toBuilder().header(this.parameterName, this.secret);
case QUERY -> request.toBuilder().queryParam(this.parameterName, this.secret);
case COOKIE -> throw new IllegalStateException("TODO: cookies");
case COOKIE -> request.toBuilder().header("Cookie", Cookie.of(this.parameterName, this.secret).toValue());
};

return chain.process(modifiedRequest.build());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package io.koraframework.http.client.common.interceptor;

import io.opentelemetry.context.Context;
import io.koraframework.common.telemetry.Observation;
import io.koraframework.common.telemetry.OpentelemetryContext;
import io.koraframework.http.client.common.request.HttpClientRequest;
import io.koraframework.http.client.common.response.HttpClientResponse;
import io.koraframework.http.client.common.telemetry.HttpClientTelemetry;
import io.opentelemetry.context.Context;

public class TelemetryInterceptor implements HttpClientInterceptor {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ private EncoderUtils() {}


/**
* @param s {@code String} to be translated.
* @param charset the given charset
* @param s {@code String} to be translated.
* @param charset the given charset
* @param disableEncodeSpaceToPlus disable encoding space as + char
* @return the translated {@code String}.
* @return the translated {@code String}.
* @throws NullPointerException if {@code s} or {@code charset} is {@code null}.
*/
public static String encode(String s, Charset charset, boolean disableEncodeSpaceToPlus) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package io.koraframework.http.client.common.request;

import org.jspecify.annotations.Nullable;
import io.koraframework.http.common.HttpMethod;
import io.koraframework.http.common.body.HttpBodyOutput;
import io.koraframework.http.common.header.MutableHttpHeaders;
import org.jspecify.annotations.Nullable;

import java.net.URI;
import java.time.Duration;
Expand All @@ -27,12 +27,12 @@ default HttpClientRequestBuilder toBuilder() {
return new HttpClientRequestBuilderImpl(this);
}

static HttpClientRequest of(String method, URI uri, String uriTemplate, MutableHttpHeaders headers, HttpBodyOutput body, Duration requestTimeout) {
return new DefaultHttpClientRequest(method, uri, uriTemplate, headers, body, requestTimeout);
static HttpClientRequest of(String method, URI uri, String uriTemplate, MutableHttpHeaders headers, HttpBodyOutput body, @Nullable Duration requestTimeout) {
return new SimpleHttpClientRequest(method, uri, uriTemplate, headers, body, requestTimeout);
}

static HttpClientRequestBuilder get(String path) {
return new HttpClientRequestBuilderImpl(HttpMethod.GET, path);
static HttpClientRequestBuilder get(String uriTemplate) {
return new HttpClientRequestBuilderImpl(HttpMethod.GET, uriTemplate);
}

static HttpClientRequestBuilder head(String uriTemplate) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public HttpClientRequestBuilderImpl(HttpClientRequest httpClientRequest) {
public HttpClientRequest build() {
var resolved = resolveUri(this.fromUri, this.uriTemplate, this.pathParams, this.queryParams);

return new DefaultHttpClientRequest(
return new SimpleHttpClientRequest(
this.method,
resolved.uri,
resolved.uriTemplate,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
package io.koraframework.http.client.common.request;

import org.jspecify.annotations.Nullable;
import io.koraframework.http.common.body.HttpBodyOutput;
import io.koraframework.http.common.header.MutableHttpHeaders;
import org.jspecify.annotations.Nullable;

import java.net.URI;
import java.time.Duration;
import java.util.Objects;

public record DefaultHttpClientRequest(
String method,
URI uri,
String uriTemplate,
MutableHttpHeaders headers,
HttpBodyOutput body,
@Nullable Duration requestTimeout
) implements HttpClientRequest {
record SimpleHttpClientRequest(String method,
URI uri,
String uriTemplate,
MutableHttpHeaders headers,
HttpBodyOutput body,
@Nullable Duration requestTimeout) implements HttpClientRequest {

public DefaultHttpClientRequest {
public SimpleHttpClientRequest {
Objects.requireNonNull(method);
Objects.requireNonNull(uri);
Objects.requireNonNull(headers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public final class MultipartWriterUtils {

private static final byte[] RN_BUF = "\r\n".getBytes(StandardCharsets.US_ASCII);

private MultipartWriterUtils() { }
private MultipartWriterUtils() {}

public static HttpBodyOutput write(List<? extends FormMultipart.FormPart> parts) {
return write("blob:" + UUID.randomUUID(), parts);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
public final class FormUrlEncodedClientRequestMapper implements HttpClientRequestMapper<FormUrlEncoded> {
@Override
public HttpBodyOutput apply(FormUrlEncoded form) {
try(var writer = new FormUrlEncodedWriter()) {
try (var writer = new FormUrlEncodedWriter()) {
for (var part : form) {
for (var value : part.values()) {
writer.add(part.name(), value);
Expand Down
Loading
Loading